Kann das duplizieren einer pdf mit PDFBox klein sein wie mit iText?
Lese ich in einer PDF-Datei und eine PDF Datei ausgeben, die mit mehreren Kopien des original-PDF in es. Ich Teste, indem Sie die gleiche Sache für beide PDFBox und iText. iText erzeugt eine viel kleinere Ausgabe, wenn ich Dupliziere jede Seite einzeln.
Die Frage: gibt es eine andere Möglichkeit, dies zu tun in PDFBox, die Ergebnisse in kleineren Ausgabe von PDF-Dokumenten.
Für eine Beispiel-input-Datei, erzeugt zwei Kopien, um die Ausgabe mit beiden tools:
- Ursprüngliche PDF-Datei, Größe: 30K
- PDFBox (v 1.7.1) generierten PDF: 84K
- iText (v 5.3.4) erzeugt PDF: 35K
Java-code für PDFBox (sorry zuzufügen Fehlerbehandlung auf Sie). Beachten Sie, wie es liest die Eingabe über und über und Duplikate, die es als ganzes:
PDFMergerUtility merger = new PDFMergerUtility();
PDDocument workplace = null;
try {
for (int cnt = 0; cnt < COPIES; ++cnt) {
PDDocument document = null;
InputStream stream = null;
try {
stream = new FileInputStream(new File(sourceFileName));
document = PDDocument.load(stream);
if (workplace == null) {
workplace = document;
} else {
merger.appendDocument(workplace, document);
}
} finally {
if (document != null && document != workplace) {
document.close();
}
if (stream != null) {
stream.close();
}
}
}
OutputStream out = null;
try {
out = new FileOutputStream(new File(destinationFileName));
workplace.save(out);
} finally {
if (out != null) {
out.close();
}
}
} catch (COSVisitorException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (workplace != null) {
try {
workplace.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Code, es zu tun mit iText. Beachten Sie, wie es lädt die input-Datei Seite für Seite und überträgt auf jeder Seite, um die Ausgabe:
Document document = null;
PdfReader reader = null;
InputStream inputStream = null;
FileOutputStream outputStream = null;
try {
inputStream = new FileInputStream(new File(sourceFileName));
outputStream = new FileOutputStream(new File(destinationFileName));
document = new Document();
PdfCopy copy = new PdfSmartCopy(document, outputStream);
document.open();
reader = new PdfReader(inputStream);
//loop over the pages in that document
int pdfPageNo = reader.getNumberOfPages();
for (int page = 0; page < pdfPageNo;) {
PdfImportedPage onePage = copy.getImportedPage(reader, ++page);
//duplicate each page N times
for (int i = 0; i < COPIES; ++i) {
copy.addPage(onePage);
}
}
copy.freeReader(reader);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
if (document != null) {
document.close();
}
try {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
//do nothing
}
}
Beide sind umgeben von dieser:
public class Duplicate {
/** The original PDF file */
private static final String sourceFileName = "PDF_CI_US2CA.pdf";
/** The resulting PDF file. */
private static final String destinationFileName = "itext_output.pdf";
private static final int COPIES = 2;
public static void main(String[] args) {
...
}
}
- IMHO ist dies mehr eine Frage der ökonomie als eine rein technische Frage. Sie haben eine funktionierende Lösung mit iText, aber Sie verwenden möchten PdfBox. Die Wahl kommt zu einem Preis. Ich denke, Sie bevorzugen PdfBox, weil der ASL. Jedoch, als niemand zahlt für PdfBox, Sie sollten nicht erwarten, dass die Bibliothek so schnell, feature-rich, komplett,... änderte ich die iText-Lizenz von MPL/AGPL zu AGPL im Jahr 2009, weil ich brauchte, um zu starten Erzielung von Einnahmen, um sicherzustellen, die weitere Entwicklung der Bibliothek. Ohne, dass der Umsatz, iText haben würde, starb einen langsamen Tod.
- Ich verstehe, was du sagst, aber da ich kein Experte bin entweder in der Bibliothek fand ich eine funktionierende Lösung. Vielleicht gibt es eine andere Lösung mit PDFBox erstellt kleinere PDF-Dateien. Vielleicht auch nicht. Vielleicht iText ist einfach besser in dieser Hinsicht für meine Bedürfnisse. Ich will einfach nur etwas Hilfe von Experten in jedem der beiden Werkzeuge. Dies wirft die Frage auf, da Sie der Experte auf iText, als ob ich eine optimale Lösung für die Erstellung von doppelten Seiten in iText?
- PdfSmartCopy hält einen hash bestimmter Objekte wie streams (in der frühen version von iText) und font-Wörterbücher (in neueren Versionen) in Erinnerung. Wenn ein Objekt wiederverwendet wird, fügen wir eine Referenz auf das original-Objekt, anstatt Sie zu duplizieren (wie wäre der Fall, wenn mit PdfCopy statt PdfSmartCopy). Acrobat hat sogar einen besseren job: Acrobat Zusammenführen können verschiedene Teilmengen der gleichen schriftart, die in einem (größeren) Teil der Arbeit. Wir unterstützen nicht, dass (noch), denn es geht um das umschreiben gesamten Seiteninhalte (nicht trivial + mehr CPU / Arbeitsspeicher-Bedarf).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe der folgenden Lösung, ich war in der Lage, eine PDF-Datei erstellen mit viele doppelte Seiten und haben kaum Einfluss auf die Lagerung.
In meinem ersten Versuch habe ich verwendet,
samplePdf.addPage(page)
aber es hat nicht funktioniert wie erwartet. Also offensichtlich gibt es einen Unterschied zwischen denadd
undimport
Funktionen. Ich ll haben zu prüfen, die Quelle oder Dokumentation, um zu sehen, warum. Wie auch immer, dies sollte helfen, Sie entwickeln eine Lösung für Ihre Bedürfnisse mit PDFBox..get(0)
zu einer Schleife über alle Seiten in diesemList
.PDPage newPage = new PDPage( (COSDictionary)cloner.cloneForNewDocument( page.getCOSDictionary() ) );
Diese noch spart Speicherplatz, können mehr Speicher, aber es vermeidet Komplikationen detailliert in dem oben genannten link.