ما هي أسهل طريقة لدمج (server-side) مجموعة من وثائق PDF إلى وثيقة PDF في جافا

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

  •  01-07-2019
  •  | 
  •  

سؤال

لدي 3 وثائق PDF التي يتم إنشاؤها على الطاير من تراث المكتبة التي نستخدمها و كتابتها إلى القرص.ما هي أسهل طريقة بالنسبة لي خادم جافا البرمجية إلى انتزاع هذه 3 الوثائق وتحويلها إلى واحدة طويلة وثيقة PDF حيث انها فقط في كل صفحة من المستند رقم 1 ، تليها كل الصفحات من المستند #2, إلخ.

من الناحية المثالية أود أن يحدث هذا في الذاكرة حتى أتمكن من العودة على أنها تيار إلى العميل ، لكن الكتابة إلى القرص هو أيضا خيار.

هل كانت مفيدة؟

المحلول

@ي د OConal, شكرا على النصيحة يا المقالة التي أرسلتها كانت قديمة جدا ، ولكنها تشير إلى iText.لقد وجدت هذه الصفحة التي تشرح كيفية القيام بالضبط ما أريد:http://java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html

شكرا على إجابات أخرى, ولكن أنا حقا لا أريد أن تفرخ عمليات أخرى إذا كان لا يمكن تجنب ذلك ، لدينا مشروع لديه بالفعل itext.jar لذا أنا لا إضافة أي الخارجية dependancies

هنا هو رمز انتهى الكتابة:

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

نصائح أخرى

لقد استعملت pdftk إلى تأثير كبير.إنه خارجي التطبيق الذي سيكون لديك لتشغيل من جافا الخاص بك التطبيق.

iText يبدو أنه قد تغير الآن التجارية الترخيص متطلبات جنبا إلى جنب مع ليست جيدة المساعدة (أريد الوثائق ؟ شراء الكتاب!).

لقد انتهى الأمر إيجاد PDFSharp http://www.pdfsharp.net/ واستخدام ذلك.العينة بالنسبة وصل وثائق pdf متعددة معا بسيطة وسهلة لمتابعة: http://www.pdfsharp.net/wiki/ConcatenateDocuments-sample.ashx

الاستمتاع عشوائية

نلقي نظرة على هذا قائمة جافا مفتوحة المصدر في المكتبات PDF.

تحقق أيضا هذه المادة.

[تحرير:هناك دائما غوستسكريبت التي هي سهلة الاستخدام ، ولكن من يريد المزيد من تبعيات?]

PDFBox هو إلى حد بعيد أسهل طريقة لتحقيق هذا, هناك أداة تسمى PDFMerger داخل الكود الذي يجعل الأمور سهلة جدا, كل ما أحاط لي حلقة و 2 الأسطر من التعليمات البرمجية في كل ذلك :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top