Flattening a PDF and getting it to print on letter-sized paper
From ceejayoz
I would never have believed how complicated this would wind up being.
Requirements:
- PHP
- ghostscript
- imagemagick
- Multivalent
<?php // generate a high-resolution JPEG exec("gs -q -sDEVICE=jpeg -dBATCH -dNOPAUSE -dFirstPage=1 -dLastPage=1 -r300 -sOutputFile='/tmp/{$ad->number}.jpg' -c \"<< /UseCIEColor true >> setpagedevice \" -f '/tmp/{$ad->number}.pdf' 2>&1"); // get the image dimensions $size = getimagesize("/tmp/{$ad->number}.jpg"); // generate sized versions of the JPEG exec("convert '/tmp/{$ad->number}.jpg' -resize '800x>' '/tmp/{$ad->number}.800x.jpg'"); exec("convert '/tmp/{$ad->number}.jpg' -resize 'x200>' '/tmp/{$ad->number}.x200.jpg'"); // generate a flattened PDF from our JPEG exec("convert '/tmp/{$ad->number}.jpg' '/tmp/{$ad->number}.flat.pdf'"); // hacky fix to the fact that imagemagick apparently generates a PDF with a massively larger MediaBox than its CropBox $pdf = file_get_contents("/tmp/{$ad->number}.flat.pdf"); preg_match("@/CropBox \[([0-9 ]+)\]@", $pdf, $matches); $cropbox = $matches[1]; // replace the MediaBox dimensions with the CropBox ones if($cropbox) { $pdf = preg_replace("@/MediaBox \[([0-9 ]+)\]@", "/MediaBox [{$matches[1]}]", $pdf, 1); file_put_contents("/tmp/{$ad->number}.flat.pdf", $pdf); } // size the PDF down to letter paper sized exec("java -cp Multivalent20060102.jar tool.pdf.Impose -cropbox -dim 1x1 -layout '1" . ($size[0] >= $size[1] ? 'r' : '') . "' -paper 'letter' -margin '0.25in' '/tmp/{$ad->number}.flat.pdf'"); copy("/tmp/{$ad->number}.flat-up.pdf", "/tmp/{$ad->number}.processed.pdf");
Categories: PHP | PDF

