c# - 为什么我不能使用 iTextSharp 使用此代码将 PDF 附加到另一个 PDF?
问题描述
我正在尝试使用 iTextSharp 将两个 PDF 文件的内容合并到一个新的 PDF 文件中。我之前在类似情况下使用过 PDFStamper 来完成此操作,但由于某种原因它这次无法正常工作。附加根本不起作用;该文件已创建,但到此代码块结束时大小保持为 0 字节。任何人都可以提供任何帮助将不胜感激。
File.Create(session.getLocalDir() + newPdfFile);
// pasting content from original file to new file
PdfReader reader = new PdfReader(originalFile);
string pageSelection = "1-" + reader.NumberOfPages;
reader.SelectPages(pageSelection);
PdfStamper stamper = new PdfStamper(reader, new FileStream(newPdfFile, FileMode.Append, FileAccess.Write));
stamper.Close();
reader.Close();
// pasting content from temp file to new file
reader = new PdfReader(temp);
pageSelection = "1-" + reader.NumberOfPages;
reader.SelectPages(pageSelection);
stamper = new PdfStamper(reader, new FileStream(newPdfFile, FileMode.Append, FileAccess.Write));
stamper.Close();
reader.Close();
解决方案
这里最简单的解决方案是在添加临时 pdf 文件时使用 MemoryStream 保存它。经过一些研究,我发现正如 mkl 所暗示的那样, PdfStamper 类不适合此操作。在 iTextSharp 中,您可以使用另一种方式附加 2 个 PDF:
MemoryStream stream = new MemoryStream();
PdfCopyFields copy = new PdfCopyFields(stream);
var ms1 = new MemoryStream(File.ReadAllBytes(file1Path));
ms1.Position = 0;
copy.AddDocument(new PdfReader(ms1));
ms1.Dispose();
var ms2 = new MemoryStream(File.ReadAllBytes(file2Path));
ms2.Position = 0;
copy.AddDocument(new PdfReader(ms2));
ms2.Dispose();
copy.Close();
生成的“流”变量包含组合的 PDF,可以使用 PdfStamper 写入文件。
如果可以选择切换到 .net 的 iText 7,则可以省略 PdfStamper,而可以使用 PdfDocument.copyPagesTo() 方法。
一个简单的例子(使用 iText 7 for .net):
MemoryStream stream = new MemoryStream();
PdfDocument outputDocument = new PdfDocument(new PdfWriter(stream));
PdfDocument pdfSource = new PdfDocument(new PdfReader("c:\\firstInput.pdf"));
pdfSource.CopyPagesTo(1, pdfSource.GetNumberOfPages(), outputDocument);
pdfSource = new PdfDocument(new PdfReader("c:\\secondInput.pdf"));
pdfSource.CopyPagesTo(1, pdfSource.GetNumberOfPages(), outputDocument);
pdfSource.Close();
outputDocument.Close();
MemoryStream outputStream = new MemoryStream(stream.ToArray());
outputDocument = new PdfDocument(new PdfReader(outputStream), new PdfWriter("c:\\result.pdf"));
第二次编辑了针对特定用例的解决方案。
推荐阅读
- python - 根据给定条件对组合数据进行分组
- css - Tailwind css中带有文本的圆圈
- html - Flexbox - 将元素向右“flex-direction:column”而不使用css中的位置
- php - 在命令模式下运行时出现 PDOException “找不到驱动程序”
- javascript - 如何使用 JSON asp.net MVC 同时发送两个数组以查看
- android - 有没有办法过滤/搜索项目以从 sqlite android 返回列表?
- angular - Angular 10 NgForm
- css - SVG 动画 - 来自中心的 SVG 的 CSS 悬停动画
- node.js - 子域基础数据库连接(nodejs + express)
- android - ViewModel 单元测试 - 使用延迟