用于 dart/flutter 的 PDF 创建库

该库分为两部分

  • 一个低级 PDF 创建库,负责 PDF 位生成。
  • 一个类似 Flutter 的 Widgets 系统,用于简单的、高级的 PDF 创建。

它可以使用您熟悉的易用性,使用 TrueType 字体创建包含图形、图像和文本的多页文档。

在此处查看交互式演示: https://davbfr.github.io/dart_pdf/

Example document

完整的演示源代码可以在此处找到,该演示可以在任何 Flutter 目标上运行,以及如何构建: https://github.com/DavBfr/dart_pdf/tree/master/demo/

使用 printinghttps://pub.dev/packages/printing 进行完整的 flutter 打印和共享操作。

坐标系使用内部 PDF 单位

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

Buy Me A Coffee

安装

如果您想使用 Flutter 将 PDF 文档打印到实际打印机,请按照 https://pub.dev/packages/printing 上的说明进行操作

  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 资源加载 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 文件

// On Flutter, use the [path_provider](https://pub.dev/packages/path_provider) library:
//   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 解析器,用于加载现有文档并添加页面、更改页面和添加签名。

更多信息请访问: https://pub.nfet.net/pdf_crypto/

GitHub

查看 Github