0

我有以下代码。它用于将各种图像附件(和 pdf)组合成一个 PDF。出于某种原因,当我将单个 PDF 放入代码中时,与原始 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

事实证明,这个问题的答案是使用setResolution(). 我们在使用读取包含我们图像的文件之前readImageBlob()执行此操作,因为它会根据当前分辨率更改图像的 DPI(因此之后设置将不起作用)。

您也可以使用一些数学并resampleImage()在事后使用它,但setResolution()似乎对我们来说非常有效。

于 2011-07-18T08:44:50.883 回答
1

ImageMagick 使用 GhostScript 将 PDF 转换为各种光栅图像格式。GhostScript 在这方面做得很好,但是您将页面缩小到最大 100x100 是在给它戴上手铐。

72 dpi 的 8.5x11(英寸)页面是 612x792 像素。

也许您的意思是限制 DPI 而不是分辨率?输出仍然不能很好地缩放(矢量格式与像素格式),但我怀疑这将是一个很大的改进。

于 2011-06-06T17:24:22.397 回答
1

这对您来说可能已经很明显了,但低质量的图像不会产生高质量的 pdf。我不知道 Imagick 的 pdf 生成功能有多好,但是从您的代码看来,您正在转换图像?您可以通过与 TcPDF 做同样的事情进行比较,但如果图像质量低,我怀疑您会得到更好的结果。

此外,如果您可以访问比通常的 Web 优化格式更高 DPI 分辨率的图像,我建议您使用这些图像来构建您的 PDF。质量会好很多。

于 2011-06-02T19:47:52.817 回答