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

时间:2012-06-11 10:16:20

标签: php wordpress pdf imagemagick jpeg

我正在使用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链接到它。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

当您以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"); ?> 

答案 1 :(得分:0)

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

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

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

加载约5秒钟的页面现在需要2-3个。

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

希望这段代码可以帮助别人。