[
https://issues.apache.org/jira/browse/PDFBOX-3570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15668464#comment-15668464
]
Caleb Cushing commented on PDFBOX-3570:
---------------------------------------
hmm, doesn't seem to have fixed the problem.
{code}
-rw-r--r-- 1 calebcushing staff 4093961 Nov 15 15:16
pdfbox-1.8.13-20161115.083539-68.jar
{code}
from
https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox/1.8.13-SNAPSHOT/
digging a little bit myself, looking at the decompiled bytecode looks like I
have the fix... but we aren't going through saveIncremental, rather save. It
looks however, like save is doing the same sillyness of calling close twice.
{code} public void save(OutputStream output) throws IOException,
COSVisitorException {
this.getDocumentCatalog().getPages().updateCount();
COSWriter writer = null;
try {
writer = new COSWriter(output);
writer.write(this);
writer.close();
} finally {
if(writer != null) {
writer.close();
}
}
}{code}
> JDK-8054565 Java 8 close contract issue
> ---------------------------------------
>
> Key: PDFBOX-3570
> URL: https://issues.apache.org/jira/browse/PDFBOX-3570
> Project: PDFBox
> Issue Type: Bug
> Affects Versions: 1.8.10, 1.8.11, 1.8.12
> Reporter: Caleb Cushing
>
> Java 8 bug uncovered, and wondering if the PDFBox team would be willing to
> work around it? You should probably reply with an emphatic "no", butI
> figure it is worth a shot.
> Here is the openjdk bug: https://bugs.openjdk.java.net/browse/JDK-8054565
> PDDocument.saveIncremental(OutputStream) calls close() twice - once in
> try{} and once in finally{}, relying on the Closable contract which says it
> will do nothing if the stream is already close.
> But, we see this:
> {code}
> Caused by: java.io.IOException: Closed LOB
> at
> oracle.jdbc.driver.DatabaseError.SQLToIOException(DatabaseError.java:519)
> at
> oracle.jdbc.driver.OracleBlobOutputStream.ensureOpen(OracleBlobOutputStream.java:231)
> at
> oracle.jdbc.driver.OracleBlobOutputStream.flush(OracleBlobOutputStream.java:167)
> at java.io.FilterOutputStream.flush(FilterOutputStream.java:140)
> at java.io.FilterOutputStream.close(FilterOutputStream.java:158)
> at org.apache.pdfbox.pdfwriter.COSWriter.close(COSWriter.java:300)
> at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1366)
> at ourpackage.util.pdf.PdfDRM.applyDRM(PdfDRM.java:225)
> at
> ourpackage.db.liquibase.customchanges.IQMDxContentLoader.applyDrmToCesPdfDocumentInDatabase(IQMDxContentLoader.java:383)
> at
> ourpackage.db.liquibase.customchanges.IQMDxContentLoader.applyZippedCesDocumentChangesToDatabase(IQMDxContentLoader.java:265)
> at
> ourpackage.db.liquibase.customchanges.IQMDxContentLoader.generateStatements(IQMDxContentLoader.java:153)
> ... 33 more
> {code}
> Because Java 8's FilterOutputStream.close() is calling flush() on the
> second close and Oracle's driver code doesn't like that.
> The bug can be worked around it by implementing close() in
> COSStandardOutputStream as below:
> {code}
> private boolean closed;
> @Override
> public void close() throws IOException
> {
> try (OutputStream ostream = out)
> {
> if (!closed)
> flush();
> }
> closed = true;
> }
> {code}
> I've done this in our project code base, by cloning and owning
> COSStandardOutputStream and adding it to our classpath first. Not ideal.
> Also, mailing list thread on openjdk that recognizes the bug
> http://marc.info/?t=141767408700004&r=1&w=2. Although, it is fixed in Java
> 9 with no plan of backporting. Not sure how to request a backport, but
> that would be the ideal solution.
> original mailing list report
> http://asfmail.lucidworks.io/mail_files/pdfbox-users/201509.mbox/%3ccalrfkrtvyzc1y7cfxg8x17kkmd+7byyxgxsr0umqxz_mvd0...@mail.gmail.com%3E
> (note: listed versions I know this affects)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]