使用 PHP(ghostscript) 将 PDF 转换为图像耗时太长

Posted

技术标签:

【中文标题】使用 PHP(ghostscript) 将 PDF 转换为图像耗时太长【英文标题】:Converting PDF to Images using PHP(ghostscript) taking too long 【发布时间】:2013-01-15 11:43:46 【问题描述】:

我有一个 php 脚本可以将 pdf 文件转换为一系列 jpeg 图像。

脚本如何实现这一点:

- Download pdf to local server.
- Create folders to place jpeg images, one folder for large images and one for small images.
- Extract images from pdfs to correct folders.
- Go through each of the files in the large folder and scale images to 1000 width.

这是我正在使用的代码的细分。

$outputfile = "filename";
$cmd = "wget -q \"$url\" -O books/$outputfile.pdf";
exec($cmd);

if(!is_dir("books/$outputfile")) mkdir("books/$outputfile");
if(!is_dir("books/large/")) mkdir("books/large/");
if(!is_dir("books/large/$outputfile")) mkdir("books/large/$outputfile");

set_time_limit(9000);

......................................................................
/* Skipped Code to figure out with & height of pdf: $width, $height */
......................................................................

/* Extract Images from PDF, once in a large size (first) and another at its original size */
exec("'gs' -o books/large/$outputfile/$outputfile-%06d.jpg -dDEVICEWIDTHPOINTS=$width -dDEVICEHEIGHTPOINTS=$height -dFIXEDMEDIA=true -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -dPDFFitPage=true -dUseCropBox=true -r300 -dJPEGQ=100 -dTextAlphaBits=4 'books/$outputfile.pdf'",$output1);
exec("'gs' -o books/$outputfile/$outputfile-%06d.jpg -dDEVICEWIDTHPOINTS=$width -dDEVICEHEIGHTPOINTS=$height -dFIXEDMEDIA=true -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -dPDFFitPage=true -dUseCropBox=true       -dJPEGQ=100 -dTextAlphaBits=4 'books/$outputfile.pdf'",$output2);

$directory = "/var/www/html/pdf/books/large/$outputfile/";
$d = dir($directory);
chdir($directory);

/* Scale image to be 1000px wide and auto height */
$largewidth = 1000;
$scale = 1000 / intVal($width);
$largeheight = intVal($height) * $scale;
while($entry = $d->read()) 
if($entry != "." && $entry != "..") 
    $size = getimagesize($entry);
    $fp = fopen($entry, "rb");
    if ($size && $fp) 
        $swidth = 1000;
        $scale = 1000 / intVal($size[0]);
        $sheight = intVal(intVal($size[1]) * $scale);

        $dimg = imagecreatetruecolor($swidth, $sheight);
        $simg = imagecreatefromjpeg($entry);

        imagecopyresampled($dimg,$simg,0,0,0,0,$swidth,$sheight,$size[0],$size[1]);
        imagejpeg($dimg,$entry,85);
    
    else 
        echo "fail";
    


$d->close();

问题在于将整个 pdf 转换为一系列图像需要将近一个小时。 pdf 通常有 300 到 500 页长。

在这段代码中有什么你们认为我可以更有效地做的吗?

最耗时的是在文件末尾,我浏览了大文件夹中的每个图像并将其缩小到 1000 宽度。

另外,我在此服务器上安装任何新的 php 扩展的权限有限,所以我认为 imagemagick 也是不可能的。

谢谢

【问题讨论】:

【参考方案1】:

由于您说大部分时间都花在缩放图像上,您可能希望让 Ghostscript 以所需的大小生成图像,而不是事后对其进行缩放。

同样缩放 JPEG 图像很可能会导致出现伪像。如果您必须缩放,则应避免使用 JPEG,直到最后一步。

请注意,我对 PHP 一无所知,因此无法对脚本发表评论。

【讨论】:

以上是关于使用 PHP(ghostscript) 将 PDF 转换为图像耗时太长的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的问题——PHP / ImageMagick / Ghostscript

PHP exec 错误,可能是 MAMP 使用 ghostscript

使用 GhostScript 将图像转换为 PDF

如何使用 ghostscript 将 PDF 转换为 PDF/A 或 PDF/X?

使用 Ghostscript 将 TIFF 转换为 PDF

Ghostscript将pdf转换为方向错误的pcl