【问题标题】:Using ImageMagick to create an image from a PDF...efficiently使用 ImageMagick 从 PDF 创建图像...高效
【发布时间】:2012-06-11 10:16:20
【问题描述】:

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

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

具体来说,我的问题是:

  • 该图像是否已缓存,或者服务器是否必须在每次有人查看该页面时重新生成该图像?如果它没有缓存,那么确保服务器不必重新生成缩略图的最佳方法是什么?
  • 我尝试为 ImageMagick 创建一个单独的文件夹 (/thumbs) 以将所有图像放入其中,而不是将 WP 上传文件夹与 PDF 图像混淆。尽管我的测试环境中的文件夹有 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 链接到它。

感谢您的帮助!

【问题讨论】:

    标签: php wordpress pdf imagemagick jpeg


    【解决方案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"); ?> 
    

    【讨论】:

    • 酷,谢谢你的建议。但是,它如何知道如何裁剪图像?我想要一个统一的缩略图大小,但我不相信该程序可以适当/可理解地裁剪内容。
    • 您的几何图形仍将按原样工作。我会用 -thumbnail 调整大小,然后裁剪 - 上面添加的代码。
    【解决方案2】:

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

    所以,它现在做一个简单的检查,看看缩略图是否已经存在:

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

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

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

    希望这段代码能帮助别人。

    【讨论】:

    • 也许你可以在上传完成后通过生成图像来提高速度。这样您的用户就不会因为图像生成而延迟。将此与一些标头管理结合起来,以防止浏览器在没有任何更改时重新下载图像,并且每个人都很高兴。
    • 抱歉,我应该更清楚一点:PDF 是由站点管理员从后端(WP 媒体库)添加的,而不是最终用户。该小部件仅显示由 ImageMagick 生成的 PDF 封面的 JPG,并为它们提供下载链接。
    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 2012-01-11
    • 2014-02-08
    • 2012-07-17
    • 2014-06-11
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多