一尘不染

如何合并多个pdf文件(在运行时生成)?

c#

如何合并多个pdf文件(在运行时生成),ItextSharp然后进行打印。

我找到了以下链接,但是考虑到已存储的pdf文件,该方法需要pdf名称,这不是我的情况。


我有多个报告,我将pdf files通过以下方法将它们转换为:

private void AddReportToResponse(LocalReport followsReport)
{
    string mimeType;
    string encoding;
    string extension;
    string[] streams = new string[100];
    Warning[] warnings = new Warning[100];
    byte[] pdfStream = followsReport.Render("PDF", "", out mimeType, out encoding, out extension, out streams, out warnings);
  //Response.Clear();
  //Response.ContentType = mimeType;
  //Response.AddHeader("content-disposition", "attachment; filename=Application." + extension);
  //Response.BinaryWrite(pdfStream);
  //Response.End();
}

现在我想将所有生成的文件(Bytes)合并到一个pdf文件中以进行打印


阅读 321

收藏
2020-05-19

共1个答案

一尘不染

如果要使用iText(Sharp)合并源文档,则有两种基本情况:

  1. 您确实要合并文档,以原始格式获取页面,并尽可能多地传输其内容和交互式注释。在这种情况下,您应该使用基于Pdf*Copy*类族成员的解决方案。

  2. 您实际上是想将源文档中的页面集成到一个新文档中,但希望新文档支配通用格式,而不关心原始文档中的交互功能(注释…)(甚至想摆脱它)其中)。在这种情况下,您应该使用基于PdfWriter类的解决方案。

您可以在《 iText in Action
—第二版》的
第6章(尤其是6.4节)中找到详细信息。Java的示例代码可以访问这里和C#“指明分数版本在这里

使用一个简单的示例PdfCopyConcatenate.java
/
Concatenate.cs。中央代码是:

byte[] mergedPdf = null;
using (MemoryStream ms = new MemoryStream())
{
    using (Document document = new Document())
    {
        using (PdfCopy copy = new PdfCopy(document, ms))
        {
            document.Open();

            for (int i = 0; i < pdf.Count; ++i)
            {
                PdfReader reader = new PdfReader(pdf[i]);
                // loop over the pages in that document
                int n = reader.NumberOfPages;
                for (int page = 0; page < n; )
                {
                    copy.AddPage(copy.GetImportedPage(reader, ++page));
                }
            }
        }
    }
    mergedPdf = ms.ToArray();
}

在这里pdf可以被定义为List<byte[]>直接包含在源文件(在适当的合并中间内存的文件你的使用情况),或者作为一个List<String>包含源文档文件名(在适当的,如果你从磁盘合并文档)。

本章末尾的概述总结了所提到的类的用法:

  • PdfCopy:从一个或多个现有PDF文档中复制页面。主要缺点:PdfCopy无法检测到多余的内容,并且在连接表单时会失败。

  • PdfCopyFields:将不同形式的字段合并为一种形式。可用于避免在使用串联表单时遇到表单字段问题PdfCopy。内存使用可能是一个问题。

  • PdfSmartCopy:从一个或多个现有PDF文档中复制页面。PdfSmartCopy能够检测到冗余内容,但是它比占用更多的内存和CPU PdfCopy

  • PdfWriter:从头开始生成PDF文档。可以从其他PDF文档导入页面。主要缺点是在此过程中会丢失导入页面的所有交互功能(注释,书签,字段等)。

2020-05-19