Задать вопрос
@teimur

Imagick как убрать размытие при сохранении pdf?

У меня есть задача, есть много файлов PDF, на них в левом верхнем углу есть документ, ради экономии листов бумаги нужно на один лист объеденять 4 таких документа. Я ничего лучше Imagick не нашел. По сути у меня задача скопировать прямоугольник с документа PDF, и вставить в новый созданный в определенные координаты что бы в листе было по 4 штуки.
const SCAN_DIR = "E:\pdf";
const OUT_FILE = 'E:/result/result.pdf';
const A4_COLS = 595;
const A4_ROWS = 842;
const COMPRESSIONQUALITY = 1;

try {
    $imagick = new Imagick();
    $imagick->newImage(A4_COLS, A4_ROWS, new ImagickPixel('white'), 'pdf');
    $imagick->setImageCompressionQuality(COMPRESSIONQUALITY);
    $imagickTemp = $imagick;
    $i = $j = 0;
    $files = scandir(SCAN_DIR);
    foreach ($files as $file) {
        if ($file === '.' or $file === '..') continue;
        $file = SCAN_DIR . '/' . $file;
        $imagickPDF = new Imagick();
        $imagickPDF->readImage($file);
        $imagickPDF->setImageCompressionQuality(COMPRESSIONQUALITY);
        $imagickPDF->cropImage(290, 420, 0, 0);
        $x = $y = 0;
        switch ($i) {
            case 0:
                $x = 0;
                $y = 0;
                break;
            case 1:
                $x = 300;
                $y = 0;
                break;
            case 2:
                $x = 0;
                $y = 430;
                break;
            case 3:
                $x = 300;
                $y = 430;
                break;
        }
        $imagickTemp->compositeImage($imagickPDF, Imagick::COMPOSITE_ATOP, $x, $y);
        $imagickPDF->clear();
        $imagickPDF->destroy();

        if ($i !== 0 && ($i+1) % 4 === 0 ) {
            if ($j > 0) {
                $imagick->addImage($imagickTemp);
                $imagickTemp->clear();
                $imagickTemp->destroy();
            }
            $imagickTemp = new Imagick();
            $imagickTemp->newImage(A4_COLS, A4_ROWS, new ImagickPixel('white'), 'pdf');
            $imagickTemp->setImageCompressionQuality(COMPRESSIONQUALITY);
            $j++;
            $i = 0;
         } else $i++;
    }

    $imagick->writeImages(OUT_FILE, true);
    $imagick->clear();
    $imagick->destroy();

} catch (ImagickException $e) {
    print_r($e);
}


В результате на выходе получается изображение ужасного мутного качества. И я не понимаю как это исправить?
Вот оригинал
63d34a44070f0624564417.png

А вот то что получается в результате:
63d34ada3fe9d656380334.png

Обратите внимание какие мутные надписи. Как мне это исправить?
  • Вопрос задан
  • 207 просмотров
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Ошибка в самом способе решения: вы растеризуете вектор Imagick-ом, вот его и мылит.
C нарезкой PDF без вмешательства в картинку прекрасно справляется pdfjam.
Алгоритм мне видится так: на сервер скидывается четыре таких PDF с картинкой в углу, pdfjam делает из них четыре PDF меньшего размера (только картинки), собирает в одну четырехстраничную PDF, которую потом можно отправить на принтер с настройкой "4 страницы на листе".
С отправкой файлов на сервер и возвращением результата вполне справится указанный в тегах PHP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы