【问题标题】:Convert PDF to JPEG with PHP and ImageMagick使用 PHP 和 ImageMagick 将 PDF 转换为 JPEG
【发布时间】:2012-03-02 21:02:59
【问题描述】:

我正在使用一个小脚本将 PDF 转换为 JPG。这行得通,但质量很差。

脚本:

$im = new imagick( 'document.pdf[ 0]' ); 
$im->setImageColorspace(255); 
$im->setResolution(300, 300);
$im->setCompressionQuality(95); 
$im->setImageFormat('jpeg'); 
$im->writeImage('thumb.jpg'); 
$im->clear(); 
$im->destroy();

还有一件事,我想保留 PDF 的原始大小,但转换会裁剪 JPG 的大小。

【问题讨论】:

    标签: php pdf imagemagick jpeg


    【解决方案1】:

    试试这个:

    HTML

    <html>
     
      <body>
     
        <form action="ConvertPdfToImg.php" enctype="multipart/form-data" method="post" name="f1">
     
          <input id="templateDoc" name="templateDoc" type="file" />
     
          <input type="submit" />
     
        </form>
     
      </body>
     
    </html>
    

    PHP

    $pdfAbsolutePath = __DIR__."/test.pdf";
     
    if (move_uploaded_file($_FILES['templateDoc']["tmp_name"], $pdfAbsolutePath)) {
     
          $im             = new imagick($pdfAbsolutePath);
     
          $noOfPagesInPDF = $im->getNumberImages(); 
     
          if ($noOfPagesInPDF) { 
     
              for ($i = 0; $i < $noOfPagesInPDF; $i++) { 
     
                  $url = $pdfAbsolutePath.'['.$i.']'; 
     
                  $image = new Imagick($url);
     
                  $image->setImageFormat("jpg"); 
     
                  $image->writeImage(__DIR__."/".($i+1).'-'.rand().'.jpg'); 
     
              }
     
              echo "All pages of PDF is converted to images";
     
          }
          echo "PDF doesn't have any pages";
     
    }
    

    【讨论】:

    • 您完全没有抓住重点,所有这些请求处理都与问题完全无关。而且您应该始终清楚地表明您指向的是您自己的博客。
    • 虽然这个上传文件和检查页面的答案不适合这个问题。它确实帮助我解决了“如何将 pdf 从 s3 加载到内存中然后查找第 1 页”的问题
    【解决方案2】:

    可以使用setResolution 完成,但您需要在加载图像之前完成。 试试这样的:

    // instantiate Imagick 
    $im = new Imagick();
    
    $im->setResolution(300,300);
    $im->readimage('document.pdf[0]'); 
    $im->setImageFormat('jpeg');    
    $im->writeImage('thumb.jpg'); 
    $im->clear(); 
    $im->destroy();
    

    【讨论】:

    • 似乎某些情况下ImageMagick需要安装Ghostscript,否则会抛出Postscript delegate failed错误
    • 为什么 setResolution 和 setImageResolution 做不同的事情并且在文档中有相同的描述?!谢谢你,你完全救了我。
    【解决方案3】:
    $im = new imagick();
    
    //this must be called before reading the image, otherwise has no effect
    
    $img->setResolution(200,200);
    
    //read the pdf
    
    $img->readImage("{$pdf_file}[0]");
    

    【讨论】:

      【解决方案4】:

      在阅读 PDF 之前,可以通过设置 density(即 DPI)来更改从 PDF 生成的图像的质量 - 这可以通过 ghostscript (gs) 在下面对 PDF 进行光栅化。要获得良好的结果,请以所需密度的两倍进行超级采样,并使用resample 以恢复所需的 DPI。如果您想要 RGB JPEG,请记住将 colorspace 更改为 RGB。

      convert 的典型命令行版本可能是:

      convert -density 600 document.pdf[0] -colorspace RGB -resample 300 output.jpg
      

      如果您需要裁剪它,如果图像在页面中居中,则重新采样后的 -shave 命令通常是明智的。

      至于PHP IMagick extension,我从不亲自使用它——所以我不确定你如何指定文件读取提示,但我希望它是可能的。

      【讨论】:

        【解决方案5】:

        确保使用正确的颜色配置文件创建 PDF,我曾经在调整大小后因为源文件使用错误的颜色配置文件创建了我的 JPG。另见:ImageMagick PDF to JPEG conversion results in green square where image should be

        【讨论】:

        • 这应该是一个评论,一个非常有趣的评论,而不是一个答案。
        猜你喜欢
        • 1970-01-01
        • 2015-09-05
        • 2012-09-15
        • 2013-05-07
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 2013-02-20
        • 2014-05-01
        相关资源
        最近更新 更多