Dart/Flutter PDF生成库DavBfr/dart_pdf完全指南
项目概述
DavBfr/dart_pdf是一个功能强大的Dart/Flutter PDF生成库,它提供了两种不同层级的API:
- 底层PDF生成库:负责处理PDF二进制数据的生成
- Widget系统:提供类似Flutter Widget的高层级API,简化PDF创建过程
这个库能够创建包含图形、图像和TrueType字体文本的多页PDF文档,其易用性与Flutter框架保持一致。
核心特性
- 支持多页PDF文档创建
- 图形绘制功能
- 图像嵌入(支持多种来源)
- TrueType字体支持
- SVG矢量图形支持
- 表情符号显示
- 文档加密和数字签名(通过扩展库)
安装与基础使用
安装步骤
- 在项目的
pubspec.yaml文件中添加依赖 - 导入必要的库文件
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw; // 使用别名pw避免命名冲突
创建简单PDF文档
final pdf = pw.Document();
pdf.addPage(pw.Page(
pageFormat: PdfPageFormat.a4,
build: (pw.Context context) {
return pw.Center(
child: pw.Text("Hello World"),
);
}
));
坐标系系统
该库使用PDF内部单位系统:
- 基本单位:1.0 = 1/72英寸
- 提供了便捷的常量用于常用单位转换:
PdfPageFormat.cm厘米PdfPageFormat.mm毫米PdfPageFormat.inch英寸
图像处理
从文件加载图像(移动端)
final image = pw.MemoryImage(
File('test.webp').readAsBytesSync(),
);
pdf.addPage(pw.Page(build: (pw.Context context) {
return pw.Center(
child: pw.Image(image),
);
}));
从资源文件加载图像(Web端)
// 获取图像字节数据
final img = await rootBundle.load('assets/images/logo.jpg');
final imageBytes = img.buffer.asUint8List();
// 创建图像对象
pw.Image image1 = pw.Image(pw.MemoryImage(imageBytes));
// 在容器中使用图像
pw.Container(
alignment: pw.Alignment.center,
height: 200,
child: image1,
);
从网络加载图像
final netImage = await networkImage('https://www.example.com/image.jpg');
pdf.addPage(pw.Page(build: (pw.Context context) {
return pw.Center(
child: pw.Image(netImage),
);
}));
SVG支持
直接使用SVG字符串
String svgRaw = '''
<svg viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg">
<ellipse style="fill: grey; stroke: black;" cx="25" cy="25" rx="20" ry="20"></ellipse>
</svg>
''';
final svgImage = pw.SvgImage(svg: svgRaw);
pdf.addPage(pw.Page(build: (pw.Context context) {
return pw.Center(
child: svgImage,
);
}));
从资源文件加载SVG
final svgString = await rootBundle.loadString('assets/file.svg');
final svgImage = pw.SvgImage(svg: svgString);
字体处理
使用TrueType字体
final Uint8List fontData = File('open-sans.ttf').readAsBytesSync();
final ttf = pw.Font.ttf(fontData.buffer.asByteData());
pdf.addPage(pw.Page(
pageFormat: PdfPageFormat.a4,
build: (pw.Context context) {
return pw.Center(
child: pw.Text('Hello World',
style: pw.TextStyle(font: ttf, fontSize: 40)),
);
}
));
使用Google字体
final font = await PdfGoogleFonts.nunitoExtraLight();
pdf.addPage(pw.Page(
pageFormat: PdfPageFormat.a4,
build: (pw.Context context) {
return pw.Center(
child: pw.Text('Hello World',
style: pw.TextStyle(font: font, fontSize: 40)),
);
}
));
显示表情符号
final emoji = await PdfGoogleFonts.notoColorEmoji();
pdf.addPage(pw.Page(
pageFormat: PdfPageFormat.a4,
build: (pw.Context context) {
return pw.Center(
child: pw.Text(
'Hello 🐒💁👌🎍😍🦊👨 world!',
style: pw.TextStyle(
fontFallback: [emoji],
fontSize: 25,
),
),
);
}
));
文档保存
移动端保存PDF
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
Web端保存PDF
var savedFile = await pdf.save();
List<int> fileInts = List.from(savedFile);
web.HTMLAnchorElement()
..href = "data:application/octet-stream;charset=utf-16le;base64,${base64.encode(fileInts)}"
..setAttribute("download", "${DateTime.now().millisecondsSinceEpoch}.pdf")
..click();
高级功能
加密与数字签名
通过扩展库支持以下功能:
- 加密算法:RC4-40, RC4-128, AES-128, AES-256
- 数字签名:支持SHA1和SHA-256算法
- 使用x509证书进行签名
- 可点击的图形签名小部件,显示签名信息
PDF文档操作
扩展库还提供PDF解析功能,可以:
- 加载现有PDF文档
- 添加新页面
- 修改现有页面
- 添加数字签名
最佳实践
- 性能优化:对于大型文档,考虑分块生成和保存
- 资源管理:及时释放不再需要的图像和字体资源
- 错误处理:添加适当的异常处理,特别是网络资源加载
- 跨平台兼容性:注意不同平台(移动端/Web端)的资源加载方式差异
通过DavBfr/dart_pdf库,开发者可以轻松地在Dart/Flutter应用中创建功能丰富、格式专业的PDF文档,满足各种业务场景的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



