0

私は次のコードを持っています。さまざまな画像の添付ファイル(およびPDF)を1つのPDFに結合するために使用されます。どういうわけか、PDFを1つでも取り出してコードに通すと、元のPDFに比べて非常に見栄えの悪い結果になります。また、ソースPDFでテキストを選択することはできますが、生成されたPDFでは選択できません。

どんな助けでも大歓迎です。

// PDF object
$pdf = new Imagick();
$max_resolution = array('x' => 100, 'y' => 100);

foreach($attachment_ids as $attachment_id) {
    $attachment = DAO_Attachment::get($attachment_id);
    $file = Storage_Attachments::get($attachment);
    // Temporarily store our attachment
    $im = new Imagick();
    $im->readImageBlob($file);
    // We need to reset the iterator otherwise only one page will be rotated
    $im->resetIterator();

    // Get the resolution
    $resolution = $im->getImageResolution();
    if($resolution['x'] > $max_resolution['x']) {
        $max_resolution['x'] = $resolution['x'];
    }
    if($resolution['y'] > $max_resolution['y']) {
        $max_resolution['y'] = $resolution['y'];
    }

    $num_pages = $im->getNumberImages();

    $rotation = array_shift($rotations);
    $degrees = $rotation > 0 ? 360 - $rotation : 0;
    $pages = array();

    if($degrees > 0) {
        // Rotate each page
        for($i = 1; $i <= $num_pages; $i++) {
            $im->nextImage();
            $im->rotateImage(new ImagickPixel(), $degrees);
        }
    }

    // We need to reset the iterator again so all of our pages will be added to the pdf
    $im->resetIterator();

    // If the image format isn't a pdf, convert it to a png
    if($im->getImageFormat !== 'pdf') {
        $im->setImageFormat('png');
        // Opacity
        if(method_exists($im, 'setImageOpacity'))
            $im->setImageOpacity(1.0);
    }

    $im->setImageCompression(imagick::COMPRESSION_LOSSLESSJPEG); 
    $im->setImageCompressionQuality(100);
    $im->stripImage();

    // Add the rotated attachment to the PDF
    $pdf->addImage($im);

    // Free
    $im->destroy();
}

// Create a composite
$pdf->setImageFormat('pdf');

// Compress output
$pdf->setImageCompression(imagick::COMPRESSION_LOSSLESSJPEG); 
$pdf->setImageCompressionQuality(100);
$pdf->stripImage();

// Set resolution
$pdf->setImageResolution($max_resolution['x'], $max_resolution['y']);
4

3 に答える 3

1

これに対する答えは、を使用してDPIを設定することsetResolution()です。現在の解像度に基づいて画像のDPIが変更されるため、画像を含むファイルを読み取る前にこれを行います(したがって、後で設定しても機能しませんreadImageBlob()

数学を使っresampleImage()て事後にそれを行うこともできますがsetResolution()、私たちにとっては完璧に機能しているようです。

于 2011-07-18T08:44:50.883 に答える
1

これはすでにあなたには明らかかもしれませんが、低品質の画像は高品質のpdfにはなりません。ImagickのPDF生成機能がどれほど優れているかはわかりませんが、コードから画像を変換しているように見えますか?TcPDFで同じことを行うことで比較できますが、画像の品質が低い場合は、より良い結果が得られるとは思えません。

また、通常のWeb最適化形式よりも高いDPI解像度の画像にアクセスできる場合は、代わりにそれらを使用してPDFを作成することをお勧めします。品質はずっと良くなります。

于 2011-06-02T19:47:52.817 に答える
1

ImageMagickはGhostScriptを使用してPDFをさまざまなラスター画像形式に変換します。GhostScriptはこれに非常に優れていますが、ページを最大100x100に縮小することで手作業でカフをかけています。

72 dpiで8.5x11(インチ)のページは612x792ピクセルです。

おそらく、解像度ではなくDPIを制限するつもりでしたか?出力はまだそれほどうまくスケーリングされませんが(ベクター形式とピクセル形式)、大きな改善になると思います。

于 2011-06-06T17:24:22.397 に答える