Как объединить несколько документов MigraDoc в один - PullRequest
0 голосов
/ 15 ноября 2018

В документах приведен пример кода для добавления нескольких документов 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, но не для всех деталей потребуется целая страница.

EDIT: Я пробовал также следующий подход:

            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 голосов
/ 16 ноября 2018

Чтобы перенести элементы одного MigraDoc Document в другой, попробуйте метод Clone() элемента, который вы хотите перенести.Это также может быть использовано для повторного использования элементов в одном и том же документе.
Чтобы сделать это, вам нужно перебрать все элементы документа, которые вы хотите скопировать, и вызвать Clone() для каждого и вызвать Add для полученияDocument передача клонированного объекта в качестве параметра.

Чтобы обойти исключение PDFsharp, показанное в исходном вопросе, вы можете сохранить PdfDocument в MemoryStream и снова открыть его, используя PdfDocumentOpenMode.Import.

Решение, которое я бы предпочел: написать методы, которые создают MigraDoc Document s или их части.Вызовите эти методы дважды - один раз, чтобы создать один большой документ, один раз, чтобы создать несколько небольших документов.Таким образом вы избегаете клонирования и сохранения / чтения.

...