【问题标题】:Creating PDF thumbnail in PHP and caching it在 PHP 中创建 PDF 缩略图并缓存它
【发布时间】:2015-09-04 20:59:24
【问题描述】:

我正在使用基于 PHP 的通用 CMS,我想创建一个脚本来读取 pdf 创建一个缩略图并缓存它。有很多不同的答案,我确实在不同版本的 imagick 上遇到了一些问题,但这是对我有用的脚本。

有些人可能会觉得它很有用,如果优化了,也许有人可以给我建议?

<?php

$loc = *the file location*;
$pdf = *the file name*;
$format = "jpg";
$dest = "$loc$pdf.$format";

if (file_exists($dest))
        {
        $im = new imagick();
        $im->readImage($dest);
        header( "Content-Type: image/jpg" );
        echo $im;
        exit;
        }
else
    {
        $im = new imagick($loc.$pdf.'[0]');
        $im->setImageFormat($format);

        $width = $im->getImageheight();
        $im->cropImage($width, $width, 0, 0);
        $im->scaleImage(110, 167, true);

        $im->writeImage($dest);

        header( "Content-Type: image/jpg" );
        echo $im;
        exit;
    }

?>

【问题讨论】:

    标签: php pdf imagick


    【解决方案1】:

    利用 PHP 和 ImageMagick 创建 PDF 缩略图

    http://stormwarestudios.com/articles/leverage-php-imagemagick-create-pdf-thumbnails/

    在本文中,我们将讨论使用 PHP 和 ImageMagick 从给定的 PDF 生成缩略图,将它们存储在临时(或“缓存”)目录中,并将它们提供给网络。

    我们最近的一个客户请求显示通过我们为他们部署的 Joomla CMS 发布的 PDF 缩略图。

    需求相当简单,但执行起来有点复杂。在安装 ImageMagick、ImageMagick PHP 绑定(顺便说一句不工作,并设计了一种解决方法)并侦查了一些代码之后,确定了以下解决方案:

    <?php
    function thumbPdf($pdf, $width)
    {
        try
        {
            $tmp = 'tmp';
            $format = "png";
            $source = $pdf.'[0]';
            $dest = "$tmp/$pdf.$format";
    
            if (!file_exists($dest))
            {
                $exec = "convert -scale $width $source $dest";
                exec($exec);
            }
    
            $im = new Imagick($dest);
            header("Content-Type:".$im->getFormat());
            echo $im;
        }
        catch(Exception $e)
        {
            echo $e->getMessage();
        }
    }
    
    $file = $_GET['pdf'];
    $size = $_GET['size'];
    if ($file && $size)
    {
        thumbPdf($file, $size);
    }
    ?>
    

    上面的代码假设你已经为临时目录提供了适当的权限(通常是 chmod 755 或 chmod 777,取决于你的胆量),你已经将上面的代码 sn-p 保存在一个名为 thumbPdf 的文件中.php,并将其放置在您的网络服务器上可见的某个位置。

    从 GET 获取参数后,代码检查目标临时目录,如果所需的图像不存在,它使用 ImageMagick 的转换程序生成 PDF 缩略图,缩小到适当的比例,并将图像保存在临时目录。最后,它将缩略图重新加载到 ImageMagick PHP 对象中,并将内容输出到浏览器。

    调用上述代码相当容易;只需从图像标签内调用 PHP 脚本,如下所示:

    <img src="/path/to/thumbPdf.php?pdf=your.pdf&size=200" />
    

    上面的代码将从“your.pdf”的第一页生成一个缩略图,大小为 200 像素宽和适当比例的高度。

    祝你好运,网站管理员快乐!

    【讨论】:

    • 这是一个足够简单的解决方案。调用命令行函数而不是 PHP 扩展有什么好处吗?那么在没有任何服务器端验证的情况下调用 get 变量是否存在任何安全问题?
    【解决方案2】:

    我知道这里已经讨论过了:

    Should I use a PHP extension for ImageMagick or just use PHP's Exec() function to run the terminal commands?

    引用draw101:

    使用 PHP 扩展而不是使用 exec 会受益匪浅 或类似的功能。内置扩展会更快,使用更少 内存,因为您不必生成新进程并读取输出 背部。图像对象将直接在 PHP 中可用,而不是 必须读取文件输出,这应该使图像更容易 一起工作。

    如果您有一个繁忙的网站,创建大量的图像编辑过程可能 开始减慢速度并消耗额外的内存。

    【讨论】:

      【解决方案3】:

      如果您由于某种原因没有安装 Imagick php 库,您可以使用 ghost 脚本并使用以下示例生成 pdf 的缩略图:

      exec('gs -dSAFER -dBATCH -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r300 -sOutputFile=xyz.jpg xyz.pdf');
      

      【讨论】:

      • 如果您在 bash 中运行该命令,您会为每个页面获得一个 press &lt;return&gt; to continue。为避免这种情况,您需要 -dNOPAUSE 标志。所以gs -dSAFER -dBATCH -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dNOPAUSE -r300 -sOutputFile=xyz.jpg xyz.pdf
      猜你喜欢
      • 2011-08-05
      • 2013-10-22
      • 2011-02-20
      • 2017-06-04
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      相关资源
      最近更新 更多