in src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java [177:284]
public Object createStreamFromPDFBoxPage(PDDocument sourceDoc, PDPage sourcePage, String key,
AffineTransform pageAdjust, FontInfo fontinfo, Rectangle destRect)
throws IOException {
COSDictionary sourcePageResources = getResources(sourcePage);
PatternUtil patternUtil = new PatternUtil(targetPage, destRect, sourcePage);
uniqueName = new UniqueName(
key, sourcePageResources, patternUtil.getPatternNames(), pdfDoc.isFormXObjectEnabled(), destRect);
key = patternUtil.getKey(key);
handleAnnotations(sourceDoc, sourcePage, pageAdjust, destRect);
if (pageNumbers.containsKey(targetPage.getPageIndex())) {
pageNumbers.get(targetPage.getPageIndex()).set(0, targetPage.makeReference());
}
PDStream pdStream = getContents(sourcePage);
COSDictionary fonts = (COSDictionary)sourcePageResources.getDictionaryObject(COSName.FONT);
COSDictionary fontsBackup = null;
String newStream = null;
if (fonts != null && pdfDoc.isMergeFontsEnabled()) {
fontsBackup = new COSDictionary(fonts);
MergeFontsPDFWriter m = new MergeFontsPDFWriter(fonts, fontinfo, uniqueName, parentFonts, currentMCID);
newStream = m.writeText(pdStream);
}
if (!pdfDoc.isFormXObjectEnabled()) {
if (newStream == null) {
newStream = (String) clonedVersion.get(key);
if (newStream == null) {
PDFWriter writer = new PDFWriter(uniqueName, currentMCID);
newStream = writer.writeText(pdStream);
clonedVersion.put(key, newStream);
}
}
pdStream = new PDStream(sourceDoc, new ByteArrayInputStream(newStream.getBytes(PDFDocument.ENCODING)));
}
mergeXObj(sourcePageResources, fontinfo, uniqueName);
List<COSName> exclude = Collections.singletonList(COSName.PATTERN);
PDFDictionary pageResources =
(PDFDictionary)cloneForNewDocument(sourcePageResources, sourcePageResources, exclude);
updateMergeFontInfo(pageResources, fontinfo);
updateXObj(sourcePageResources, pageResources);
if (fontsBackup != null) {
sourcePageResources.setItem(COSName.FONT, fontsBackup);
}
COSStream originalPageContents = pdStream.getCOSObject();
bindOptionalContent(sourceDoc);
PDFStream pageStream;
Set filter;
// if (originalPageContents instanceof COSStreamArray) {
// COSStreamArray array = (COSStreamArray)originalPageContents;
// pageStream = new PDFStream();
// InputStream in = array.getUnfilteredStream();
// OutputStream out = pageStream.getBufferOutputStream();
// IOUtils.copyLarge(in, out);
// filter = FILTER_FILTER;
// } else {
pageStream = (PDFStream)cloneForNewDocument(originalPageContents, originalPageContents, exclude);
filter = Collections.EMPTY_SET;
// }
if (pageStream == null) {
pageStream = new PDFStream();
}
if (pdfDoc.isFormXObjectEnabled()) {
return getFormXObject(pageResources, pageStream, key, sourcePage);
}
if (originalPageContents != null) {
transferDict(originalPageContents, pageStream, filter);
}
transferPageDict(fonts, uniqueName, sourcePageResources);
patternUtil.promotePatterns();
PDRectangle mediaBox = sourcePage.getMediaBox();
PDRectangle cropBox = sourcePage.getCropBox();
PDRectangle viewBox = cropBox != null ? cropBox : mediaBox;
//Handle the /Rotation entry on the sourcePage dict
int rotation = PDFUtil.getNormalizedRotation(sourcePage);
//Transform to FOP's user space
float w = (float)destRect.getWidth() / 1000f;
float h = (float)destRect.getHeight() / 1000f;
if (rotation == 90 || rotation == 270) {
float tmp = w;
w = h;
h = tmp;
}
pageAdjust.setTransform(AffineTransform.getScaleInstance(w / viewBox.getWidth(), h / viewBox.getHeight()));
pageAdjust.translate(0, viewBox.getHeight());
pageAdjust.rotate(-Math.PI);
pageAdjust.scale(-1, 1);
pageAdjust.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY());
PDFBoxAdapterUtil.rotate(rotation, viewBox, pageAdjust);
StringBuilder boxStr = new StringBuilder();
boxStr.append(PDFNumber.doubleOut(mediaBox.getLowerLeftX())).append(' ')
.append(PDFNumber.doubleOut(mediaBox.getLowerLeftY())).append(' ')
.append(PDFNumber.doubleOut(mediaBox.getWidth())).append(' ')
.append(PDFNumber.doubleOut(mediaBox.getHeight())).append(" re W n\n");
return boxStr.toString() + IOUtils.toString(pdStream.createInputStream(), PDFDocument.ENCODING);
}