【问题标题】:PDF to JPG conversion using PHP使用 PHP 将 PDF 转换为 JPG
【发布时间】:2012-01-27 08:02:06
【问题描述】:

我正在尝试借助 PHP 将 PDF 转换为 IMG (JPG)。

我正在使用 imagick 扩展。

这是我的代码

    $fp_pdf = fopen($pdf, 'rb');

    $img = new imagick(); // [0] can be used to set page number
    $img->readImageFile($fp_pdf);
    $img->setImageFormat( "jpg" );
    $img->setImageCompression(imagick::COMPRESSION_JPEG); 
    $img->setImageCompressionQuality(90); 

    $img->setResolution(300,300);

    $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);

    $data = $img->getImageBlob(); 

我的源 pdf 文件具有正确的尺寸(210x297 毫米,就像 A4 一样)。一切看起来都很好。 但我的 jpg 页面尺寸为 842x595 像素,DPI 为 72。

当我打印出来时,纸上的 img 文件比 pdf 小得多。

什么是从pdf制作图像文件并使其像pdf一样大(在纸上)的正确方法

【问题讨论】:

  • 最后我已经通过ghostscript控制台命令(gs)实现了一切,结果非常好!速度很快!非常快!

标签: php pdf imagemagick imagick


【解决方案1】:

如前所述,在读取文件之前设置分辨率就可以了:

$fp_pdf = fopen($pdf, 'rb');

$img = new imagick(); // [0] can be used to set page number
$img->setResolution(300,300);
$img->readImageFile($fp_pdf);
$img->setImageFormat( "jpg" );
$img->setImageCompression(imagick::COMPRESSION_JPEG); 
$img->setImageCompressionQuality(90); 

$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);

$data = $img->getImageBlob(); 

【讨论】:

    【解决方案2】:

    您可以通过 exec() 或类似的方式使用 imagemagick,shell 参数比 PHP 扩展更简洁。

    $pdf_file = escapeshellarg( "mysafepdf.pdf" );
    $jpg_file = escapeshellarg( "output.jpg" );
    
    $result = 0;
    exec( "convert -density 300 {$pdf_file} {$jpg_file}", null, $result );
    
    // at this point $result should == 0 if the conversion was successful
    

    这是专门解决您的问题的“-density”(将 DPI 设置为读取源文件)选项。

    此外,在大多数情况下,imagemagick 默认使用 92 的 JPEG 写入质量设置 - 因此您可能不需要显式声明它。

    【讨论】:

    • 致命错误:第 6 行 mypath\index.php 中只能通过引用传递变量
    • 只传递一个空数组而不是“null”
    【解决方案3】:

    您必须在读取图像之前调用 setResolution。否则 imagemagick 将使用默认的系统 dpi。

    【讨论】:

      【解决方案4】:

      ImageMagick 使用 GhostScript 处理 JPEG,因此您最好直接使用 execGhostScript,这样会更高效,并为您提供更多控制权。它也只是 1 个exec 语句,而不是玩弄 IMagick 函数。

      【讨论】:

      • 在实际项目中,我非常喜欢你的建议。它工作得更快,结果更令人期待;)
      【解决方案5】:

      看起来你错过了两个二传手:

      Imagick::setImagePage() http://www.php.net/manual/en/function.imagick-setimagepage.php

      还有:

      Imagick::setImageExtent() http://www.php.net/manual/en/function.imagick-setimageextent.php

      为了获得这些函数的正确参数,您可以尝试以下方法:

      $fp_pdf = fopen($pdf, 'rb');
      $params=array();
      
          $img = new imagick(); 
          $img->readImageFile($fp_pdf);
          /*my modification: */$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
          /*my modification: */$params=$img->identifyImage();
          $img->setImageFormat( "jpg" );
          $img->setImageCompression(imagick::COMPRESSION_JPEG); 
          $img->setImageCompressionQuality(90); 
          /*my modification: */$img->setPage($params['geometry']['width'], $params['geometry']['height'], 0, 0)
          /*my modification: */$img->setResolution($params['resolution']['x'], $params['resolution']['y']);
          $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
          $data = $img->getImageBlob();
      

      如果您发现应该设置其他一些属性,那么让我向您展示 $params 所持有的信息。它可能对您有用:

      $params=array(
          [imageName],
          [format], 
          [geometry] => Array
              (
                  [width]
                  [height] 
              )
          [type], 
          [colorSpace], 
          [resolution],
              (
                  [x] 
                  [y]
              )
      
          [units],
          [fileSize],
          [compression],
          [signature], 
      

      )

      说实话,我不完全确定这是否可行。只是为了帮助你的尝试。我真诚地希望这样做。

      【讨论】:

      • 感谢您的回答,但我怎么能想象我应该在这些函数中传递什么值? PDF 有纸张 A4 尺寸,我怎么知道在纸上制作相同尺寸的 px 中的 mucn 应该是多少?还是仅出于打印目的使用 DPI 值?
      • 哦!我明白了......让我重写我的答案以添加一些细节
      • 它没有帮助。这是关于 pdf o7.no/uAMcLa 的信息。主要奇怪的是,我使用 shell_exec("convert -density 300 -units pixelperinch + matte in out") 进行了这个转换。结果图像变为预期尺寸。
      猜你喜欢
      • 2020-08-09
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多