当前位置: 首页 > 知识库问答 >
问题:

iText7合并多个PDF内存流无效

长孙鸿振
2023-03-14

我试图从多个内存流生成一个PDF文件,但在确定将2个PDF MemoryStream合并为一个PDF MemoryStream的正确方法时遇到了很多困难,该PDF MemoryStream包含来自两个源PDF MemoryStream的所有页面。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流并不包含这两个文件的组合。

我很难确定将2个PDF MemoryStream合并为一个PDF MemoryStream的正确方法,该PDF MemoryStream包含来自两个源PDF MemoryStream的所有页面。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流不包含合并的文档。

我在互联网上找到了多种方法作为合并的“正确”方式。iText 7的实际示例代码似乎异常复杂(即反复将多个概念混合到一个示例中,因为在中没有将概念简化为尽可能简单的代码),并且似乎无法演示简单的概念。例如,他们的PDFMerge文档中根本没有示例代码(我在类文档中也没有看到任何其他内容)。他们在网上的例子实际上总是将文件合并(不是MemoryStream或byte[])与添加页码或添加目录等其他概念混合在一起。所以他们从不只是展示一个概念,也从不从文件以外的任何东西开始。我的PDF文件来自一个数据库,我们只需要将它们合并到一个PDF内存流中,然后再保存回来。我担心的是,在初始化PDFWriter时,可能没有正确创建MemoryStream。由于他们的样本都是以实际文件开头的,所以我无法确认这是正确的。我还完全限定了代码中的所有对象,因为我想在升级到新的iText 7时保留旧的iTextSharp代码。这样做是为了确保同名的iTextSharp对象不会被无意中使用。

此外,为了使源代码尽可能容易阅读,我删除了一些声明和正在使用的对象的初始化。所有的东西都被跟踪了,所有的值都被完全加载了正确的值,因为你在代码中跟踪。我假设问题是我没有正确准备PDF对象,或者我必须在PDFMerge对象之前对目标PDF文档上的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);
                    html" target="_blank">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();

共有1个答案

胥宏义
2023-03-14

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

        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上有很多示例,比如这一个(还有一个包含合并示例的完整文件夹)。

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

 类似资料:
  • 我正在将一些旧的iTextSharp代码升级到新的iText 7库。我很难确定将2个PDF MemoryStream合并为一个PDF MemoryStream的正确方法,该PDF MemoryStream包含来自两个源PDF MemoryStream的所有页面。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流只包含第一个文件。第二个PDF文件从未出现,也从未连接到第一个PDF文件。

  • 我有几份产品数据表。每个文件都是一个单独的文件。我想做的是使用iText根据Web表单的答案生成一组摘要/建议的操作,然后将所有相关的数据表附加到这些操作中。这样,我只需要在浏览器中打开一个新选项卡来打印所有信息,而不是为摘要打开一个选项卡,为所需的每个数据表打开一个选项卡。 那么,使用iText可以做到这一点吗?

  • 我必须将多个1页pdf合并为一个pdf。我使用iTextSHarp 5.5.5.0来实现这一点,但当我合并超过900-1000个pdf时,会出现内存不足异常。我注意到,即使我释放并关闭阅读器,内存也不会得到正确的清理(进程使用的内存量永远不会减少),所以我想知道我可能做错了什么。这是我的代码: 它从来没有开始写文件,我在p.Copy()过程中得到一个内存不足的异常。AddPage()部分。我甚至尝

  • 我有一本书的多份副本。不同用户评论的pdf文档。我想把所有这些评论合并成一个新的pdf“合并”。 我在一个名为“路径”和“目录”属性的文档类中编写了这个子类。 这段代码导致了一个我无法解决的异常。 iText。内核PDFEException:“Pdf间接对象属于其他Pdf文档。将对象复制到当前pdf文档。' 要执行此任务,我需要更改什么?还是我完全摆脱了我的代码块?

  • 主要内容:合并多个PDF文档,示例在前一章中,我们已经看到如何将给定的PDF文档分成多个文档。 现在让我们学习如何将多个PDF文档合并为一个文档。 合并多个PDF文档 使用类的类将多个PDF文档合并到单个PDF文档中,该类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。 以下是合并多个PDF文档的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态

  • 我正在将代码从iText5迁移到iText7,目前我正在努力将一个签名添加到已经包含另一个签名的PDF中。这些签名是用我们的国民身份证(公民卡)进行的。 在iText5中,我使用了PdfStamper,但它在Itext7中丢失了... 这是我目前所掌握的: POReID(https://github.com/POReID/POReID)是用于与智能卡交互的库。 当第一次签署文件时,它工作得很好。再