Flutter PDF处理插件pdf_fork的使用
Flutter PDF处理插件pdf_fork的使用
Pdf创建库用于Dart/Flutter
该库源自于 https://github.com/DavBfr/dart_pdf
- 使依赖项更少限制,以提高包的兼容性。
此库分为两部分:
- 一个低级PDF创建库,负责生成PDF文件的各个部分。
- 一个类似于Flutter的小部件系统,便于高级PDF创建。
它可以创建包含图形、图像和文本(使用TrueType字体)的多页文档。使用你已经熟悉的简便方式。
查看交互式演示:https://davbfr.github.io/dart_pdf/。
可以在任何Flutter目标上运行的完整演示源代码及其构建方法,可以在这里找到: https://github.com/DavBfr/dart_pdf/tree/master/demo/
使用 printing
包 https://pub.dev/packages/printing 进行完整的Flutter打印和共享操作。
坐标系使用内部PDF单位:
- 1.0 定义为 1/72.0 英寸
- 可以使用
PdfPageFormat
中定义的厘米、毫米和英寸常量。
安装
如果你希望使用Flutter在实际打印机上打印PDF文档,请遵循 https://pub.dev/packages/printing 的说明。
-
将此包添加到你的
pubspec.yaml
文件中,如安装标签所述。 -
导入库:
import 'package:pdf/pdf.dart';
import 'package:pdf_fork/widgets.dart' as pw;
示例
创建并保存PDF文档
import 'dart:io';
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 添加一个A4大小的页面
pdf.addPage(
pw.Page(
// 页面格式设置为A4
pageFormat: pw.PdfPageFormat.a4,
// 页面内容
build: (pw.Context context) => pw.Center(
child: pw.Text("Hello World"), // 居中的文本
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
加载本地文件中的图像(移动设备)
import 'dart:io';
import 'package:image/image.dart' as imgLib;
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 读取本地文件中的图像
final image = pw.MemoryImage(File('test.webp').readAsBytesSync());
// 添加一个包含图像的页面
pdf.addPage(
pw.Page(
build: (pw.Context context) => pw.Center(
child: pw.Image(image), // 居中的图像
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
加载资产文件中的图像(Web)
import 'package:flutter/services.dart' show rootBundle;
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 从资源文件加载图像
final img = await rootBundle.load('assets/images/logo.jpg');
final imageBytes = img.buffer.asUint8List();
// 创建图像对象
pw.Image image1 = pw.Image(pw.MemoryImage(imageBytes));
// 添加一个包含图像的页面
pdf.addPage(
pw.Page(
build: (pw.Context context) => pw.Center(
child: pw.Container(
alignment: pw.Alignment.center,
height: 200,
child: image1,
), // 居中的容器
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
从网络加载图像
import 'package:printing/printing.dart';
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 从网络加载图像
final netImage = await printing.networkImage('https://www.nfet.net/nfet.jpg');
// 添加一个包含图像的页面
pdf.addPage(
pw.Page(
build: (pw.Context context) => pw.Center(
child: pw.Image(netImage), // 居中的图像
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
加载SVG图像
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 定义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>
''';
// 创建SVG图像对象
pw.SvgImage svgImage = pw.SvgImage(svg: svgRaw);
// 添加一个包含SVG图像的页面
pdf.addPage(
pw.Page(
build: (pw.Context context) => pw.Center(
child: svgImage, // 居中的SVG图像
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
使用TrueType字体
import 'dart:io';
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 读取TrueType字体文件
final fontData = File('open-sans.ttf').readAsBytesSync();
final ttf = pw.Font.ttf(fontData.buffer.asByteData());
// 添加一个包含文本的页面
pdf.addPage(
pw.Page(
pageFormat: pw.PdfPageFormat.a4,
build: (pw.Context context) => pw.Center(
child: pw.Text('Hello World', style: pw.TextStyle(font: ttf, fontSize: 40)), // 居中的文本
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
使用printing
包的PdfGoogleFonts
import 'package:printing/printing.dart';
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 获取Google字体
final font = await PdfGoogleFonts.nunitoExtraLight();
// 添加一个包含文本的页面
pdf.addPage(
pw.Page(
pageFormat: pw.PdfPageFormat.a4,
build: (pw.Context context) => pw.Center(
child: pw.Text('Hello World', style: pw.TextStyle(font: font, fontSize: 40)), // 居中的文本
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
显示表情符号
import 'package:printing/printing.dart';
import 'package:pdf_fork/widgets.dart' as pw;
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 获取Noto Color Emoji字体
final emoji = await PdfGoogleFonts.notoColorEmoji();
// 添加一个包含表情符号的页面
pdf.addPage(
pw.Page(
pageFormat: pw.PdfPageFormat.a4,
build: (pw.Context context) => pw.Center(
child: pw.Text(
'Hello 🐒💁👌🎍😍🦊👨 world!',
style: pw.TextStyle(
fontFallback: [emoji], // 使用emoji字体
fontSize: 25,
),
),
),
),
);
// 保存并写入PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
}
在移动端保存PDF文件
import 'package:path_provider/path_provider.dart'; // 引入路径提供器库
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 添加一个包含文本的页面
pdf.addPage(
pw.Page(
pageFormat: pw.PdfPageFormat.a4,
build: (pw.Context context) => pw.Center(
child: pw.Text('Hello World'), // 居中的文本
),
),
);
// 保存并写入PDF文件
final output = await getTemporaryDirectory(); // 获取临时目录
final file = File("${output.path}/example.pdf"); // 构建文件路径
await file.writeAsBytes(await pdf.save()); // 写入文件
}
在Web端保存PDF文件
import 'dart:convert';
import 'dart:html';
Future<void> main() async {
// 创建一个新的PDF文档对象
final pdf = pw.Document();
// 添加一个包含文本的页面
pdf.addPage(
pw.Page(
pageFormat: pw.PdfPageFormat.a4,
build: (pw.Context context) => pw.Center(
child: pw.Text('Hello World'), // 居中的文本
),
),
);
// 保存PDF数据
var savedFile = await pdf.save();
List<int> fileInts = List.from(savedFile); // 转换为整数列表
// 创建下载链接并触发下载
html.AnchorElement(
href: "data:application/octet-stream;charset=utf-16le;base64,${base64.encode(fileInts)}"
)..setAttribute("download", "${DateTime.now().millisecondsSinceEpoch}.pdf")
..click();
}
更多关于Flutter PDF处理插件pdf_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter PDF处理插件pdf_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
pdf_fork
是一个用于在 Flutter 中处理 PDF 文件的插件。它提供了创建、编辑和读取 PDF 文件的功能。以下是如何在 Flutter 项目中使用 pdf_fork
插件的详细步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 pdf_fork
插件的依赖。
dependencies:
flutter:
sdk: flutter
pdf_fork: ^2.0.0
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 pdf_fork
插件。
import 'package:pdf_fork/pdf.dart';
3. 创建 PDF 文档
你可以使用 pdf_fork
创建一个新的 PDF 文档,并添加内容。
void createPdf() {
// 创建一个新的 PDF 文档
final pdf = Document();
// 添加一个页面
pdf.addPage(Page(
build: (Context context) {
return Center(
child: Text("Hello, PDF!", style: TextStyle(fontSize: 40)),
);
},
));
// 保存 PDF 文件
final file = File('example.pdf');
file.writeAsBytesSync(pdf.save());
}
4. 读取和编辑 PDF 文档
pdf_fork
也支持读取和编辑现有的 PDF 文档。
void editPdf() async {
// 读取现有的 PDF 文件
final file = File('example.pdf');
final bytes = await file.readAsBytes();
// 加载 PDF 文档
final pdf = Document.open(bytes);
// 添加一个新页面
pdf.addPage(Page(
build: (Context context) {
return Center(
child: Text("New Page!", style: TextStyle(fontSize: 40)),
);
},
));
// 保存编辑后的 PDF 文件
file.writeAsBytesSync(pdf.save());
}
5. 显示 PDF 文档
如果你想在 Flutter 应用中显示 PDF 文档,可以使用 flutter_full_pdf_viewer
或其他 PDF 查看器插件。
首先,添加 flutter_full_pdf_viewer
依赖:
dependencies:
flutter_full_pdf_viewer: ^1.0.0+17
然后,使用以下代码显示 PDF 文件:
import 'package:flutter_full_pdf_viewer/flutter_full_pdf_viewer.dart';
void openPdf() async {
final file = File('example.pdf');
PDFDocument doc = await PDFDocument.fromFile(file);
PDFViewer.open(doc);
}