从文档大纲(书签)中获取页码

2024-01-11

我正在使用 itext7 库来操作一些现有的 PDF。由于某种原因,我无法从大纲中获取页码。我想我应该以某种方式从Pdf目的地 http://itextsupport.com/apidocs/itext7/latest/com/itextpdf/kernel/pdf/navigation/PdfDestination.html但在其任何子类中找不到任何匹配的方法。

PdfDocument pdfDoc =  new PdfDocument(new PdfReader("example.pdf"));
var root = pdfDoc.GetOutlines(false);
foreach (PdfOutline ol in root.GetAllChildren()) {
    Console.WriteLine(ol.GetTitle());
    PdfDestination d =  ol.GetDestination();
    // how to get the page number from the destination object
}

在 iText5 中我使用了SimpleBookmark.GetBookmark(reader)返回包含“Page”条目的字典列表 - 但此功能似乎已在 iText7 中删除。

Edit:我查看了 Net 实现PdfExplicitDestination.getDestinationPage() http://itextsupport.com/apidocs/itext7/latest/com/itextpdf/kernel/pdf/navigation/PdfExplicitDestination.html#getDestinationPage-java.util.Map- on Github https://github.com/itext/itext7-dotnet/blob/develop/itext/itext.kernel/itext/kernel/pdf/navigation/PdfExplicitDestination.cs(同样适用于java https://github.com/itext/itext7/blob/develop/kernel/src/main/java/com/itextpdf/kernel/pdf/navigation/PdfExplicitDestination.java。我不明白该方法的参数的用途。如果我传入 null,它似乎适用于使用 ToString() 在大纲层次结构中仅使用一级的 pdf。我所说的工作是指它将零索引页码作为字符串返回。对于 PDF,代码找不到页码(第一级均未找到)。

PdfDocument pdfDoc =  new PdfDocument(new PdfReader("example.pdf"));
var root = pdfDoc.GetOutlines();
foreach (PdfOutline ol in root.GetAllChildren()) {
    Console.WriteLine(ol.GetTitle());
    var d = ol.GetDestination();
    if (d is PdfExplicitDestination) {
        string PageNoStr = d.GetDestinationPage(null).ToString();               
        // this is the content of the method (less the ToString()
        //string PageNoStr = ((PdfArray)d.GetPdfObject()).Get(0).ToString();
        int pageNo;
        if (Int32.TryParse(PageNoStr, out pageNo)) {
            Console.WriteLine("Page is " + pageNo);
        } else  {
            Console.WriteLine("Error page");
        }    
    }
}

所以我仍在努力解决这个问题。


关于大纲层次结构的级别,为了遍历整个层次结构,您必须检查每个层次结构PdfOutline的子级并递归地遍历它们。

让您感到困惑的名称参数是负责解析命名目标的参数,在一般情况下,该参数是正确获取页码所必需的,因为您的 PDF 文档可能包含显式的命名目标。要获取名称映射,您可以使用pdfDocument.getCatalog().getNameTree(PdfName.Dests).getNames();

要通过页面对象查找页码,您应该使用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 = pdfDocument.getCatalog().getNameTree(PdfName.Dests);
PdfOutline root = pdfDocument.getOutlines(false);
walkOutlines(root, destsTree.getNames(), pdfDocument);

请注意,代码示例适用于 Java,但它在 C# 中应该类似,除了一些大小写更改和IDictionary相反,如果Map.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从文档大纲(书签)中获取页码 的相关文章

随机推荐

  • 从失败的变基中恢复

    我在用着git svn通过公司指定的 svn 服务器获得一些 git 的好处 我刚刚有一个 rebase 出了严重的问题 我正在努力找出最好的恢复方法 事情是这样的 首先 我有这个 1 master B C D E feature fix
  • CSS:滚动时背景图像不填充

    在一个非常小的网站上工作 一次性加载 所以有一个 div 保存所有背景图像 最重要的是 即 更高的 z 指数 有一个内容 div 包含所有内容 我可以根据选择的内容轻松切换背景 不幸的是 我注意到如果你在一个小窗口中启动 就会出现滚动条 如
  • 如何在 Angular2 组件中操作 scss 变量

    有没有办法可以更改 Angular2 组件中声明的 scss 变量 我想根据用户选择动态添加主题 因此需要修改 scss 变量 我读到了有关将所有 scss 变量保存在单独的 scss 文件中并将其导入其他 scss 文件中的内容 但是我可
  • 我们可以在 Flutter 中显示一些动态文本以及 Google 地图上的标记吗?

    在 Flutter 中是否有可能实现像这样的图像 我使用 google maps flutter 插件在屏幕上显示 GoogleMap 并使用 BitmapDescriptor 更改地图标记的图标 现在我只是在寻找某种方法来显示标记下方的文
  • 一个 UITableView 中有多个 UITableViewCell 类?

    我正在组合一个 TableView 并且需要在同一个表中使用多个单元格类 例如 我将如何在我的cellForRowAtIndexPath method UITableViewCell tableView UITableView tableV
  • 查询构建器中不存在 Get onlyTrashed()

    我正在尝试从表消息中获取废弃的行 public function trash return this gt onlyTrashed gt where user id this gt u gt orWhere receiver this gt
  • 在 iOS 模拟器中启动 Flutter 应用程序时出错

    我在 iOS 模拟器上启动 Flutter 应用程序时遇到问题 从下面的错误输出来看 这个问题似乎与本地主机连接等有关 但我无法找到如何修复它 我正在运行 MacOS Catalina 版本 10 15 6 19G73 iOS模拟器版本11
  • 编写调用Fortran库的R包

    我正在尝试编写一个调用 Fortran 子例程的 R 包 我正在使用 Rstudio 包模板自动创建一堆文件和目录 In R 我有一个文件 Fpi R Fpi lt function DARTS ROUNDS if is loaded Fp
  • 在 Android 中启动新的 Activity 并完成当前的 Activity? [复制]

    这个问题在这里已经有答案了 目前我正在开始一个新的Activity并打电话finish在当前的一个上 是否有任何标志可以传递给Intent这使得完成电流Activity无需致电finish手动从代码 您可以使用finish 方法或者您可以使
  • 为什么通过引用捕获变量的 lambda 不能转换为函数指针?

    如果我有一个通过引用捕获所有自动变量的 lambda 为什么不能转换为函数指针呢 常规函数可以像通过引用捕获所有内容的 lambda 一样修改变量 那么为什么不一样呢 换句话说 我想 lambda 和 a 之间的功能区别是什么 捕获列表和常
  • 使用 Laravel 进行 Flutter FCM

    我正在使用 Laravel 作为我的应用程序后端 并希望按主题向我的 flutter 应用程序发送推送通知 现在我在我的 flutter 应用程序中实现了 firebase 消息传递 作为 registerOnFirebase fireba
  • 立即运行 Jenkins 作业

    我有一个非常轻量级的作业 应该在触发时立即执行 而不是等待一个小时才能完成当前作业 据我了解 一个蝇量级任务就是我想要的 它将创建一个临时执行器 专门用于该任务 我怎样才能让一个工作作为蝇量级运行 我最近也遇到了同样的问题 我的公司有很多
  • 我应该如何折叠 Python 中的元素? [复制]

    这个问题在这里已经有答案了 例如 l a 1 b 2 a 2 collapsed l dict a 1 2 b 2 如何最好地从l to collapsed l 从某种意义上说 我想要某种方式来概括我正在崩溃的 领域 以及哪个领域 我认为这
  • eslint 禁用扩展覆盖

    如果你有一个覆盖 你想 降级 js解析器 你如何关闭extends来自父母 parserOptions很容易被覆盖 因为它是基于密钥的 extends因为空数组不执行任何操作 因为它尝试将空列表附加到原始数组 如果您将其设置为null 您会
  • Zend Framework notEmpty 验证器 setRequired

    我看过其他的问题 https stackoverflow com questions 3871460 zend form setrequiredtrue or addvalidatornotempty 谷歌搜索这个 我的问题是 当我提交带有
  • std::variant 在 MSVC 和 gcc 中的行为不同

    Update 这是一个 C 标准缺陷 已在 C 20 P0608R3 中修复 另外 VS 2019 16 10 修复了这个错误 std c 20 MSVC 19 28 拒绝以下代码 但 gcc 10 2 接受它并输出true false i
  • 如何以编程方式为 UINavigationController 子类化 UINavigationBar?

    我正在使用自定义的drawRect函数来绘制UINavigationBar在我的 iOS4 应用程序中 它不使用图像 仅使用 CoreGraphics 因为你不能在中实现drawRectUINavigationBariOS5 中的类别 Ap
  • JavaScript 唯一浏览器 ID

    有没有办法在javascript中为浏览器创建一个唯一的ID 我说的不是每次生成时都是随机的 ID 而是生成该 ID 的浏览器所特有的 ID 而且还考虑了运行该 ID 的计算机 Example Windows 7 Chrome 可能会生成
  • Ionic Zip 仅提取特定文件夹

    我有一个案例 我需要使用 C Ionic zip 库提取 Zip 文件 Zip 文件包含多个文件夹 我想提取特定文件夹并将其复制到特定目的地 例如名为 abc zip 的 Zip 文件和目录结构如下 父目录 gt 子目录1 gt 文件a 文
  • 从文档大纲(书签)中获取页码

    我正在使用 itext7 库来操作一些现有的 PDF 由于某种原因 我无法从大纲中获取页码 我想我应该以某种方式从Pdf目的地 http itextsupport com apidocs itext7 latest com itextpdf