Flutter 如何在颤振中向pdf动态添加内部导航
我正在开发一个颤振应用程序,它使用PDF库()在颤振中生成PDF文件。我需要创建一个pdf文件,其中有一个目录。它们应该与实际内容链接,并在单击时导航到各自的页面。我在网上找不到任何使用pdf库进行此操作的文档。PDF将被写入到一个文件中,因此Flatter中的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(
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”),
然后你可以参考目录中的锚,如下所示:
链接(目的地:“我的第一个锚”),
显然,锚点名称必须是唯一的。我尝试在代码中使用链接和锚点。但它似乎不起作用。我做错什么了吗?我真的发现了我的错误。我用错误的方式实现了它。我现在已经修好了。非常感谢你的帮助