in src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java [310:361]
private PDFFormXObject getFormXObject(PDFDictionary pageResources, PDFStream pageStream, String key, PDPage page)
throws IOException {
if (pdfDoc.isMergeFontsEnabled()) {
throw new RuntimeException("merge-fonts and form-xobject can't both be enabled");
}
if (!pageResources.hasObjectNumber()) {
pdfDoc.registerObject(pageResources);
}
PDFFormXObject form = pdfDoc.addFormXObject(null, pageStream, pageResources.makeReference(), key);
final Set<String> page2Form = new HashSet<>(Arrays.asList("Group", "LastModified", "Metadata"));
transferDict(page.getCOSObject(), pageStream, page2Form, true);
AffineTransform at = form.getMatrix();
PDRectangle mediaBox = page.getMediaBox();
PDRectangle cropBox = page.getCropBox();
PDRectangle viewBox = cropBox != null ? cropBox : mediaBox;
//Handle the /Rotation entry on the page dict
int rotation = PDFUtil.getNormalizedRotation(page);
//Transform to FOP's user space
at.scale(1 / viewBox.getWidth(), 1 / viewBox.getHeight());
at.translate(mediaBox.getLowerLeftX() - viewBox.getLowerLeftX(),
mediaBox.getLowerLeftY() - viewBox.getLowerLeftY());
switch (rotation) {
case 90:
at.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
at.translate(0, viewBox.getWidth());
at.rotate(-Math.PI / 2.0);
break;
case 180:
at.translate(viewBox.getWidth(), viewBox.getHeight());
at.rotate(-Math.PI);
break;
case 270:
at.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
at.translate(viewBox.getHeight(), 0);
at.rotate(-Math.PI * 1.5);
break;
default:
//no additional transformations necessary
break;
}
at.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY());
form.setMatrix(at);
form.setBBox(new Rectangle2D.Float(
viewBox.getLowerLeftX(), viewBox.getLowerLeftY(),
viewBox.getUpperRightX(), viewBox.getUpperRightY()));
return form;
}