如何将多个 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.