Was ist der einfachste Weg (Server-Seite) eine Sammlung von PDF-Dokumenten in einem großen PDF-Dokument in JAVA zu fusionieren

StackOverflow https://stackoverflow.com/questions/90350

  •  01-07-2019
  •  | 
  •  

Frage

Ich habe 3 PDF-Dokumente, die im laufenden Betrieb von einer Legacy-Bibliothek erzeugt werden, die wir verwenden, und auf der Festplatte geschrieben. Was ist der einfachste Weg, um Code für meinen JAVA-Server dieser drei Dokumente zu greifen und sie in ein langen PDF-Dokument drehen, wo es nur alle Seiten aus dem Dokument # 1, gefolgt von allen Seiten aus dem Dokument # 2, etc.

Im Idealfall möchte ich dies in Erinnerung passieren, damit ich es als Stream an den Client zurückgeben kann, aber es auf der Festplatte zu schreiben ist auch eine Option.

War es hilfreich?

Lösung

@J D OConal, danke für den Tipp, der Artikel, den Sie mir geschickt war sehr veraltet, aber es hat mich in Richtung iText zeigen. Ich fand diese Seite, die erklärt, wie genau das zu tun, was ich brauche: http: //java-x.blogspot. com / 2006/11 / merge-pdf-Dateien-mit-itext.html

Danke für die anderen Antworten, aber ich mag wirklich nicht haben, andere Prozesse, um laichen, wenn ich es vermeiden kann, und unser Projekt bereits itext.jar, so dass ich keine externen Abhängigkeiten Hinzufügen

Hier ist der Code, den ich am Ende schriftlich:

public class PdfMergeHelper {

    /**
     * Merges the passed in PDFs, in the order that they are listed in the java.util.List.
     * Writes the resulting PDF out to the OutputStream provided.
     * 
     * Sample Usage:
     * List<InputStream> pdfs = new ArrayList<InputStream>();
     * pdfs.add(new FileInputStream("/location/of/pdf/OQS_FRSv1.5.pdf"));
     * pdfs.add(new FileInputStream("/location/of/pdf/PPFP-Contract_Genericv0.5.pdf"));
     * pdfs.add(new FileInputStream("/location/of/pdf/PPFP-Quotev0.6.pdf"));
     * FileOutputStream output = new FileOutputStream("/location/to/write/to/merge.pdf");
     * PdfMergeHelper.concatPDFs(pdfs, output, true);
     * 
     * @param streamOfPDFFiles the list of files to merge, in the order that they should be merged
     * @param outputStream the output stream to write the merged PDF to
     * @param paginate true if you want page numbers to appear at the bottom of each page, false otherwise
     */
    public static void concatPDFs(List<InputStream> streamOfPDFFiles, OutputStream outputStream, boolean paginate) {
        Document document = new Document();
        try {
            List<InputStream> pdfs = streamOfPDFFiles;
            List<PdfReader> readers = new ArrayList<PdfReader>();
            int totalPages = 0;
            Iterator<InputStream> iteratorPDFs = pdfs.iterator();

            // Create Readers for the pdfs.
            while (iteratorPDFs.hasNext()) {
                InputStream pdf = iteratorPDFs.next();
                PdfReader pdfReader = new PdfReader(pdf);
                readers.add(pdfReader);
                totalPages += pdfReader.getNumberOfPages();
            }
            // Create a writer for the outputstream
            PdfWriter writer = PdfWriter.getInstance(document, outputStream);

            document.open();
            BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
            // data

            PdfImportedPage page;
            int currentPageNumber = 0;
            int pageOfCurrentReaderPDF = 0;
            Iterator<PdfReader> iteratorPDFReader = readers.iterator();

            // Loop through the PDF files and add to the output.
            while (iteratorPDFReader.hasNext()) {
                PdfReader pdfReader = iteratorPDFReader.next();

                // Create a new page in the target for each source page.
                while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
                    document.newPage();
                    pageOfCurrentReaderPDF++;
                    currentPageNumber++;
                    page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);
                    cb.addTemplate(page, 0, 0);

                    // Code for pagination.
                    if (paginate) {
                        cb.beginText();
                        cb.setFontAndSize(bf, 9);
                        cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "" + currentPageNumber + " of " + totalPages,
                                520, 5, 0);
                        cb.endText();
                    }
                }
                pageOfCurrentReaderPDF = 0;
            }
            outputStream.flush();
            document.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document.isOpen()) {
                document.close();
            }
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
}

Andere Tipps

Ich habe verwendet pdftk mit großer Wirkung. Es ist eine externe Anwendung, die Sie von Ihrer Java-Anwendung ausführen müssen.

iText scheint sich geändert zu haben und hat jetzt die kommerzielle Lizenzanforderungen, zusammen mit nicht so gute Hilfe (Wollen Sie Dokumentation? Unser Buch kaufen!).

Am Ende haben wir finden PDFSharp http://www.pdfsharp.net/ und die Verwendung dieser. Die Probe für die Verkettung mehrerer PDF-Dokumente zusammen ist einfach und leicht zu folgen: http: // www. pdfsharp.net/wiki/ConcatenateDocuments-sample.ashx

Genießen Zufällige

Werfen Sie einen Blick auf diese Liste von Java Open-Source-PDF-Bibliotheken .

Überprüfen Sie auch diesem Artikel .

[Edit: Es gibt immer Ghostscript, die einfach zu bedienen ist, aber wer mehr Abhängigkeiten will]

PDFBox ist bei weitem der einfachste Weg, dies zu erreichen, ist ein Dienstprogramm innerhalb des Codes genannt PDFMerger die Dinge sehr einfach macht, alle es mir nahm, war eine for-Schleife und 2 Zeilen Code in sie und alles getan:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top