Добавить содержание MigraDoc в PDFsharp PDF
Я пытаюсь использовать PDFsharp и MigraDoc для создания файла отчета в формате PDF из многих других файлов.
В основном рабочий процесс выглядит следующим образом:
- Пользователь загружает 2 или более документов для объединения
- Пользователь выбирает, какие страницы он хочет включить в оглавление
- Документы объединяются вместе и создается оглавление
Теперь я могу легко объединять документы и добавлять закладки / схемы в 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 - это целевая страница.