Dart/Flutter PDF生成库DavBfr/dart_pdf完全指南

Dart/Flutter PDF生成库DavBfr/dart_pdf完全指南

【免费下载链接】dart_pdf Pdf creation module for dart/flutter 【免费下载链接】dart_pdf 项目地址: https://gitcode.com/gh_mirrors/da/dart_pdf

项目概述

DavBfr/dart_pdf是一个功能强大的Dart/Flutter PDF生成库,它提供了两种不同层级的API:

  1. 底层PDF生成库:负责处理PDF二进制数据的生成
  2. Widget系统:提供类似Flutter Widget的高层级API,简化PDF创建过程

这个库能够创建包含图形、图像和TrueType字体文本的多页PDF文档,其易用性与Flutter框架保持一致。

核心特性

  • 支持多页PDF文档创建
  • 图形绘制功能
  • 图像嵌入(支持多种来源)
  • TrueType字体支持
  • SVG矢量图形支持
  • 表情符号显示
  • 文档加密和数字签名(通过扩展库)

安装与基础使用

安装步骤

  1. 在项目的pubspec.yaml文件中添加依赖
  2. 导入必要的库文件
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文档
  • 添加新页面
  • 修改现有页面
  • 添加数字签名

最佳实践

  1. 性能优化:对于大型文档,考虑分块生成和保存
  2. 资源管理:及时释放不再需要的图像和字体资源
  3. 错误处理:添加适当的异常处理,特别是网络资源加载
  4. 跨平台兼容性:注意不同平台(移动端/Web端)的资源加载方式差异

通过DavBfr/dart_pdf库,开发者可以轻松地在Dart/Flutter应用中创建功能丰富、格式专业的PDF文档,满足各种业务场景的需求。

【免费下载链接】dart_pdf Pdf creation module for dart/flutter 【免费下载链接】dart_pdf 项目地址: https://gitcode.com/gh_mirrors/da/dart_pdf

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值