4

我正在使用Imagick将 PDF 的第一页转换为 PNG 图像。它正在工作,但速度很慢。

大约 100kb 的 PDF 转换需要 8 到 20 秒。

有没有办法加快转换速度?

我的代码:

$im = new Imagick($url);
$im->setIteratorIndex(0);
$im->setCompression(Imagick::COMPRESSION_LZW);
$im->setCompressionQuality(90);
$im->setImageFormat("png");
$im->writeImage('C:/Shared/test.png');
4

2 回答 2

3

有没有办法加快转换速度?

当然,用更多的处理能力、更多的内存和更快的磁盘升级机器。

此外,您似乎使用的是 Windows 操作系统。我建议您切换到 Linux 系统并编译针对其运行的计算机架构优化的库。

于 2012-10-28T13:42:34.187 回答
3

事实上,我不需要 Imagick 库来生成 PDF 第一页的简单 JPG 预览,我只需要 GhostScript。

使用 GhostScript 进行命令行转换总是比 Imagick 快(命令行或通过 PHP)

12 页和 650kb 的示例:

  • 命令行 GhostScript => 0.6 秒
  • 命令行 Imagick => 0.8 秒
  • PHP 扩展 Imagick => 2.22 秒

对于一些文档,Imagick 需要 20 秒,而使用直接 GS 命令行则需要 1.5 秒。

这是我的测试脚本

   <?php

    $pathToPdf = realpath("in.pdf");

    $pathToJpg = "./out.jpg";
    $pathToPng = "./out.png";

    try
        {

        $time_start = microtime(true);      
        $gsCall = "\"C:\Program Files (x86)\gs\gs9.06\bin\gswin32.exe\" -q -dBATCH -dMaxBitmap=300000000 -dNOPAUSE -dSAFER -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dFirstPage=1 -dLastPage=1 -sOutputFile=\"{0}\" \"{1}\" -c quit";
        $gsCall = str_replace(array('{0}', '{1}'), array($pathToJpg, $pathToPdf), $gsCall); // or use sprintf
        $str = exec($gsCall, $output=array(), $returnValue);
        echo $gsCall.'<br><br>';
        $time_end = microtime(true);
        $time = $time_end - $time_start;        
        if($returnValue == 0)              
            print "<br><br>Conversion OK ".$time;
        else 
            print "<br><br>Conversion failed.<br />".var_dump($output);     

        $time_start = microtime(true);          
        exec('convert "'.$pathToPdf.'[0]" "'.$pathToPng.'"', $output, $returnValue);                        
        $time_end = microtime(true);
        $time = $time_end - $time_start;
        if($returnValue == 0)              
            print "<br><br>Conversion OK ".$time;
        else 
            print "<br><br>Conversion failed.<br />".var_dump($output);

        $time_start = microtime(true);
        $im = new Imagick($pathToPdf);
        $im->setIteratorIndex(0);
        $im->setCompression(Imagick::COMPRESSION_LZW);
        $im->setCompressionQuality(90);
        $im->setImageFormat("png");
        $im->writeImage('\\\\DELL-PC\Shared\test.png');
        //$im->thumbnailImage(200, 0);
        //echo $im;
        $time_end = microtime(true);
        $time = $time_end - $time_start;
        print "<br><br>Conversion OK ".$time;
    }
catch(Exception $e)
{
    echo $e->getMessage();
}
?>
于 2012-10-29T09:18:23.843 回答