如何将多个MigraDoc文档合并为一个

时间:2018-11-15 16:44:44

标签: c# pdfsharp migradoc

有一个示例代码,说明如何在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实例合并到一个文档中?

1 个答案:

答案 0 :(得分:1)

要将一个MigraDoc Document的元素转换为另一个元素,请尝试要传输的元素的Clone()方法。这也可以用于重用同一文档中的元素。
为此,您必须遍历要复制的所有文档元素,并对每个文档元素分别调用Clone(),对于接收Add的对象,调用Document,将克隆对象作为参数传递。 / p>

要解决原始问题中显示的PDFsharp异常,可以将PdfDocument保存到MemoryStream中,然后使用PdfDocumentOpenMode.Import重新打开。

我更喜欢的解决方案:编写创建MigraDoc Document或其部分的方法。调用这些方法两次-一次创建一个大文档,一次创建多个小文档。这样就避免了克隆和保存/读取。