[ 
https://issues.apache.org/jira/browse/PDFBOX-3329?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15261752#comment-15261752
 ] 

Alexander Kriegisch commented on PDFBOX-3329:
---------------------------------------------

Have you tested the example by yourself? It does not work:

{code}
java.lang.IllegalStateException: Cannot read while there is an open stream 
writer

        at 
org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:129)
        at 
org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1177)
        at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:372)
        at 
org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:561)
        at 
org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:490)
        at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:474)
        at 
org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1073)
        at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:419)
        at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1331)
        at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1229)
        at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1101)
        at 
org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:280)
        at 
org.apache.pdfbox.examples.util.PDFMergerExample.merge(PDFMergerExample.java:85)
        at MyTest.mergePDFs(MyTest.groovy:19)
{code}

The reason is that when you converted my Java 7/8 code using try with resources 
you forgot to replace it by a {{finally}} block closing the output streams in 
helper method {{createXMPMetadata}}. You can fix it like this:

{code}
        // (...)

        // Create and return XMP data structure in XML format
        ByteArrayOutputStream xmpOutputStream = null;
        OutputStream cosXMPStream = null;
        try {
            xmpOutputStream = new ByteArrayOutputStream();
            cosXMPStream = cosStream.createOutputStream();
            new XmpSerializer().serialize(xmpMetadata, xmpOutputStream, true);
            cosXMPStream.write(xmpOutputStream.toByteArray());
            return new PDMetadata(cosStream);
        } finally {
            try { xmpOutputStream.close(); } catch (Exception e) {}
            try { cosXMPStream.close(); } catch (Exception e) {}
        }
{code}

You also forgot to close the streams in the {{merge}} method, BTW. I am 
attaching a fixed version.

> Create PDFMergerUtility example with improved metadata handling
> ---------------------------------------------------------------
>
>                 Key: PDFBOX-3329
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-3329
>             Project: PDFBox
>          Issue Type: Improvement
>          Components: PDModel
>    Affects Versions: 2.0.1, 2.0.2, 2.1.0
>            Reporter: Tilman Hausherr
>         Attachments: PDFMergerExample.java
>
>
> Create example as suggested by [~kriegaex] in PDFBOX-3323.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: dev-h...@pdfbox.apache.org

Reply via email to