У меня есть задача, есть много файлов 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);
}
В результате на выходе получается изображение ужасного мутного качества. И я не понимаю как это исправить?
Вот оригинал
А вот то что получается в результате:
Обратите внимание какие мутные надписи. Как мне это исправить?