我使用下面的代码获取书签的页码,但是返回的页码不正确,
var names = pdfDoc.GetCatalog().GetNameTree(PdfName.Dests).GetNames();
var newestBookmark = GetBookmarks(pdfDoc.GetOutlines(false), pdfDoc, names).LastOrDefault();
private static IDictionary<string, int> GetBookmarks(PdfOutline outline, PdfDocument pdfDoc, IDictionary<string, PdfObject> names)
{
if (outline == null)
{
return pdfOutlines;
}
var inner = outline.GetAllChildren();
if (inner != null && inner.Count > 0)
{
foreach (var item in inner)
{
if (DateTime.TryParse(item.GetTitle(), out DateTime title))
{
pdfOutlines.Add(item.GetTitle(), pdfDoc.GetPageNumber((PdfDictionary)outline.GetDestination().GetDestinationPage(names)));
}
if (item.GetAllChildren() != null && item.GetAllChildren().Count > 0)
{
GetBookmarks(item, pdfDoc, names);
}
}
}
return pdfOutlines;
}
还有其他获取页码的方法吗?
谢谢
答案 0 :(得分:2)
我建议仔细阅读页面轮廓,使用PdfOutline
的子级遍历层次结构,以便递归地遍历它们。
要按页对象查找页码,应使用pdfDocument.getPageNumber(PdfDictionary).
遍历轮廓的方法如下所示:
void walkOutlines(PdfOutline outline, Map<String, PdfObject> names, PdfDocument pdfDocument)
{
if (outline.getDestination() != null)
{
System.out.println(outline.getTitle() + ": page " +
pdfDocument.getPageNumber((PdfDictionary) outline.getDestination().getDestinationPage(names)));
}
for (PdfOutline child : outline.getAllChildren())
{
walkOutlines(child, names, pdfDocument);
}
}
调用方法遍历根的主要入口点:
PdfNameTree destsTree = pdfDoc.getCatalog().getNameTree(PdfName.Dests);
PdfOutline root = pdfDoc.getOutlines(false);
walkOutlines(root, destsTree.getNames(), pdfDoc);