C# 合并两个PdfDocument对象

C# 合并两个PdfDocument对象,c#,pdf,itext7,C#,Pdf,Itext7,简单的问题,如何使用itext7.net库合并两个PdfDocument对象 这就是我尝试的方式,但它不起作用 PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf)); PdfDocument InitialPdfDoc = new PdfDocument(new PdfWriter(memStreamOfAddressAndBarcode)); InitialPdfDoc.CopyPage

简单的问题,如何使用itext7.net库合并两个PdfDocument对象

这就是我尝试的方式,但它不起作用

PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));

PdfDocument InitialPdfDoc = new PdfDocument(new PdfWriter(memStreamOfAddressAndBarcode));
InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);
这段代码也会引发相同的异常

Merger.Merge(InitialPdfDoc,1,InitialPdfDoc.GetNumberOfPages());
无法从正在编写的文档中复制间接对象

还尝试将嵌套pdf写入磁盘-->读取-->另一个异常


任何想法

首先:你的代码

PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));

PdfDocument InitialPdfDoc = new PdfDocument(new PdfWriter(memStreamOfAddressAndBarcode));
InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);
确实有效它不会引发任何异常,而是不会将任何内容复制到
globalpdfddocument
。这是正确的,因为
InitialPdfDoc
是新创建的,尚未包含任何页面

但假设您只是没有提供足够的代码来重现问题,假设您的实际代码在调用
CopyPagesTo
方法之前向
InitialPdfDoc
添加了一些内容,例如

PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));

PdfDocument InitialPdfDoc = new PdfDocument(new PdfWriter(memStreamOfAddressAndBarcode));
InitialPdfDoc.AddNewPage();
InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);
现在确实存在所声称的例外情况:

iText.Kernel.PdfException:无法从正在编写的文档中复制间接对象。
例外情况清楚地说明了代码的错误:您的文档
InitialPdfDoc
被写入(即,它有一个关联的
PdfWriter
),因此无法从中复制页面

无法从写入的文档复制页面的这种限制是由于iText体系结构造成的:当写入文档时,iText会尝试尽快将此新内容推送到
PdfWriter
输出流中,然后忘记它。这使得iText可以轻松生成大结果PDF,而不需要大量内存。缺点是你面临的限制

因此,显而易见的解决方案是创建要从中复制的PDF,在没有编写器的情况下将其读入文档对象,然后从中复制:

PdfDocument GlobalPdfDocument = new PdfDocument(new PdfWriter(multiContentPdf));

PdfWriter Writer = new PdfWriter(memStreamOfAddressAndBarcode);
Writer.SetCloseStream(false);                     // Prevent the Writer from closing the MemoryStream
PdfDocument InitialPdfDoc = new PdfDocument(Writer);
InitialPdfDoc.AddNewPage();
InitialPdfDoc.Close();                            // Closing the document finishes the result PDF

memStreamOfAddressAndBarcode.Position = 0;        // Re-position the stream to the start of the PDF
InitialPdfDoc = new PdfDocument(new PdfReader(memStreamOfAddressAndBarcode)); // Create r/o document

InitialPdfDoc.CopyPagesTo(1, InitialPdfDoc.GetNumberOfPages(), GlobalPdfDocument);

错误消息告诉您无法从正在编写的文档中复制页面。因此,您必须完成
InitialPdfDoc
并再次加载它。如果不想将其写入文件,只需使用内存流即可。因此,您应该集中精力解决“读取-->另一个异常”。“使用内存流”这正是我正在做的,参数multidfcontent、memstreamofaddress和barcode都是内存流对象。因此,您必须完成
InitialPdfDoc
并再次加载它。是否完成?您的意思是将其写入磁盘并重新加载?如果您不想将其写入文件,只需使用内存流即可。你也可以从那里重新加载。这是一个很好的答案,谢谢