如何在Flutter中使用Pdftron包获取PDF大纲?找不到对应Dart方法
获取PDFtron Flutter/Dart包中的PDF大纲并转换为对象/XML
PDFtron的Flutter SDK其实提供了获取PDF大纲(书签)的API,以下是具体实现步骤和代码示例:
1. 获取PDF大纲(书签)
通过Document类打开PDF后,调用getBookmarks()方法可获取根级大纲项,每个Bookmark实例包含核心属性:
getTitle(): 获取大纲项标题getPageNumber(): 获取大纲跳转的目标页码getChildren(): 获取当前大纲项的子级列表
2. 转换为自定义对象
递归遍历书签列表,将其转为自定义数据模型,方便业务逻辑处理:
import 'package:pdftron_flutter/pdftron_flutter.dart'; // 自定义大纲数据模型 class OutlineItem { final String title; final int pageNumber; final List<OutlineItem> children; OutlineItem({ required this.title, required this.pageNumber, required this.children, }); } Future<List<OutlineItem>> extractOutlineToObjects(String pdfPath) async { final document = await Document.open(pdfPath); final rootBookmarks = await document.getBookmarks(); return Future.wait(rootBookmarks.map((bookmark) => _convertBookmarkToItem(bookmark))); } Future<OutlineItem> _convertBookmarkToItem(Bookmark bookmark) async { final title = await bookmark.getTitle(); final pageNum = await bookmark.getPageNumber(); final childBookmarks = await bookmark.getChildren(); final children = await Future.wait(childBookmarks.map(_convertBookmarkToItem)); return OutlineItem( title: title, pageNumber: pageNum, children: children, ); }
3. 转换为XML格式
若需生成XML结构,可借助xml包(需在pubspec.yaml添加依赖:xml: ^6.4.2)来构建:
import 'package:xml/xml.dart'; String convertOutlineToXml(List<OutlineItem> outlineItems) { final builder = XmlBuilder(); builder.processing('xml', 'version="1.0" encoding="UTF-8"'); builder.element('pdf-outline', nest: () { for (final item in outlineItems) { _buildXmlOutlineNode(builder, item); } }); return builder.build().toXmlString(pretty: true); } void _buildXmlOutlineNode(XmlBuilder builder, OutlineItem item) { builder.element('outline-item', nest: () { builder.element('title', nest: item.title); builder.element('target-page', nest: item.pageNumber.toString()); if (item.children.isNotEmpty) { builder.element('sub-items', nest: () { for (final child in item.children) { _buildXmlOutlineNode(builder, child); } }); } }); }
注意事项
- 确保
pdftron_flutter依赖为最新版本,避免API兼容问题 - 移动端需配置文件读取权限:Android添加
READ_EXTERNAL_STORAGE权限,iOS开启文件访问权限 - 若PDF无大纲,
getBookmarks()会返回空列表,需做空值判断
内容的提问来源于stack exchange,提问作者MD Iftekhar Hossain Tanveer
相关产品推荐
相关产品推荐

