有一个示例代码,说明如何在docs中将多个Pdf文档添加到一个文档中。但是我想将多个MigraDoc文档合并为一个。
到目前为止,我的代码是:
private void GeneratePdfDocument(IEnumerable<Document> parts, string fileName)
{
using (var outputDocument = new PdfDocument())
{
foreach (var part in parts)
{
var renderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always);
renderer.Document = part;
renderer.RenderDocument();
var pdfPart = renderer.PdfDocument;
for (var pageIndex = 0; pageIndex < pdfPart.PageCount; pageIndex++)
{
outputDocument.AddPage(pdfPart.Pages[pageIndex]);
}
}
// create the PDF
outputDocument.Save(fileName);
}
}
但是在AddPage
上,我得到了System.InvalidOperationException
:
A PDF document must be opened with PdfDocumentOpenMode.Import to import pages from it.
一种解决方案是将每个Document
部分创建为单独的PDF,然后将所有部分合并为一个PDF文件,但是并非所有部分都需要整个页面。
编辑: 我还尝试了以下方法:
var combineDocument = new Document();
foreach (var part in parts)
{
//for(var styleIndex = 0; styleIndex < part.Styles.Count; styleIndex++)
//{
// combineDocument.Add(part.Styles[styleIndex]);
//}
for(var sectionIndex = 0; sectionIndex < part.Sections.Count; sectionIndex++)
{
var section = part.Sections[sectionIndex].Clone();
combineDocument.Add(section);
}
}
这个想法是将每个Document
的节复制到combineDocument
实例中,但是我无法检索Style
实例,结果也不符合预期。
问题:
是否可以将MigraDoc Document
实例合并到一个文档中?
答案 0 :(得分:1)
要将一个MigraDoc Document
的元素转换为另一个元素,请尝试要传输的元素的Clone()
方法。这也可以用于重用同一文档中的元素。
为此,您必须遍历要复制的所有文档元素,并对每个文档元素分别调用Clone()
,对于接收Add
的对象,调用Document
,将克隆对象作为参数传递。 / p>
要解决原始问题中显示的PDFsharp异常,可以将PdfDocument
保存到MemoryStream
中,然后使用PdfDocumentOpenMode.Import
重新打开。
我更喜欢的解决方案:编写创建MigraDoc Document
或其部分的方法。调用这些方法两次-一次创建一个大文档,一次创建多个小文档。这样就避免了克隆和保存/读取。