C# iText7合并多个PDF内存流无效

C# iText7合并多个PDF内存流无效,c#,pdf,.net-core,merge,itext7,C#,Pdf,.net Core,Merge,Itext7,我试图从多个内存流生成一个PDF文件,但在确定将2个PDF MemoryStream合并到一个包含两个源PDF MemoryStream的所有页面的PDF MemoryStream的正确方法时遇到了很多困难。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流并不包含这两个文件的组合 我在确定将2个PDF MemoryStream合并为一个包含两个源PDF MemoryStream中所有页面的PDF MemoryStream的正确方法时遇到了很多困难。这看起来很简单,我认为下面的代码设

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

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

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

此外,为了使源代码尽可能易于阅读,我删除了一些正在使用的对象的声明和初始化。所有内容都被跟踪,并且在跟踪代码时,所有值都被正确的值完全加载。我假设问题是我没有正确地准备PDF对象,或者我必须在PDFMerge对象之前对目标PDF文档(ms)上的PDFWriter执行一些特殊的操作

List streams=new List();
somelist.ForEach(项=>
{   
使用(var workStream=new MemoryStream())
使用(var pdfWriter=新的pdfWriter(工作流))
{
pdfWriter.SetCloseStream(false);
HtmlConverter.ConvertToPdf(strContent,pdfWriter);
添加(workStream.ToArray());
pdfWriter.Close();
}
}
MemoryStream ms=新的MemoryStream();
PdfWriter writer=新的PdfWriter(毫秒);
PDF文档=新PDF文档(编写器);
PdfMerger合并=新PdfMerger(文件);
streams.ForEach(stream=>
{
Stream msDoc=新内存流(Stream);
PdfDocument doc=新PdfDocument(新PDF阅读器(msDoc));
Merge.Merge(doc,1,doc.GetNumberOfPages());
doc.Close();
});
字节内容=ms.ToArray();
document.Close();

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

        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

上有很多示例,例如(还有一个完整的文件夹)


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

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

        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

上有很多示例,例如(还有一个完整的文件夹)


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

非常感谢你的回答,我一定会试试这个的。嗨,安德烈,我已经试过了文件夹中几乎所有的例子,但没有一个对我有用e、 请您通过循环浏览文档并合并它们来为我提供解决方案,因为您在这里提供的解决方案目前不太符合我的要求all@HemanthMannam,那么您需要的是文档列表(SRC\n)是否合并到内存中的单个PDF?是的,我有一个文档列表,当我尝试此策略时,它对我不起作用,因此当前合并文档我已合并html并创建了单个PDF文件我仍然不理解我的解决方案与您试图实现的目标之间的区别,对不起。也许您可以发布一些文档有多少个例子?非常感谢你的回答,我一定会试试这个。嗨,安德烈,我已经尝试了文件夹中的几乎所有的例子,但没有一个对我有效,你能通过循环文档并合并它们来为我提供解决方案吗?因为你在这里提供的解决方案不太适合我的要求参观all@HemanthMannam,那么您需要的是文档列表(SRC\n)是否合并到内存中的单个PDF?是的,我有一个文档列表,当我尝试此策略时,它对我不起作用,因此当前合并文档我已合并html并创建了单个PDF文件我仍然不理解我的解决方案与您试图实现的目标之间的区别,对不起。也许您可以发布一些文档有多少例子?