【发布时间】:2020-10-19 18:48:09
【问题描述】:
我正在尝试从多个内存流生成单个 PDF 文件,我在确定将 2 个 PDF 内存流合并为一个包含两个源 PDF 内存流的所有页面的 PDF 内存流的正确方法时遇到了很多麻烦。看起来很简单,我认为下面的代码设置正确,但生成的 PDF 内存流不包含合并的文件。
我在确定将 2 个 PDF MemoryStreams 合并为一个 PDF MemoryStreams 的正确方法时遇到了很多麻烦,该 PDF MemoryStreams 包含来自两个源 PDF MemoryStreams 的所有页面。看起来很简单,我认为下面的代码设置正确,但生成的 PDF 内存流不包含合并文档。
我在 Internet 上发现了多种“正确”的合并方式。 iText 7 的实际示例代码似乎异常复杂(即重复地将多个概念混合到一个示例中 - 因为不会将概念简化为最简单的代码),并且似乎无法演示简单的概念。例如,他们的 PDFMerge 文档在文档中根本没有示例代码(我在类文档中也没有其他任何内容)。他们在线提供的示例实际上总是将文件合并(不是 MemoryStreams 或 byte[])与添加页码或添加目录等其他概念混合在一起。所以他们从不只展示一个概念,他们从不从文件以外的任何东西开始。我的 PDF 来自数据库,我们只需要将它们合并到一个 PDF 内存流中并将其保存回来。我担心的是,当我初始化 PDFWriter 时,我可能没有正确创建 MemoryStream。由于他们的样本除了初始文件之外没有做任何事情,我无法确认这是否正确完成。我还完全限定了代码中的所有对象,因为我想在升级到新的 iText 7 时保留旧的 iTextSharp 代码。这样做是为了确保不会无意中使用同名的 iTextSharp 对象.
此外,为了使源代码尽可能易于阅读,我删除了一些正在使用的对象的声明和初始化。当您跟踪代码时,所有内容都被跟踪,并且所有值都完全加载了适当的值。我假设问题是我没有正确准备 PDF 对象,或者我必须在 PDFMerge 对象之前对目标 PDF 文档 (ms) 上的 PDFWriter 做一些特殊的事情。
List<byte[]> streams = new List<byte[]>();
somelist.ForEach(item=>
{
using (var workStream = new MemoryStream())
using (var pdfWriter = new PdfWriter(workStream))
{
pdfWriter.SetCloseStream(false);
HtmlConverter.ConvertToPdf(strContent, pdfWriter);
streams.Add(workStream.ToArray());
pdfWriter.Close();
}
}
MemoryStream ms = new MemoryStream();
PdfWriter writer = new PdfWriter(ms);
PdfDocument document = new PdfDocument(writer);
PdfMerger merger = new PdfMerger(document);
streams.ForEach(stream =>
{
Stream msDoc = new MemoryStream(stream);
PdfDocument doc = new PdfDocument(new PdfReader(msDoc));
merger.Merge(doc, 1, doc.GetNumberOfPages());
doc.Close();
});
ByteContent = ms.ToArray();
document.Close();
【问题讨论】:
标签: c# pdf .net-core merge itext7