Quel est le moyen le plus simple de fusionner (côté serveur) une collection de documents PDF en un seul grand document PDF au format JAVA

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

  •  01-07-2019
  •  | 
  •  

Question

J'ai 3 documents PDF générés à la volée par une bibliothèque héritée que nous utilisons et écrits sur disque. Quel est le moyen le plus simple pour mon code de serveur JAVA de récupérer ces 3 documents et de les transformer en un long document PDF contenant toutes les pages du document n ° 1, suivies de toutes les pages du document n ° 2, etc.

Idéalement, j'aimerais que cela se produise en mémoire pour pouvoir le renvoyer sous forme de flux au client, mais l'écrire sur le disque est également une option.

Était-ce utile?

La solution

@J D OConal, merci pour le conseil, l'article que vous m'avez envoyé était très dépassé, mais il m'a orienté vers iText. J'ai trouvé cette page qui explique comment faire exactement ce dont j'ai besoin: http: //java-x.blogspot. com / 2006/11 / merge-pdf-files-with-itext.html

Merci pour les autres réponses, mais je ne veux pas vraiment avoir à générer d'autres processus si je peux l'éviter, et notre projet a déjà itext.jar, donc je n'ajoute aucune dépendance externe

Voici le code que j'ai fini par écrire:

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();
            }
        }
    }
}

Autres conseils

J'ai utilisé pdftk de manière très efficace. C'est une application externe que vous devrez exécuter à partir de votre application java.

iText semble avoir changé et a maintenant des exigences en matière de licence commerciale, ainsi qu’une aide précieuse (Vous voulez de la documentation? Achetez notre livre!).

Nous avons fini par trouver PDFSharp http://www.pdfsharp.net/ et de l'utiliser. L'exemple de concaténation de plusieurs documents pdf est simple et facile à suivre: http: // www. pdfsharp.net/wiki/ConcatenateDocuments-sample.ashx

Profitez Aléatoire

Consultez cette liste des bibliothèques PDF open source Java .

Consultez également cet article .

[Edit: Il y a toujours Ghostscript, qui est facile à utiliser, mais qui veut plus de dépendances?]

PDFBox est de loin le moyen le plus simple d'y parvenir. Il existe un utilitaire appelé PDFMerger dans le code qui rend les choses très faciles, il me suffisait d’une boucle for et de deux lignes de code et tout était fait:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top