flutter - 如何在flutter中动态向pdf添加内部导航

标签 flutter pdf pdf-generation

我正在开发一个 flutter 应用程序,它使用 pdf 库( https://pub.dev/packages/pdf/changelog )在 flutter 中生成 PDF 文件。我需要创建一个包含目录的 pdf 文件。它们应该与实际内容链接,并且在单击时导航到各自的页面。我在网上找不到任何使用 pdf 库执行此操作的文档。 PDF 将被写入文件,因此 flutter 中的 PDF 查看器对我来说也没有用处。有人可以帮我吗

[更新] 我尝试在代码中使用 LinkAnchor 。但这似乎不起作用。我做错了什么吗?

reportView(context) async {
  final Document pdf = Document();

  final ByteData fontData =
      await rootBundle.load("assets/fonts/Open_Sans/OpenSans-Regular.ttf");

  final Font ttf = Font.ttf(fontData);
  final textStyle = TextStyle(font: ttf);

  final Wrap item = Wrap(children: await _buildPdfBlock(textStyle));

  pdf.addPage(
    MultiPage(
      pageFormat:
          PdfPageFormat.letter.copyWith(marginBottom: 1.5 * PdfPageFormat.cm),
      crossAxisAlignment: CrossAxisAlignment.start,
      build: (Context context) => [item],
    ),
  );

  _index(
    context,
    pdf,
    textStyle,
  );

  _contents(context, pdf, textStyle);

  final String dir = (await getApplicationDocumentsDirectory()).path;
  final String path = '$dir/App_' + '.pdf';
  final File file = File(path);
  print(path);
  await file.writeAsBytes(pdf.save());
  await Share.shareFiles([path]);
}

Future<List<Widget>> _buildPdfBlock(TextStyle textStyle) async {
  List<Widget> list = [];
  Column column = Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Header(level: 1, child: Text("PDF Generation", style: textStyle)),
        Text("Hello World", style: textStyle)
      ]);
  list.add(column);
  return list;
}

void _index(dynamic context, Document pdf, TextStyle textStyle) {
  List<Widget> indexList = [];
  var indexNumber = 1;
  for (var i = indexNumber; i < 10; i++) {
    Text indexText = Text(indexNumber.toString() + ". " + "Hello$indexNumber",
        style: textStyle);
    Link(
        child: indexText,
        destination: indexNumber.toString() + ". " + "Hello$indexNumber");
    indexList.add(indexText);

    indexNumber++;
  }
  pdf.addPage(
    MultiPage(
      pageFormat:
          PdfPageFormat.letter.copyWith(marginBottom: 1.5 * PdfPageFormat.cm),
      crossAxisAlignment: CrossAxisAlignment.start,
      build: (Context context) => indexList,
    ),
  );
}

void _contents(dynamic context, Document pdf, TextStyle textStyle) {
  List<Widget> contentList = [];
  var contentNumber = 1;
  for (var i = contentNumber; i < 10; i++) {
    Header contentIndex = Header(
        child: Text(contentNumber.toString() + ". " + "Hello$contentNumber",
            style: textStyle));
    Text content = Text("               " +
        loremIpsum(words: 60, paragraphs: 3, initWithLorem: true));

    Anchor(
        name: contentNumber.toString() + ". " + "Hello$contentNumber",
        child: contentIndex);
    contentList.add(contentIndex);
    contentList.add(content);

    contentNumber++;
  }
  pdf.addPage(
    MultiPage(
      pageFormat:
          PdfPageFormat.letter.copyWith(marginBottom: 1.5 * PdfPageFormat.cm),
      crossAxisAlignment: CrossAxisAlignment.start,
      build: (Context context) => contentList,
    ),
  );
}

[更新]它现在可以工作,我的实现是错误的。感谢您的帮助

最佳答案

您可以使用 PDF 中的 AnchorLink 在代码中使用 dart_pdf 创建这样的页面:

首先在要链接到的页面上创建一个 anchor :

Anchor(name: 'my_first_anchor'),

然后您可以在目录中引用该 anchor ,如下所示:

Link(destination: 'my_first_anchor'),

显然, anchor 名称必须是唯一的。

关于flutter - 如何在flutter中动态向pdf添加内部导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66638379/

相关文章:

java - 从磁盘读取图像时出现 ArrayOutOfBoundsException

ios - 快速创建并保存包含图像的 PDF

c# - iTextPdf 如何分页

iphone - iOS:在pdf生成中绘制文本时如何设置字体?

flutter - 从模型将回调传递到 Flutter 中的 GestureDetector 的语法

android - 将 flutter 从 2.5 升级到 2.8 后出错

flutter - 同一个流(QuerySnapshot)可以与不同页面上的多个 StreamBuilder 一起使用吗? - - flutter

php - 用mysql和php打开pdf

java - 如何使用 iText Java 制作多页 PDF

flutter - 本地通知