Добавление содержания 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.

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

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

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


person lukejkw    schedule 28.04.2016    source источник


Ответы (1)


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

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

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

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

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

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

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

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

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

person I liked the old Stack Overflow    schedule 28.04.2016
comment
Понятно. Поскольку я уже написал большую часть кода в PdfSharp, я попробую подход PdfSharp TOC. Не могли бы вы указать мне, как на самом деле создать PdfSharp-эквивалент ссылки на закладку? Я изо всех сил пытаюсь найти пример с помощью моих поисков на вашем сайте. Спасибо! - person lukejkw; 28.04.2016
comment
Спасибо за помощь и продолжение работы над фантастической библиотекой. Еще один вопрос, что обозначает параметр rect? Вы не указали его инициализацию. - person lukejkw; 28.04.2016
comment
rect - это интерактивная область для гиперссылки. Гиперссылка существует сама по себе - вам не нужно там ничего рисовать, но в вашем случае сделайте прямоугольник вокруг текста вашей строки оглавления. - person I liked the old Stack Overflow; 28.04.2016
comment
Понял, спасибо. FYI - AddDocumentLink не основан на 0, как указано в вашем ответе. Он основан на номерах страниц. - person lukejkw; 28.04.2016
comment
AddDocumentLink вызывает прямоугольную рамку вокруг текста. Есть ли возможность сделать текст похожим на ссылку вместо добавления прямоугольника вокруг него? Поддерживает ли это PDFSharp? - person SandhraPrakash; 30.10.2017
comment
@Sandy Сколько лет вашей версии PDFsharp? Полагаю, очень старый. Я полагаю, время для апгрейда. - person I liked the old Stack Overflow; 06.11.2017
comment
@Sandy Вы можете исправить исходный код v1.32, если вам нужно придерживаться старой версии: forum.pdfsharp.net/viewtopic.php?p=6161#p6161 - person I liked the old Stack Overflow; 07.11.2017