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).
InformationsquelleAutor Lee Meador | 2013-01-18
Schreibe einen Kommentar