【问题标题】:Display custom error message in pdf thumbnail creation - PHP - Imagick在 pdf 缩略图创建中显示自定义错误消息 - PHP - Imagick
【发布时间】:2011-06-29 11:51:44
【问题描述】:

我在我的 Windows PC 上运行带有 PHP5 的 Apache。我已经成功配置了 Ghostscript 和 Image 魔术。我有一个生成pdf缩略图的脚本,如下所示;

<?php
$file = 'test.pdf';
$page = 1;
$pdfpage = $page - 1;
$nh = 200;
$nw = 200;

$im = new imagick(realpath($file)."[$pdfpage]");
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat("jpeg");
$im->sampleImage($nw,$nh);
$im->writeImage("test.jpg");
echo "true";
?>

这对我很有用。该脚本生成与$page 变量对应的页面缩略图。但是,如果页码超过文档中可用的页数,这将不起作用。我想要的是显示或回显"false",如果输入变量超过 PDF 文件中的可用页数,或者 imagick 函数运行起来有些困难。我该怎么做?

【问题讨论】:

    标签: php imagemagick imagick


    【解决方案1】:

    理论上,您可以使用-format 参数到identify 命令的%n 变量来查找一个页面的数量('frames', 'images')给定文件,包括 PDF,您运行主命令之前。这样您就可以使用结果将正确的值填充到您的主命令中,这样您就不会首先收到错误消息:

    identify -format %n some.pdf
    

    实践中,这可能非常慢(因为 ImageMagick 似乎首先呈现完整的 PDF 以计算页数)。

    因此,我的建议是使用外部命令行工具来获取 PDF 页数:pdfinfo。这个工具专门用于 PDF 文件,它知道在哪里查找这些信息(因为这个数字是任何 PDF 文件所需元数据的一部分,pdfinfo 不需要先渲染每一页,然后才能吐出信息):

    pdfinfo some.pdf | grep Pages:
    pdfinfo some.pdf | grep Pages: | awk '{print $2}'
    

    只是为了让您看到这两个命令的不同性能级别,我确实针对包含 PDF-1.7 的官方 ISO 32000 规范的文件运行了它:

    time identify  -format %n ~/Downloads/PDF32000_2008.pdf 
    756
    
    real  0m51.902s
    user  0m50.133s
    sys   0m1.090s
    
    
    time pdfinfo ~/Downloads/PDF32000_2008.pdf | grep Pages: | awk '{print $2}'
    756
    
    real  0m0.138s
    user  0m0.041s
    sys   0m0.016s
    

    因此,756 页 PDF 文档的性能差异为 51.9 秒与 0.138 秒(或 376:1)。

    我还测试了一个 12 页的 PDF 文件。这里的性能比是 31:1。 1 页的 PDF 显示 10:1 -- 全部赞成pdfinfo

    旧的 IT 口号:'使用正确的工具完成工作......'

    【讨论】:

      【解决方案2】:
      $file        = 'test.pdf';
      $total_pages = 1; // Probably should already know pages but if you don't, you can find out with imagick
      $pdfpage     = $page - 1;
      $nh          = 200;
      $nw          = 200;
      
      try {
          for($current_page = $total_pages; $current_page >= 0;$current_page--) {
              $im = new imagick(realpath($file)."[$pdfpage]");
              $im->setCompression(Imagick::COMPRESSION_JPEG);
              $im->setCompressionQuality(100);
              $im->setImageFormat("jpeg");
              $im->sampleImage($nw,$nh);
              $im->writeImage("test.jpg");
              if ($im->haspreviousimage()) { // Imagick reads pages in reverse order, thats why we're getting the previous image
                  $im->previousimage();
              } else {
                  break;
              }
          }
      } catch (ImagickException $e) {
          die('ImagickException ' . $e->getMessage());
      } catch (Exception $e) {
          die('Exception ' . $e->getMessage());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        相关资源
        最近更新 更多