C# 如何以编程方式读取PDF书签

C# 如何以编程方式读取PDF书签,c#,pdf,command-line,bookmarks,C#,Pdf,Command Line,Bookmarks,我正在使用PDF转换器访问PDF中的图形数据。一切正常,只是我并没有书签列表。有没有可以读取PDF书签的命令行应用程序或C#组件?我找到了iText和SharpPDF库,目前正在查找它们。你曾经做过这样的事情吗?如果你对商业解决方案没有意见,你可以尝试一下 下面是一个示例代码,用于列出书签中的所有顶级项及其某些属性 using (PdfDocument doc = new PdfDocument("file.pdf")) { PdfOutlineItem root =

我正在使用PDF转换器访问PDF中的图形数据。一切正常,只是我并没有书签列表。有没有可以读取PDF书签的命令行应用程序或C#组件?我找到了iText和SharpPDF库,目前正在查找它们。你曾经做过这样的事情吗?

如果你对商业解决方案没有意见,你可以尝试一下

下面是一个示例代码,用于列出书签中的所有顶级项及其某些属性

using (PdfDocument doc = new PdfDocument("file.pdf"))
{
    PdfOutlineItem root = doc.OutlineRoot;
    foreach (PdfOutlineItem item in root.Children)
    {
        Console.WriteLine("{0} ({1} child nodes, points to page {2})",
            item.Title, item.ChildCount, item.PageIndex);
    }
}
类还提供与大纲项目样式等相关的属性


免责声明:我为图书馆的供应商工作。

如果您可以选择商业图书馆,您可以试一试

使用该类检索书签树的根,然后使用中的属性访问每个树元素,在树中导航,并根据需要添加、编辑或删除元素

通常的免责声明适用

请尝试以下代码

PdfReader pdfReader = new PdfReader(filename);

IList<Dictionary<string, object>> bookmarks = SimpleBookmark.GetBookmark(pdfReader);

for(int i=0;i<bookmarks.Count;i++)
{
    MessageBox.Show(bookmarks[i].Values.ToArray().GetValue(0).ToString());

    if (bookmarks[i].Count > 3)
    {
        MessageBox.Show(bookmarks[i].ToList().Count.ToString());
    }
}
PdfReader PdfReader=新的PdfReader(文件名);
IList bookmarks=SimpleBookmark.GetBookmark(pdfReader);
对于(int i=0;i 3)
{
Show(书签[i].ToList().Count.ToString());
}
}
注意:别忘了将iTextSharp DLL添加到您的项目中。

它是根据MIT许可证发布的,因此即使在公司开发中也可以使用它。这是一个未经测试的例子

using PdfSharp.Pdf;

using (PdfDocument document = PdfReader.IO.Open("bookmarked.pdf", IO.PdfDocumentOpenMode.Import))
{
    PdfDictionary outline = document.Internals.Catalog.Elements.GetDictionary("/Outlines");
    PrintBookmark(outline);
}

void PrintBookmark(PdfDictionary bookmark)
{
    Console.WriteLine(bookmark.Elements.GetString("/Title"));
    for (PdfDictionary child = bookmark.Elements.GetDictionary("/First"); child != null; child = child.Elements.GetDictionary("/Next"))
    {
        PrintBookmark(child);
    }
}
格查斯:
  • PdfSharp不支持1.6版以上的OpenPDF。(抛出:
    无法处理iref流。pdfsharp的当前实现无法处理acrobat 6引入的此pdf功能
  • PDFs中有许多类型的字符串,PDFsharp按原样返回,包括UTF-16BE字符串
      由于书签位于树结构()中, 我在这里使用了一些递归来收集所有书签及其子项

      我为我解决了这个问题

      dotnet add package iTextSharp
      
      已收集具有以下代码的所有书签:

      using System.Collections.Generic;
      using System.Text;
      using System.Text.RegularExpressions;
      using iTextSharp.text.pdf;
      
      namespace PdfManipulation
      {
          class Program
          {
              static void Main(string[] args)
              {
                  StringBuilder bookmarks = ExtractAllBookmarks("myPdfFile.pdf");
              }
      
              private static StringBuilder ExtractAllBookmarks(string pdf)
              {
                  StringBuilder sb = new StringBuilder();
                  PdfReader reader = new PdfReader(pdf);
                  IList<Dictionary<string, object>> bookmarksTree = SimpleBookmark.GetBookmark(reader);
                  foreach (var node in bookmarksTree)
                  {
                      sb.AppendLine(PercorreBookmarks(node).ToString());
                  }
                  return RemoveAllBlankLines(sb);
              }
      
              private static StringBuilder RemoveAllBlankLines(StringBuilder sb)
              {
                  return new StringBuilder().Append(Regex.Replace(sb.ToString(), @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline));
              }
      
              private static StringBuilder PercorreBookmarks(Dictionary<string, object> bookmark)
              {
                  StringBuilder sb = new StringBuilder();
                  sb.AppendLine(bookmark["Title"].ToString());
                  if (bookmark != null && bookmark.ContainsKey("Kids"))
                  {
                      IList<Dictionary<string, object>> children = (IList<Dictionary<string, object>>) bookmark["Kids"];
                      foreach (var bm in children)
                      {
                          sb.AppendLine(PercorreBookmarks(bm).ToString());
                      }
                  }
                  return sb;
              }
          }
      }
      
      使用System.Collections.Generic;
      使用系统文本;
      使用System.Text.RegularExpressions;
      使用iTextSharp.text.pdf;
      命名空间PDF操作
      {
      班级计划
      {
      静态void Main(字符串[]参数)
      {
      StringBuilder书签=ExtractAllBookmarks(“myPdfFile.pdf”);
      }
      私有静态StringBuilder ExtractAllBookmarks(字符串pdf)
      {
      StringBuilder sb=新的StringBuilder();
      PdfReader reader=新PdfReader(pdf);
      IList bookmarksTree=SimpleBookmark.GetBookmark(阅读器);
      foreach(bookmarksTree中的var节点)
      {
      sb.AppendLine(percorresbookmarks(node.ToString());
      }
      返回所有空白行(sb);
      }
      专用静态StringBuilder RemoveAllBlankLines(StringBuilder sb)
      {
      返回新的StringBuilder().Append(Regex.Replace(sb.ToString(),@“^\s+$[\r\n]*”,string.Empty,RegexOptions.Multiline));
      }
      私有静态StringBuilder书签(字典书签)
      {
      StringBuilder sb=新的StringBuilder();
      sb.AppendLine(书签[“Title”].ToString());
      if(bookmark!=null&&bookmark.ContainsKey(“儿童”))
      {
      IList children=(IList)书签[“children”];
      foreach(儿童的var bm)
      {
      sb.AppendLine(percorresbookmarks(bm.ToString());
      }
      }
      归还某人;
      }
      }
      }
      
      SimpleBookmark.GetBookmark
      将只返回顶级书签。嵌套的书签将列在父词典中,您可以使用
      if(bookmarks[i].ContainsKey(“chids”){/*show child bookmarks*/}
      进行测试
      bookmarks[i][“Kids”]
      也将是一个
      IList
      。您有机会在这个问题上提供帮助吗?