likes
comments
collection
share

[译]Dart/Flutter 的 PDF 创建库 pdf

作者站长头像
站长
· 阅读数 74

原文: pdf | Dart Package (flutter-io.cn)

译时版本:3.10.1


Dart/Flutter 的 PDF 创建库 pdf

该库分为以下两部分:

  • 从底层级创建 pdf 的库,控制 pdf 字节的生成 。
  • 类似于 Flutter 的组件类型,便于从高级别创建 pdf 。

该库可使用图形、图片以及使用 TrueType 字体的文本创建完整的多页文档。 且如你所知易于操作。

在这里查看交互示例: davbfr.github.io/dart_pdf/.

[译]Dart/Flutter 的 PDF 创建库 pdf

完整演示的源代码可在任何可运行 Flutter 的设备上运行。如何编译可在此找到: github.com/DavBfr/dart…

使用 printing 库 pub.flutter-io.cn/packages/pr… 可用于完整的 Flutter 打印和共享操作。

坐标系统使用内置的 pdf 单位:

  • 1.0 定义为 1 / 72.0 英寸
  • 可以使用 PdfPageFormat 中定义的厘米、毫米和英寸的常量。

[译]Dart/Flutter 的 PDF 创建库 pdf

安装

如果想用 Flutter 在真实的打印机中打印 pdf 文档,可按照 pub.flutter-io.cn/packages/pr… 中的指示。

  1. 如 安装标签中描述的,在应用的 pubspec.yaml 中添加该库。

  2. 导入该库

    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.nfet.net/nfet.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 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,
  ); // 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/


转载自:https://juejin.cn/post/7220966858245357625
评论
请登录