web-dev-qa-db-ja.com

PDF PHP

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ファイルの寸法は適切です(A4のような210x297 mm)。そして、すべてがよさそうだ。しかし、私のjpgのページサイズは842x595ピクセルで、DPIは72です。

そして、私がそれを印刷したとき、imgファイルはpdfよりも紙の上ではるかに小さくなりました。

pdfから画像ファイルを作成し、pdfほど大きくする適切な方法は何ですか(紙上)

26
user1016265

ImageMagickはGhostScriptを使用してJPEGを処理するため、exec GhostScriptを直接実行する方が効率的で、より効率的に制御できます。また、IMagick関数をいじるのではなく、1つのexecステートメントだけになります。

5
Alasdair

Exec()などを使用してimagemagickを使用できます。シェル引数は、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設定を使用するため、おそらく明示的に宣言する必要はありません。

11

2つのセッターを見逃したようです。

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

正直に言うと、これがうまくいくかどうかは完全にはわかりません。あなたを助けるためだけの試みです。私は心から願っています。

前に述べたように、ファイルを読み取る前に解像度を設定することはトリックです。

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

画像を読み込む前にsetResolutionを呼び出す必要があります。そうでない場合、imagemagickはデフォルトのシステムdpiを使用します。

1
Pieter