private Object readCOSStream()

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);
    }