iTextSharp目录(TOC)更新

本文关键字:更新 TOC 目录 iTextSharp | 更新日期: 2023-09-27 17:52:37

我一直没能找到问题的答案。我想知道是否有可能更新目录中每个项目的页面链接。

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

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

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

  2. 我有第二个pdf,共6页。第一页是目录。

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

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

  5. 使用新页面的链接引用更新目录中的每个项目。因此,当你点击它时,它会把你带到它应该在合并文档中的位置。

iTextSharp目录(TOC)更新

这在《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

我不知道这是否能解决你的问题。您谈论的是"链接引用更新",但这可能意味着不同的东西(命名目的地、明确目的地、操作(。