如何在PHP中将PDF文档转换为预览图像?

219

需要哪些库、扩展等来将PDF文档的一部分渲染为图像文件?

大多数我找到的 PHP PDF 库都集中于创建 PDF 文档,但是否有一种简单的方法可以将文档渲染为适合在 Web 上使用的图像格式?

我们的环境是 LAMP 堆栈。


我很想能够做到这一点,并且使文件具有.jpg扩展名。我尝试了.htaccessAddHandler方法,但它没有起作用。 - Keyslinger
Ubuntu的替代选择:https://askubuntu.com/q/50170/238253 - Avatar
10个回答

248
你需要安装ImageMagickGhostScript
<?php
$im = new imagick('file.pdf[0]');
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

"

这个[0]代表着第一页

"

12
是的,它有效。您还可以这样做:例如,$im->setResolution( 300, 300 ),以期望的分辨率呈现您的PDF。 - Luis Melgratti
6
我还没有尝试过,但如果您正在使用Google文档,并且不介意使用iFrame,那么这个建议可能有效(它也是一个WordPress插件)。https://forrst.com/posts/PDF_thumbnails_with_Google_Docs-6G6 - David Hobs
6
如何在 PHP 文件中包含 ImageMagick 和 GhostScript? - namratha
3
@think123 使用 $im->thumbnailImage(1500, 0); 这段代码,可以将你的 JPG 图片设置为宽度为 1500,并保持比例缩放。参见文档 - Kevin Jantzer
3
如果你从 blob 中加载 PDF 文件,以下是获取第一页而不是最后一页的方法:$im->readimageblob($blob); $im->setiteratorindex(0); - jrjohnson
显示剩余12条评论

38

对于那些没有ImageMagick的人,GD函数也可以与GhostScript一起使用。使用exec()运行ghostscript命令将PDF转换为JPG,并使用imagecreatefromjpeg()处理生成的文件。

运行ghostscript命令:

exec('gs -dSAFER -dBATCH -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r300 -sOutputFile=whatever.jpg input.pdf')

要进行操作,需要创建一个新的占位图像,$newimage = imagecreatetruecolor(...),并引入当前图像。$image = imagecreatefromjpeg('whatever.jpg'),然后可以使用imagecopyresampled()来改变大小,或者使用任意数量内置的非imagemagick命令。


3
要仅获取第一页的图像,请在命令中添加开关“-dFirstPage=1 -dLastPage=1”。 - Tim Dearborn
如果仍然无法正常工作,您可能需要提供gs二进制文件的完整路径。 - craned
这看起来像是在运行系统命令。如果用户上传了一个名为 something;rm -rf / 的文件会怎样? - iProgram
如果我想将PDF的所有页面转换为图像,应该怎么做? - Dhara

33

您还可以使用以下方式获取页面数:

$im->getNumberImages();

然后您可以使用循环创建所有页面的缩略图,例如:

'file.pdf['.$x.']'

35
(这实际上应该是对Paolo Bergantino答案的评论) - Simon East
聪明的答案。不是别人给出的,而是你注意并写下来的。 - Ashu Kumar

18

使用php扩展Imagick。 要控制想要的光栅输出图像的大小,请使用setResolution函数

<?php    
$im = new Imagick();
$im->setResolution(300, 300);     //set the resolution of the resulting jpg
$im->readImage('file.pdf[0]');    //[0] for the first page
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

(在Paolo Bergantino的回答和Luis Melgratti的评论上进行扩展。您需要在加载图像之前设置分辨率。)


11
如果您正在从 blob 中加载 PDF,则可以使用以下方法获取第一页而不是最后一页:
$im->readimageblob($blob);
$im->setiteratorindex(0);

10
(这实际上应该是对Paolo Bergantino答案的评论) - Simon East

10

你也可以尝试执行随 Imagemagick 一起提供的 'convert' 工具。

exec("convert pdf_doc.pdf image.jpg");
echo 'image-0.jpg';

3
建议使用 pdf_doc.pdf[0] 替代 pdf_doc.pdf。 - John Kurlak
1
convert 是 ImageMagick 软件包的一部分;请尝试使用 sudo yum install ImageMagick 进行安装。 - Jack Miller
如果仍然无法正常工作,您可能需要提供到“convert”二进制文件的完整路径。 - craned
1
echo 'image-0.jpg'; 返回一个字符串。 - suz

5
我是PDFlib的作者,它是php的GhostScript包装器。使用这个库的优点是,它已经经过测试,不需要ImageMagic
在处理pdf时,始终使用GhostScript命令比ImageMagic更快,因此您应该选择GhostScript包装器或纯GhostScript命令。
$pdflib = new ImalH\PDFLib\PDFLib();
$pdflib->setPdfPath($pdf_file_path);
$pdflib->setOutputPath($folder_path_for_images);
$pdflib->convert();

你好,我正在使用你们的PDFlib从PDF中创建PNG文件。$pdflib = new ImalH\PDFLib\PDFLib(); $pdflib->setPdfPath($pdf_file_path); $pdflib->setOutputPath($folder_path_for_images); $pdflib- >setImageFormat(\ImalH\PDFLib\PDFLib::$IMAGE_FORMAT_PNG); $pdflib->setDPI(100); $pdflib->setPageRange(1,$pdflib->getNumberOfPages()); $pdflib->convert(); PDFlib是否有设置所创建PNG文件的宽度和高度的选项? - WGS
你好,PDFLib并没有提供操作图像的方法,但你可以这样做。一旦你使用PDFLib生成了PNG文件,你可以使用另一个图像处理库,比如https://github.com/Treinetic/ImageArtist来完成你的工作... - imal hasaranga perera
请尝试我建议的上述方法,但如果仍然遇到困难,请发送电子邮件至imal@treinetic.com,我将为您提供示例代码...干杯!! - imal hasaranga perera
我会尝试一下。谢谢建议。 - WGS

5

如果我想在服务器上显示预览图像,我们该如何使用它? - chithra
1
你可能想看一下这个:https://github.com/scandel/pdfThumbnails。 我认为你可以在这里上传生成的图像缩略图和实际文件并保存,这样你将节省更多服务器计算时间(因为缩略图处理是在客户端计算机上完成的)。 - sajed zarrinpour
只接收和允许图像文件比在不受信任的PDF上使用ImageMagick更安全。 - Avatar
这个解决方案唯一的问题是:所需的pdf.min.js文件大小为328 KB。 - Avatar

3

我安装完成了!它可以正常工作!

你可能需要在Windows上执行基本的安装imagemagick

php(本地)中使用调用exec(<command line>) 例如:

<?php
$pdf = "filename.pdf";
$info = pathinfo($pdf);
$file_name =  basename($pdf,'.'.$info['extension']);
echo $file_name;
$pdf = "filename.pdf[0]";
exec("convert $pdf convert-img/$file_name.jpg");    
?>

此外,您可以在PHP Imagick class中使用class imagick。感谢所有帮助我的人!

1
这是我写过并在几个项目中使用的一个简单类。它只是包装了imagick并处理将每个页面写入磁盘的操作。如果有人仍在寻找一种简单的方法来实现这一点,这个链接可能会有所帮助。

3
在StackOverflow上,仅包含链接的回答价值较低,因为如果链接被移动或失效,那么该回答就变得毫无用处。为了改进你的回答,你应该在这里将大部分解决方案硬编码。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接