2016-04-19 3 views
1

basierend auf this SO question Ich habe versucht, jede einzelne Seite in einer PDF-Datei zu lesen. Der Hintergrund ist, dass ich versuche, Seiten zu ersetzen, die keinen Text enthalten, aber Bilder mit komplett leeren Seiten enthalten. Der Hintergrund dafür ist, dass die PDF leere Seiten enthalten kann, die möglicherweise Bilder enthalten. Diese Seiten müssen da sein, weil sie gerade mit Duplex gedruckt werden.PDFBox 2.0 Einzelne Seite lesen und in eine neue Datei schreiben/speichern

Aber mit PDFBox 2.0 scheint das ein bisschen komplizierter zu sein, da ich in einen Stacktrace renne, jedes Mal wenn ich versuche, die frisch erzeugte PDDocument zu speichern. Sollte dies mit der neuen Version von PDFBox 2.0 anders gemacht werden? Sollte ich vermeiden, die PDDocument buffer zu schließen, weil durch das Auslassen das Beispielprogramm ausnahmslos läuft und was könnten mögliche Nebenwirkungen davon sein?

ein einfaches laufendes Beispiel kann hier gesehen werden. Sie können eine beliebige PDF-Datei verwenden, da das Ergebnis eine PDF-Datei mit der gleichen Menge von Seiten sein, der leer sein sollte:

public static void main(String[] args) throws IOException { 
    // Load a simple pdf file 
    PDDocument d = PDDocument.load(new File("D:\\test.pdf")); 
    // This should be our new output pdf 
    PDDocument c = new PDDocument(); 
    for(int i = 0;i<d.getNumberOfPages();++i) { 
     // From the SO question, create a new PDDocument and just add the single page 
     PDDocument buffer = new PDDocument(); 
     PDPage page = d.getPage(i); 
     buffer.addPage(page); 

     // Here i´d check if it has content but gonna leave it out now 

     // Reassign the page variable to generate a "blank" pdf 
     page = new PDPage(); 

     // In order to let some printers not ignore the blank page I have to 
     // write white text on the white background. 
     PDPageContentStream contentStream = new PDPageContentStream(buffer, page); 

     PDFont font = PDType1Font.HELVETICA_BOLD; 
     contentStream.beginText(); 
     contentStream.setNonStrokingColor(Color.white); // !!!!!! 
     contentStream.setFont(font, 6); 
     contentStream.newLineAtOffset(100, 700); 
     contentStream.showText("Empty page"); 
     contentStream.endText(); 
     contentStream.close(); 
     // Close the buffer document, if i comment it out the exception is gone 
     buffer.close(); 
     // Add the blank page 
     c.addPage(page); 
    } 
    d.close(); 
    // The exception occurs here and seems to be connected with the closing of the buffer document 
    c.save("D:\\newtest.pdf"); 
    c.close(); 
} 

stacktrace:

Exception in thread "main" java.io.IOException: Scratch file already closed 
at org.apache.pdfbox.io.ScratchFile.checkClosed(ScratchFile.java:390) 
at org.apache.pdfbox.io.ScratchFileBuffer.checkClosed(ScratchFileBuffer.java:99) 
at org.apache.pdfbox.io.ScratchFileBuffer.seek(ScratchFileBuffer.java:295) 
at org.apache.pdfbox.io.RandomAccessInputStream.restorePosition(RandomAccessInputStream.java:47) 
at org.apache.pdfbox.io.RandomAccessInputStream.read(RandomAccessInputStream.java:78) 
at java.io.InputStream.read(InputStream.java:101) 
at org.apache.pdfbox.io.IOUtils.copy(IOUtils.java:66) 
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1134) 
at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:372) 
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:533) 
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:450) 
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1034) 
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:409) 
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1284) 
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1185) 
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1110) 
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1082) 
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1070) 
at pdftools.Test.main(Test.java:41) 

Antwort

1

Ihr Code ist etwas verwirrend, aber Der Kern des Problems besteht darin, dass Sie in 2.0 Dokumente nicht schließen sollten, wenn Sie ihre Seiten in einem anderen Dokument verwenden.

sind so hier einige Lösungen:

  • schließen Sie den Puffer Dokument, anstatt diese Dokumente behalten, bis getan
  • die Seite erstellen und dessen Inhalt zweimal
  • die neue Seite für das Ziel erstellen nur (Warum erstellen Sie es für "Puffer", die Sie sowieso dumping sind?)
  • statt Seiten mit addPage() duplizieren, verwenden Sie importPage(). Dies wird eine tiefe Kopie machen.
Verwandte Themen