Combine two (or more) PDF's

后端 未结 17 1468
梦毁少年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:35

    Following method gets a List of byte array which is PDF byte array and then returns a byte array.

    using ...;
    using PdfSharp.Pdf;
    using PdfSharp.Pdf.IO;
    
    public static class PdfHelper
    {
        public static byte[] PdfConcat(List lstPdfBytes)
        {
            byte[] res;
    
            using (var outPdf = new PdfDocument())
            {
                foreach (var pdf in lstPdfBytes)
                {
                    using (var pdfStream = new MemoryStream(pdf))
                    using (var pdfDoc = PdfReader.Open(pdfStream, PdfDocumentOpenMode.Import))
                        for (var i = 0; i < pdfDoc.PageCount; i++)
                            outPdf.AddPage(pdfDoc.Pages[i]);
                }
    
                using (var memoryStreamOut = new MemoryStream())
                {
                    outPdf.Save(memoryStreamOut, false);
    
                    res = Stream2Bytes(memoryStreamOut);
                }
            }
    
            return res;
        }
    
        public static void DownloadAsPdfFile(string fileName, byte[] content)
        {
            var ms = new MemoryStream(content);
    
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ContentType = "application/pdf";
            HttpContext.Current.Response.AddHeader("content-disposition", $"attachment;filename={fileName}.pdf");
            HttpContext.Current.Response.Buffer = true;
            ms.WriteTo(HttpContext.Current.Response.OutputStream);
            HttpContext.Current.Response.End();
        }
    
        private static byte[] Stream2Bytes(Stream input)
        {
            var buffer = new byte[input.Length];
            using (var ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                    ms.Write(buffer, 0, read);
    
                return ms.ToArray();
            }
        }
    }
    

    So, the result of PdfHelper.PdfConcat method is passed to PdfHelper.DownloadAsPdfFile method.

    PS: A NuGet package named [PdfSharp][1] need to be installed. So in the Package Manage Console window type:

    Install-Package PdfSharp

提交回复
热议问题