Flattening a PDF and getting it to print on letter-sized paper

From ceejayoz

Jump to: navigation, search

I would never have believed how complicated this would wind up being.

Requirements:

<?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");
Personal tools