2016-04-28 133 views
1

我試圖使用PDFsharp和MigraDoc創造許多其他文件的PDF報告文件。內容MigraDoc表添加到PDFsharp PDF

基本工作流程如下:

  1. 用戶上傳2個或更多的文檔來連接
  2. 用戶選擇他們想要的網頁在TOC包括
  3. 的文件被連接起來一起生成目錄

現在我可以輕鬆地連接文檔並添加bookm方舟/ PDFsharp中的輪廓。我遇到問題的地方是使用MigraDoc創建TOC時引用PDFsharp創建的書籤/輪廓作爲超鏈接的目標。

代碼添加書籤/提綱PDFsharp(成功添加書籤):

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

MigraDoc代碼來創建TOC頁面,並將其呈現到當前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代碼將TOC頁,但它不承認PDFsharp書籤。

截圖的TOC的: 的TOC頁面開始添加(雖然TOC書籤在年底上市),但我不能鏈接到PDFsharp書籤 This is what the TOC looks like

我敢肯定的是,問題在於我對MigraDoc和/或PDFsharp的理解。

一等獎將僅使用PDFsharp添加TOC。我希望有任何幫助指出正確的方向。

回答

0

MigraDoc是它自己的世界 - 它使用PDFsharp創建PDF文件,但不能訪問PDF文件的內部與PDFsharp創建(如書籤你的情況)。

一種方法:創建PDFsharp的TOC(因爲你已經建議)。

其他方法:使用MigraDoc從現有的PDF文件的網頁添加到MigraDoc文件創建最終PDF(像你添加圖片您可以添加從PDF文件的網頁)。

使用第二種方法,您可以使用MigraDoc的TOC格式化功能,MigraDoc將插入正確的頁碼,前提是您爲每個圖像(導入的PDF頁面)添加MigraDoc書籤。

第一個方法,你將不得不做的格式和自己插入頁碼,但你必須在最終的PDF更多的控制。

哪個是「最佳」方法?取決於你需要的TOC格式。第二種方法是TOC可以有兩頁或更多頁面,MigraDoc會自動處理,TOC中的條目可以有兩行或更多行,MigraDoc也會自動處理。但我認爲需要使用黑客來添加輪廓(例如,在頁面上的某處繪製帶有輪廓文本的非常小的白色文本)。

更新:對於PDFsharp唯一的方法,你會添加鏈接的代碼是這樣的:

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

的第二個參數是AddDocumentLink目標頁面。

+0

我明白了。由於我已經在PdfSharp中編寫了大部分代碼,因此我將嘗試PdfSharp TOC方法。您能否指示我如何實際創建一個「鏈接」到書籤的PdfSharp Equivelent?我努力通過搜索您的網站來找到一個例子。謝謝! – lukejkw

+0

感謝您的幫助,並繼續在一個夢幻般的圖書館工作。還有一個問題,'rect'參數表示什麼?你沒有指定它的初始化。 – lukejkw

+0

'rect'是超級鏈接的可點擊區域。超鏈接存在自己的 - 你不必在那裏繪製任何東西,但在你的情況下,圍繞你的TOC行的文本製作矩形。 –