C# 如何以编程方式读取PDF书签
我正在使用PDF转换器访问PDF中的图形数据。一切正常,只是我并没有书签列表。有没有可以读取PDF书签的命令行应用程序或C#组件?我找到了iText和SharpPDF库,目前正在查找它们。你曾经做过这样的事情吗?如果你对商业解决方案没有意见,你可以尝试一下 下面是一个示例代码,用于列出书签中的所有顶级项及其某些属性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 =
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