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)