2011-12-24 18 views
26

ヘルプPHPを使用してPDFをIMG(JPG)に変換しようとしています。PHPを使用したPDFからJPGへの変換

私はimagick拡張機能を使用しています。

これは私のソースPDFファイル(A4持っているような210x297ミリ、)右の寸法を有している私のコード

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

です。そして、すべてがよさそうだ。 しかし、私のjpgは842x595 pxのページサイズを持ち、DPIは72です。

そしてimgファイルは紙面よりはるかに小さく、pdfは印刷しています。あなたは2つのセッター逃したように見えます何(紙に)PDFから画像ファイルを作成し、PDFファイルとして、それはとても大きく作るための適切な方法である

+0

最後に私が実装されているすべてのもの、結果は素晴らしいです!スピードは速い!とても早い! – user1016265

答えて

5

ImageMagickはGhostScriptを使用してJPEGを処理するので、GhostScriptを直接execにすると、より効率的でより多くの制御が得られます。また、IMagick関数を使用する代わりに、1 exec文だけが使用されます。

+0

私はあなたが賢明に提案したようにしました。より速く動作し、結果はより期待されます;) – user1016265

8

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サイズの用紙を持っていますが、紙の上に同じ大きさにするにはどうすればいいですか?印刷目的の場合にのみDPI値が使用されますか? – user1016265

+0

ああ!私は参照してください...いくつかの詳細を追加する私の答えを書き換えさせてください –

+0

それは助けにはなりません。これはpdf http://o7.no/uAMcLaに関する情報です。 主な奇妙なことは、私はshell_execを使ってこの変換を行ったことです( "変換密度 - 単位ピクセルパーセンチ+マットインアウト")。 と結果イメージが予想されるサイズになります。実際のプロジェクトで – user1016265

0

画像を読み取る前にsetResolutionを呼び出す必要があります。それ以外の場合、imagemagickはデフォルトのシステムdpiを使用します。

10

imagemagickをexec()などで使用すると、シェルの引数が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 

それは、具体的に問題を修正するオプション(としてソースファイルを読み取るためにDPIを設定する)「-density」です。

また、imagemagickでは、デフォルトでJPEGの書き込みに92という-quality設定が使用されることがほとんどなので、明示的に宣言する必要はありません。ファイルを読み込む前に、解像度を設定し、前述のように

3

はトリックがない:ghostscriptのコンソールコマンド(GS)を経由して

$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(); 
関連する問題