使用 ImageMagick 从 PDF 创建图像.有效


Using ImageMagick to create an image from a PDF...efficiently

我正在使用ImageMagick为已经上传的PDF创建一个微小的JPG缩略图。代码工作正常。这是一个WordPress小部件,尽管这不一定是WordPress特定的。

我不熟悉 ImageMagick,所以我希望有人能告诉我这看起来很糟糕,或者没有遵循某种最佳实践,或者我是否有使服务器崩溃的风险。

具体来说,我的问题是:

  • 该图像是否已缓存,还是服务器必须在每次有人查看页面时重新生成图像?如果未缓存,确保服务器不必重新生成缩略图的最佳方法是什么?
  • 我试图为 ImageMagick 创建一个单独的文件夹 (/thumbs) 来放置所有图像,而不是用 PDF 的图像弄乱 WP 上传文件夹。尽管在我的测试环境中对该文件夹有 777 个权限,但它一直抛出权限错误。为什么?源/目标目录是否必须相同?
  • 我在这里做的任何错误/低效的事情需要改进吗?

整个小部件位于Pastebin上:http://pastebin.com/WnSTEDm7

相关代码:

<?php
if ( $url ) {       
    $pdf = $url;
    $info = pathinfo($pdf);
    $filename =  basename($pdf,'.'.$info['extension']);
    $uploads = wp_upload_dir();
    $file_path = str_replace( $uploads['baseurl'], $uploads['basedir'], $url );
    $dest_path = str_replace( '.pdf', '.jpg', $file_path );
    $dest_url = str_replace( '.pdf', '.jpg', $pdf );
    exec("convert '"{$file_path}[0]'" -colorspace RGB -geometry 60 $dest_path"); ?>
    <div class="entry">
        <div class="widgetImg">
            <p><a href="<?php echo $url; ?>" title="<?php echo $filename; ?>"><?php echo "<img src='".$dest_url."' alt='".$filename."' class='blueBorder' />"; ?></a></p>
        </div>
        <div class="widgetText">
            <?php echo wpautop( $desc ); ?>
            <p><a class="downloadLink" href="<?php echo $url; ?>" title="<?php echo $filename; ?>">Download</a></p>
        </div>
    </div>
    <?php }
?>

如您所见,该小部件抓取附加到当前正在查看的页面的任何PDF,创建PDF第一页的图像,存储它,然后以HTML形式链接到它。

感谢您的任何帮助!

当您另存为 jpg 时,请尝试将 -define 添加到您的代码中:

exec("convert -define jpeg:size=60x60 '"{$file_path}[0]'" -colorspace RGB -geometry 60 $dest_path"); ?> 

60x60 是图像的最终大小 - 它所做的只是读取足够的数据来创建图像,从而加快读取过程。

调整保持宽高比,然后裁剪为 60x60

exec("convert -define jpeg:size=60x60 '"{$file_path}[0]'" -colorspace RGB -thumbnail 60x60 -gravity center -crop 60x60+0+0 +repage $dest_path"); ?> 

所以我认为ImageMagick在每个页面视图上重新生成缩略图。带有此小部件的页面将需要额外的几秒钟才能加载。

因此,它现在进行简单的检查以查看缩略图是否已经存在:

if ( !file_exists( $dest_path ) ) {
    exec("convert '"{$file_path}[0]'" -colorspace RGB -geometry 60 $dest_path");
};

加载需要 ~5 秒的页面现在需要 2-3 秒。

无论如何,我仍然有兴趣知道是否有任何PHP人认为这可以做得更好。

希望这段代码对某人有所帮助。