Добавить содержание MigraDoc в PDFsharp PDF

Я пытаюсь использовать PDFsharp и MigraDoc для создания файла отчета в формате PDF из многих других файлов.

В основном рабочий процесс выглядит следующим образом:

  1. Пользователь загружает 2 или более документов для объединения
  2. Пользователь выбирает, какие страницы он хочет включить в оглавление
  3. Документы объединяются вместе и создается оглавление

Теперь я могу легко объединять документы и добавлять закладки / схемы в PDFsharp. Я столкнулся с проблемами при использовании MigraDoc для создания оглавления, ссылающегося на созданные PDFsharp закладки / схемы в качестве целей гиперссылок.

Код для добавления закладки / схемы в PDFsharp (успешно добавляет закладки):

// Current document is a PdfDocument and Title is the name of the bookmark
CurrentDocument.Outlines.Add(title, page, true, PdfOutlineStyle.Bold);

Код MigraDoc для создания страницы оглавления и ее рендеринга в текущий документ PDFsharp:

// Create blank page
            PdfPage page = (!hasTitlePage)
                ? AddPage(null, 0, TOC_BOOKMARK_TITLE) // Add to start
                : AddPage(null, 1, TOC_BOOKMARK_TITLE); // Add after title page

            // Get Graphics obj
            XGraphics gfx = XGraphics.FromPdfPage(page);
            gfx.MUH = PdfFontEncoding.Unicode;

            // Create MigraDoc document + Setup styles
            Document document = new Document();
            DefineStyles(document);

            // Add header
            Section section = document.AddSection();
            Paragraph paragraph = section.AddParagraph("Table of Contents");
            paragraph.Format.Font.Size = 14;
            paragraph.Format.Font.Bold = true;
            paragraph.Format.SpaceAfter = 24;
            paragraph.Format.OutlineLevel = OutlineLevel.Level1;

            // Add links - these are the PdfSharp outlines/bookmarks added previously when concatinating the pages
            foreach (var bookmark in CurrentDocument.Outlines)
            {
                paragraph = section.AddParagraph();
                paragraph.Style = "TOC";
                Hyperlink hyperlink = paragraph.AddHyperlink(bookmark.Title);
                hyperlink.AddText($"{bookmark.Title}\t");
                hyperlink.AddPageRefField(bookmark.Title);
            }

            // Render document
            DocumentRenderer docRenderer = new DocumentRenderer(document);
            docRenderer.PrepareDocument();
            docRenderer.RenderPage(gfx, 1);

            return page;

Примечание. Код MigraDoc добавляет страницу оглавления, но не распознает закладки PDFsharp.

Снимок экрана TOC: страница TOC добавляется в начале (хотя закладка TOC указана в конце), но я не могу связать ее с закладками PDFsharp Вот так выглядит оглавление

Я уверен, что проблема заключается в моем понимании MigraDoc и / или PDFsharp.

Первым призом будет использование только PDFsharp для добавления оглавления. Я был бы признателен за любую помощь в указании в правильном направлении.

1 ответ

MigraDoc - это отдельный мир: он использует PDFsharp для создания PDF-файлов, но не может получить доступ к внутренним файлам PDF-файлов, созданным с помощью PDFsharp (например, "Закладки" в вашем случае).

Один подход: создать оглавление с PDFsharp (как вы уже предложили).

Другой подход: используйте MigraDoc для добавления страниц из существующих файлов PDF в документ MigraDoc для создания окончательного PDF (вы можете добавлять страницы из файлов PDF так же, как вы добавляете изображения).

При втором подходе вы можете использовать возможности форматирования MigraDoc для оглавления, а MigraDoc вставит правильные номера страниц при условии, что вы добавите закладки MigraDoc для каждого изображения (импортированная страница PDF).

При первом подходе вам нужно будет выполнить форматирование и вставить номера страниц самостоятельно, но у вас будет больше контроля над окончательным PDF.

Какой самый лучший подход? Немного зависит от степени форматирования, необходимой для вашего оглавления. При втором подходе TOC может иметь две или более страниц, и MigraDoc позаботится об этом автоматически, а записи в TOC могут иметь две или более строк, и MigraDoc также позаботится об этом автоматически. Но я думаю, что понадобится взлом, чтобы добавить контуры (например, нарисовать очень маленький белый текст с текстом контура где-нибудь на странице).

Обновление: только для подхода PDFsharp вы добавите ссылки с кодом, подобным следующему:

PdfRectangle prect = new PdfRectangle(gfx.Transformer.WorldToDefaultPage(rect));
page.AddDocumentLink(prect, 1);

Второй параметр AddDocumentLink - это целевая страница.

Другие вопросы по тегам