本文正在参加「金石方案」
原文: pdf | Dart Package (flutter-io.cn)
译时版别:3.10.1
Dart/Flutter 的 PDF 创立库 pdf
该库分为以下两部分:
- 从底层级创立 pdf 的库,控制 pdf 字节的生成 。
- 类似于 Flutter 的组件类型,便于从高等级创立 pdf 。
该库可运用图形、图片以及运用 TrueType 字体的文本创立完好的多页文档。
且如你所知易于操作。
在这里检查交互示例:davbfr.github.io/dart_pdf/.
完好演示的源代码可在任何可运转 Flutter 的设备上运转。如何编译可在此找到:github.com/DavBfr/dart…
运用printing
库pub.flutter-io.cn/packages/pr…可用于完好的 Flutter 打印和同享操作。
坐标系统运用内置的 pdf 单位:
- 1.0 界说为 1 / 72.0 英寸
- 能够运用 PdfPageFormat 中界说的厘米、毫米和英寸的常量。
装置
假如想用 Flutter 在真实的打印机中打印 pdf 文档,可依照 pub.flutter-io.cn/packages/pr… 中的指示。
-
如 装置标签中描绘的,在运用的
pubspec.yaml
中增加该库。 -
导入该库
import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw;
示例
final pdf = pw.Document();
pdf.addPage(pw.Page(
pageFormat: PdfPageFormat.a4,
build: (pw.Context context) {
return pw.Center(
child: pw.Text("Hello World"),
); // Center
})); // Page
从文件加载图片:
final image = pw.MemoryImage(
File('test.webp').readAsBytesSync(),
);
pdf.addPage(pw.Page(build: (pw.Context context) {
return pw.Center(
child: pw.Image(image),
); // Center
})); // Page
运用 printing
库从网络加载图片:
final netImage = await networkImage('https://www.6hu.cc/wp-content/uploads/2023/05/1682875998-78bb23167930d6c.jpg');
pdf.addPage(pw.Page(build: (pw.Context context) {
return pw.Center(
child: pw.Image(netImage),
); // Center
})); // Page
加载SVG:
String svgRaw = '''
<svg viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg">
<ellipse 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,
); // Center
})); // Page
要从 Flutter 的 asset 资源中加载 SVG ,运用await rootBundle.loadString('assets/file.svg')
运用 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)),
); // Center
})); // Page
或许运用 printing
库的 PdfGoogleFonts
(字体):
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)),
); // Center
})); // Page
显示颜文字:
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,
),
),
); // Center
})); // Page
保存 pdf 文件:
// 在 Flutter 上,运用 [path_provider](https://pub.flutter-io.cn/packages/path_provider) 库:
// final output = await getTemporaryDirectory();
// final file = File("${output.path}/example.pdf");
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
加密、数字签名及加载 PDF 文档
有独自的库,彻底支撑运用 RC4-40、 RC4-128、 AES-128 及 AES-256 的加密。
该库还提供运用 x509 证书的 SHA1 或 SHA-256 数字签名。
图形签名用可点击的组件展示,可表示数字签名信息。
它完成了 PDF 解析器,可加载已有的文件并可增加修改页以及增加签名。
更多信息在这里:pub.nfet.net/pdf_crypto/
本文正在参加「金石方案」