【问题标题】:iText7 Merge of Multiple PDF MemoryStreams Not Working多个PDF MemoryStreams的iText7合并不起作用
【发布时间】: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


    【解决方案1】:

    合并是一个非常简单的过程:

            var SourceDocument1 = new PdfDocument(new PdfReader(SRC));
            var SourceDocument2 = new PdfDocument(new PdfReader(SRC1));
            
            
            byte[] result;
    
            using (var memoryStream = new MemoryStream())
            {
                var pdfWriter = new PdfWriter(memoryStream);
                var pdfDocument = new PdfDocument(pdfWriter);
                PdfMerger merge = new PdfMerger(pdfDocument);
                merge.Merge(SourceDocument1, 1, SourceDocument1.GetNumberOfPages())
                    .Merge(SourceDocument2, 1, SourceDocument2.GetNumberOfPages());
    
                merge.Close();
                result = memoryStream.ToArray();
            }
    
            File.WriteAllBytes(@"C:\temp\file.pdf", result);
    

    这会将 SRC 与 SRC1 合并。

    Github上有很多例子,比如this one(还有一整文件夹跟merge examples)。

    最后我正在编写目标文档,只是为了确保它被正确创建,但当然,您可以使用 MemoryStream 做任何您想做的事情。

    【讨论】:

    • 非常感谢您的回答,我一定会试试的
    • 嗨,安德烈,我已经尝试了该文件夹中的几乎所有示例,但似乎没有一个对我有用,您能否通过遍历文档并将它们合并为您在此处提供的解决方案完全不符合我的要求
    • @HemanthMannam,所以您想要的是将文档列表 (SRC_n) 合并到内存中的单个 PDF 中?
    • 是的,我有一个 f 文件列表,当我尝试这个策略时,它对我来说并不奏效,所以目前合并文件我已经合并了 html 并创建了一个 pdf 文件
    • 我仍然不明白我的解决方案与您想要实现的目标之间的区别,对不起。也许您可以发布一些文档示例?
    猜你喜欢
    • 2020-01-14
    • 2017-03-28
    • 2022-01-12
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2016-04-07
    相关资源
    最近更新 更多