2011-12-24 79 views
26

我試圖用PHP幫助將PDF轉換爲IMG(JPG)。PDF到JPG轉換使用PHP

我使用的是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(在紙上)

+0

通過ghostscript的控制檯命令(GS)最後我已經實現了一切,結果是優秀的!速度快!非常快! – user1016265 2012-05-15 19:24:11

回答

5

ImageMagick使用GhostScript來處理JPEG,所以你最好直接使用exec GhostScript,這樣會更有效,並且給你更多的控制權。它也將只是1 exec聲明,而不是玩IMagick函數。

+0

我非常喜歡你的建議。它工作得更快,結果更可預期;) – user1016265 2012-09-21 08:05:56

8

看起來你錯過了兩個setter方法:

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

和:

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

爲了得到正確的PA這些功能rameters,你可以嘗試以下方法:

$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], 

說實話,我不能完全肯定這是否會奏效。只是爲了幫助你的嘗試。我真誠希望它能做到。

+0

謝謝你的回答,但我怎麼能想象我應該在這些功能中傳遞什麼價值? PDF具有紙張A4尺寸,我如何知道px中的mucn應該如何在紙張上製作相同的尺寸?或僅用於打印目的將使用DPI值? – user1016265 2012-01-01 20:09:56

+0

哦!我看到...讓我重寫我的答案,添加一些細節 – 2012-01-01 21:15:05

+0

它沒有幫助。這是關於pdf http://o7.no/uAMcLa的信息。 主要的奇怪的是,我使用shell_exec(「convert -density 300 -units pixelsperinch + matte in out」)進行了此轉換。 和結果圖像變成預期的尺寸。實際項目中的 – user1016265 2012-01-02 21:49:26

0

您必須在讀取圖像之前調用setResolution。否則,imagemagick將使用默認的系統dpi。

10

你可以通過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在大多數情況下對JPEG編寫使用92的-quality設置 - 因此您可能不需要顯式聲明它。

3

正如前面提到的,在讀取文件之前設置的分辨率開了竅:

$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();