如何将多个 MigraDoc 文档连接成一个
How to concatenate multiple MigraDoc documents into one
在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
个实例合并到一个文档中?
要将一个 MigraDoc Document
的元素转移到另一个 MigraDoc,请尝试使用您要转移的元素的 Clone()
方法。这也可用于在同一文档中重复使用元素。
为此,您必须遍历所有要复制的文档元素,并为每个元素调用 Clone()
并为接收 Document
调用 Add
将克隆对象作为参数传递。
要解决原始问题中显示的 PDFsharp 异常,您可以将 PdfDocument
保存到 MemoryStream
中,然后使用 PdfDocumentOpenMode.Import
.
再次打开它
我更喜欢的解决方案:编写创建 MigraDoc Document
或其部分的方法。调用这些方法两次——一次创建一个大文档,一次创建多个小文档。因此,您可以避免克隆和 saving/reading.
在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
个实例合并到一个文档中?
要将一个 MigraDoc Document
的元素转移到另一个 MigraDoc,请尝试使用您要转移的元素的 Clone()
方法。这也可用于在同一文档中重复使用元素。
为此,您必须遍历所有要复制的文档元素,并为每个元素调用 Clone()
并为接收 Document
调用 Add
将克隆对象作为参数传递。
要解决原始问题中显示的 PDFsharp 异常,您可以将 PdfDocument
保存到 MemoryStream
中,然后使用 PdfDocumentOpenMode.Import
.
我更喜欢的解决方案:编写创建 MigraDoc Document
或其部分的方法。调用这些方法两次——一次创建一个大文档,一次创建多个小文档。因此,您可以避免克隆和 saving/reading.