You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:25:27