iTextSharp目录(TOC)更新

时间:2016-06-28 16:29:22

标签: c# pdf-generation itext

我还没能找到问题的答案。我想知道是否可以更新TOC每个项目的页面链接。

请注意,问题是更新TOC上的链接,而不是书签。

从我到目前为止阅读的内容来看,这是一个艰难的过程,需要至少一周的编程工作。由于这不容易通过iTextSharp实现。

  1. 我的第一个pdf有5页。第一页是TOC。

  2. 我有6页的第二个pdf。第一页是TOC。

  3. 我想合并这两个文件。

  4. TOC页面位于合并文档的顶部。

  5. 使用对新页面的链接引用更新TOC中的每个项目。因此,当您单击它时,它会将您带到合并文档中的位置。

1 个答案:

答案 0 :(得分:1)

“iText in Action - Second Edition”一书对此进行了解释。如果您没有该书的副本,则应该查看这些示例,更具体地说,请参阅ConcatenateBookmarks示例。

我看到您使用C#标记标记了问题,因此我将复制C#示例,而不是复制/粘贴Java示例。 src是带有PDF文档的List字节数组。

public byte[] ManipulatePdf(List<byte[]> src) {
  using (MemoryStream ms = new MemoryStream()) {
    // step 1
    using (Document document = new Document()) {
      // step 2
      using (PdfCopy copy = new PdfCopy(document, ms)) {
        // step 3
        document.Open();
        // step 4
        int page_offset = 0;
        // Create a list for the bookmarks
        List<Dictionary<String, Object>> bookmarks = 
            new List<Dictionary<String, Object>>();

        for (int i  = 0; i < src.Count; i++) {
          PdfReader reader = new PdfReader(src[i]);
          // merge the bookmarks
          IList<Dictionary<String, Object>> tmp = 
              SimpleBookmark.GetBookmark(reader);
          SimpleBookmark.ShiftPageNumbers(tmp, page_offset, null);
          foreach (var d in tmp) bookmarks.Add(d);

          // add the pages
          int n = reader.NumberOfPages;
          page_offset += n;
          for (int page = 0; page < n; ) {
            copy.AddPage(copy.GetImportedPage(reader, ++page));
          }
        }
        // Add the merged bookmarks
        copy.Outlines = bookmarks;
      }
    }
    return ms.ToArray();
  }
} 

<强>更新

如果问题是关于不同类型的TOC,那么您需要查看ConcatenateNamedDestinations示例。

在这种情况下,我们使用命名目的地从一个文档到另一个文档的链接。在这种情况下,我们需要ConsolidateNamedDestinations()MakeRemoteNamedDestinationsLocal()。可以在此处找到此示例的C#版本:ConcatenateNamedDestinations.cs

我不知道这是否能解决你的问题。您谈到“链接参考更新”,但这可能意味着不同的事情(命名目的地,显式目的地,行动)。