Flutter 如何在颤振中向pdf动态添加内部导航

Flutter 如何在颤振中向pdf动态添加内部导航,flutter,pdf,pdf-generation,Flutter,Pdf,Pdf Generation,我正在开发一个颤振应用程序,它使用PDF库()在颤振中生成PDF文件。我需要创建一个pdf文件,其中有一个目录。它们应该与实际内容链接,并在单击时导航到各自的页面。我在网上找不到任何使用pdf库进行此操作的文档。PDF将被写入到一个文件中,因此Flatter中的PDF查看器对我也没有用处。有人能帮帮我吗 [更新] 我尝试在代码中使用链接和锚定。但它似乎不起作用。我做错什么了吗 reportView(context) async { final Document pdf = Document(

我正在开发一个颤振应用程序,它使用PDF库()在颤振中生成PDF文件。我需要创建一个pdf文件,其中有一个目录。它们应该与实际内容链接,并在单击时导航到各自的页面。我在网上找不到任何使用pdf库进行此操作的文档。PDF将被写入到一个文件中,因此Flatter中的PDF查看器对我也没有用处。有人能帮帮我吗

[更新] 我尝试在代码中使用链接锚定。但它似乎不起作用。我做错什么了吗

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,
    ),
  );
}
reportView(上下文)异步{
最终文件pdf=文件();
最终字节数据=
等待rootBundle.load(“assets/fonts/Open_Sans/OpenSans Regular.ttf”);
最终字体ttf=Font.ttf(fontData);
最终文本样式=文本样式(字体:ttf);
最终包装项目=包装(子项:wait_buildPdfBlock(textStyle));
pdf.addPage(
多页(
页面格式:
PdfPageFormat.letter.copyWith(marginBottom:1.5*PdfPageFormat.cm),
crossAxisAlignment:crossAxisAlignment.start,
构建:(上下文)=>[项目],
),
);
_索引(
上下文
pdf,
文本样式,
);
_内容(上下文、pdf、文本样式);
最终字符串dir=(等待getApplicationDocumentsDirectory()).path;
最终字符串路径='$dir/App'+'.pdf';
最终文件=文件(路径);
打印(路径);
wait file.writeAsBytes(pdf.save());
等待Share.shareFiles([path]);
}
未来构建PDFBlock(TextStyle TextStyle)异步{
列表=[];
列=列(
mainAxisAlignment:mainAxisAlignment.start,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
标题(级别:1,子级:文本(“PDF生成”,样式:textStyle)),
文本(“Hello World”,样式:textStyle)
]);
列表。添加(列);
退货清单;
}
void\u索引(动态上下文、文档pdf、文本样式){
列表索引列表=[];
var indexNumber=1;
对于(变量i=指数编号;i<10;i++){
Text indexText=Text(indexNumber.toString()+“+”Hello$indexNumber“,
风格:文本风格);
链接(
孩子:indexText,
目的地:indexNumber.toString()+“+”Hello$indexNumber”);
添加(indexText);
indexNumber++;
}
pdf.addPage(
多页(
页面格式:
PdfPageFormat.letter.copyWith(marginBottom:1.5*PdfPageFormat.cm),
crossAxisAlignment:crossAxisAlignment.start,
构建:(上下文)=>索引列表,
),
);
}
void\u内容(动态上下文、文档pdf、文本样式){
列表内容列表=[];
var-contentNumber=1;
for(var i=contentNumber;i<10;i++){
标题contentIndex=标题(
child:Text(contentNumber.toString()+“+”Hello$contentNumber“,
风格:textStyle);
文本内容=文本(“”)+
loremIpsum(文字:60,段落:3,initWithLorem:true));
锚定(
名称:contentNumber.toString()+“+”Hello$contentNumber“,
child:contentIndex);
contentList.add(contentIndex);
contentList.add(内容);
contentNumber++;
}
pdf.addPage(
多页(
页面格式:
PdfPageFormat.letter.copyWith(marginBottom:1.5*PdfPageFormat.cm),
crossAxisAlignment:crossAxisAlignment.start,
构建:(上下文)=>contentList,
),
);
}

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

您可以使用
锚定
链接
在pdf中使用
省道pdf
在代码中创建这样一个页面:

首先在要链接到的页面上创建一个
锚定点

Anchor(名称:“我的第一个Anchor”),
然后你可以参考目录中的锚,如下所示:

链接(目的地:“我的第一个锚”),

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

我尝试在代码中使用链接和锚点。但它似乎不起作用。我做错什么了吗?我真的发现了我的错误。我用错误的方式实现了它。我现在已经修好了。非常感谢你的帮助