Combine two (or more) PDF's

后端 未结 17 1339
梦毁少年i
梦毁少年i 2020-12-04 07:26

Background: I need to provide a weekly report package for my sales staff. This package contains several (5-10) crystal reports.

Problem:

相关标签:
17条回答
  • 2020-12-04 07:43

    Here is a example using iTextSharp

    public static void MergePdf(Stream outputPdfStream, IEnumerable<string> pdfFilePaths)
    {
        using (var document = new Document())
        using (var pdfCopy = new PdfCopy(document, outputPdfStream))
        {
            pdfCopy.CloseStream = false;
            try
            {
                document.Open();
                foreach (var pdfFilePath in pdfFilePaths)
                {
                    using (var pdfReader = new PdfReader(pdfFilePath))
                    {
                        pdfCopy.AddDocument(pdfReader);
                        pdfReader.Close();
                    }
                }
            }
            finally
            {
                document?.Close();
            }
        }
    }
    

    The PdfReader constructor has many overloads. It's possible to replace the parameter type IEnumerable<string> with IEnumerable<Stream> and it should work as well. Please notice that the method does not close the OutputStream, it delegates that task to the Stream creator.

    0 讨论(0)
  • 2020-12-04 07:45

    I had to solve a similar problem and what I ended up doing was creating a small pdfmerge utility that uses the PDFSharp project which is essentially MIT licensed.

    The code is dead simple, I needed a cmdline utility so I have more code dedicated to parsing the arguments than I do for the PDF merging:

    using (PdfDocument one = PdfReader.Open("file1.pdf", PdfDocumentOpenMode.Import))
    using (PdfDocument two = PdfReader.Open("file2.pdf", PdfDocumentOpenMode.Import))
    using (PdfDocument outPdf = new PdfDocument())
    {                
        CopyPages(one, outPdf);
        CopyPages(two, outPdf);
    
        outPdf.Save("file1and2.pdf");
    }
    
    void CopyPages(PdfDocument from, PdfDocument to)
    {
        for (int i = 0; i < from.PageCount; i++)
        {
            to.AddPage(from.Pages[i]);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 07:46

    Here the solution http://www.wacdesigns.com/2008/10/03/merge-pdf-files-using-c It use free open source iTextSharp library http://sourceforge.net/projects/itextsharp

    0 讨论(0)
  • 2020-12-04 07:48

    Combining two byte[] using iTextSharp up to version 5.x:

    internal static MemoryStream mergePdfs(byte[] pdf1, byte[] pdf2)
    {
        MemoryStream outStream = new MemoryStream();
        using (Document document = new Document())
        using (PdfCopy copy = new PdfCopy(document, outStream))
        {
            document.Open();
            copy.AddDocument(new PdfReader(pdf1));
            copy.AddDocument(new PdfReader(pdf2));
        }
        return outStream;
    }
    

    Instead of the byte[]'s it's possible to pass also Stream's

    0 讨论(0)
  • 2020-12-04 07:49

    Here is a single function that will merge X amount of PDFs using PDFSharp

    using PdfSharp;
    using PdfSharp.Pdf;
    using PdfSharp.Pdf.IO;
    
    public static void MergePDFs(string targetPath, params string[] pdfs) {
        using(PdfDocument targetDoc = new PdfDocument()){
            foreach (string pdf in pdfs) {
                using (PdfDocument pdfDoc = PdfReader.Open(pdf, PdfDocumentOpenMode.Import)) {
                    for (int i = 0; i < pdfDoc.PageCount; i++) {
                        targetDoc.AddPage(pdfDoc.Pages[i]);
                    }
                }
            }
            targetDoc.Save(targetPath);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 07:49

    I combined the two above, because I needed to merge 3 pdfbytes and return a byte

    internal static byte[] mergePdfs(byte[] pdf1, byte[] pdf2,byte[] pdf3)
            {
                MemoryStream outStream = new MemoryStream();
                using (Document document = new Document())
                using (PdfCopy copy = new PdfCopy(document, outStream))
                {
                    document.Open();
                    copy.AddDocument(new PdfReader(pdf1));
                    copy.AddDocument(new PdfReader(pdf2));
                    copy.AddDocument(new PdfReader(pdf3));
                }
                return outStream.ToArray();
            } 
    
    0 讨论(0)
提交回复
热议问题