【问题标题】:iTextSharp Table of Content (TOC) updateiTextSharp 目录 (TOC) 更新
【发布时间】:2016-10-31 02:21:52
【问题描述】:

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

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

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

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

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

  3. 我想合并两个文档。

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

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

【问题讨论】:

    标签: c# pdf-generation itext


    【解决方案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

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

    【讨论】:

    • 感谢您分享您的见解。我实际上是在寻找链接参考更新,而不是书签更新。
    • 我已经更新了答案。当您说“链接参考更新”时,您必须澄清您的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2019-07-14
    相关资源
    最近更新 更多