首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式阅读PDF书签

如何以编程方式阅读PDF书签
EN

Stack Overflow用户
提问于 2012-03-27 14:30:52
回答 5查看 10.9K关注 0票数 13

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-04 14:34:06

尝试以下代码

代码语言:javascript
复制
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());
    }
}

注意:不要忘记将iTextSharp DLL添加到您的项目中。

票数 14
EN

Stack Overflow用户

发布于 2019-02-22 04:07:48

由于书签是树形结构(https://en.wikipedia.org/wiki/Tree_(data_structure),我在这里使用了一些递归来收集所有书签及其子标签。

iTextSharp帮我解决了这个问题。

代码语言:javascript
复制
dotnet add package iTextSharp

使用以下代码收集所有书签:

代码语言:javascript
复制
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;
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-03-28 00:39:52

如果您对商业解决方案没有意见,可以尝试使用Docotic.Pdf library来完成此任务。

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

代码语言:javascript
复制
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);
    }
}

PdfOutlineItem类还提供了与大纲项样式等相关的属性。

免责声明:我为该库的供应商工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9884414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档