in src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java [177:220]
private Object readCOSStream(COSStream originalStream, Object keyBase) throws IOException {
InputStream in;
Set filter;
PDFStream stream = new PDFStream();
if (adapter.pdfDoc.isEncryptionActive() && originalStream.getItem(COSName.FILTER) == COSName.DCT_DECODE) {
stream.getFilterList().addFilter(new DCTFilter());
in = originalStream.createRawInputStream();
filter = Collections.EMPTY_SET;
} else if (adapter.pdfDoc.isEncryptionActive()
|| (originalStream.containsKey(COSName.DECODE_PARMS) && !originalStream.containsKey(COSName.FILTER))) {
in = originalStream.createInputStream();
filter = adapter.FILTER_FILTER;
} else {
//transfer encoded data (don't reencode)
in = originalStream.createRawInputStream();
filter = Collections.EMPTY_SET;
}
OutputStream out = stream.getBufferOutputStream();
if ((originalStream.getItem(COSName.TYPE) == COSName.PATTERN
|| originalStream.getItem(COSName.SUBTYPE) == COSName.FORM) && adapter.uniqueName != null) {
PDFWriter writer = new PDFWriter(adapter.uniqueName, adapter.currentMCID);
try {
String newStream = writer.writeText(new PDStream(originalStream));
if (writer.keyUsed) {
filter = adapter.FILTER_FILTER;
byte[] bytes = newStream.getBytes(PDFDocument.ENCODING);
out.write(bytes);
out.close();
try (OutputStream originalStreamOS = originalStream.createOutputStream()) {
originalStreamOS.write(bytes);
}
in = null;
}
} catch (IOException e) {
//ignore
}
}
if (in != null) {
IOUtils.copyLarge(in, out);
}
adapter.transferDict(originalStream, stream, filter);
return cacheClonedObject(keyBase, stream);
}