如何通过 ItextSharp
合并多个 pdf 文件(在运行时生成),然后打印它们。
我发现了以下link但考虑到存储的 pdf 文件,该方法需要 pdf 名称,而这不是我的情况。
<小时 />我有多个报告,我将通过此方法将它们转换为 pdf 文件
:
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();
}
现在我想将所有这些生成的文件(字节
)合并到一个 pdf 文件中以进行打印
请您参考如下方法:
如果要使用iText(Sharp)合并源文档,有两种基本情况:
您确实想要合并文档,以原始格式获取页面,传输尽可能多的内容和交互式注释。在这种情况下,您应该使用基于
Pdf*Copy*
成员的解决方案。类家族。您实际上希望将源文档中的页面集成到新文档中,但希望新文档控制通用格式,并且不关心原始文档中的交互功能(注释...)(甚至想要删除它们)。在这种情况下,您应该使用基于
PdfWriter
的解决方案类。
您可以在 chapter 6 中找到详细信息(特别是 iText in Action — 2nd Edition 的第 6.4 节) 。 Java示例代码可以访问here和 C# 化版本 here .
使用 PdfCopy
的简单示例是 Concatenate.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
能够检测冗余内容,但它需要比PdfCopy
更多的内存和CPU .PdfWriter
:从头开始生成 PDF 文档。可以从其他 PDF 文档导入页面。主要缺点是导入页面的所有交互功能(注释、书签、字段等)都会在此过程中丢失。