Почему качество сгенерированных PDF-файлов так низко с этим кодом? - PullRequest
0 голосов
/ 02 июня 2011

У меня есть следующий код.Он используется для объединения различных вложений изображений (и 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']);

Ответы [ 3 ]

1 голос
/ 06 июня 2011

ImageMagick использует GhostScript для преобразования PDF-файлов в различные форматы растровых изображений.GhostScript неплохо справляется с этим, но вы наручаете его, масштабируя страницу до максимального размера 100x100.

Страница 8,5x11 (дюймов) при 72 dpi, 612x792 пикселей.

Возможно, вы хотели ограничить DPI, а не разрешение?Вывод все равно не будет хорошо масштабироваться (векторные форматы по сравнению с пиксельными), но я подозреваю, что это будет большим улучшением.

1 голос
/ 18 июля 2011

Получается, что ответом на это является установка DPI с помощью setResolution().Мы делаем это за до , используя readImageBlob(), чтобы прочитать файл, содержащий наше изображение, так как это изменит DPI изображения в зависимости от текущего разрешения (поэтому его установка не будет работать).

Вы могли бы также использовать некоторую математику и использовать resampleImage(), чтобы сделать это после свершившегося факта, но setResolution(), кажется, отлично работает для нас.

1 голос
/ 02 июня 2011

Это может быть очевидно для вас, но низкое качество изображения не приведет к высококачественному PDF.Я не знаю, насколько хороши возможности генерации PDF в Imagick, но кажется, что из вашего кода вы конвертируете изображения?Вы можете сравнить то же самое с TcPDF, но если изображение низкого качества, я сомневаюсь, что вы получите лучшие результаты.

Кроме того, если у вас есть доступ к изображениям с более высоким разрешением DPI, чем к обычному веб-оптимизированному формату, я рекомендую использовать их для создания PDF-файла.Качество будет намного лучше.

...