Flutter PDF转换插件custom_pdf_converter的使用
Flutter PDF转换插件custom_pdf_converter的使用
本库分为两个部分:
- 一个低级PDF生成库,负责生成PDF文件的各种元素。
- 类似于Flutter的小部件系统,用于轻松创建高级PDF。
它可以通过使用TrueType字体来创建包含图形、图像和文本的多页文档。使用起来非常简单。
完整的示例代码可以在以下GitHub仓库中找到: https://github.com/totemdeveloper/custom_pdf_converter/tree/main/example
要实现完整的Flutter打印和分享操作,请使用printing
包:
https://pub.dev/packages/printing
坐标系使用内部PDF单位定义:
- 1.0 定义为 1/72.0 英寸
- 可以使用
PdfPageFormat
中定义的厘米、毫米和英寸常量
安装
如果要在实际打印机上通过Flutter打印PDF文档,请遵循以下说明: https://pub.dev/packages/printing
- 将此软件包添加到您的项目的
pubspec.yaml
文件中,如安装选项卡所述。 - 导入库文件:
import 'package:custom_pdf_converter/widgets.dart' as pw;
示例
创建一个简单的PDF页面
final pdf = pw.Document();
pdf.addPage(pw.Page(
pageFormat: pw.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
使用networkImage加载网络上的图像
final netImage = await pw.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
String svgAsset = await rootBundle.loadString('assets/file.svg');
final svgImage = pw.SvgImage(svg: svgAsset);
pdf.addPage(pw.Page(build: (pw.Context context) {
return pw.Center(
child: svgImage,
); // Center
})); // Page
使用自定义TrueType字体
final Uint8List 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) {
return pw.Center(
child: pw.Text('Hello World', style: pw.TextStyle(font: ttf, fontSize: 40)),
); // Center
})); // Page
使用PDFGoogleFonts加载Google字体
final font = await pw.PdfGoogleFonts.nunitoExtraLight();
pdf.addPage(pw.Page(
pageFormat: pw.PdfPageFormat.a4,
build: (pw.Context context) {
return pw.Center(
child: pw.Text('Hello World', style: pw.TextStyle(font: font, fontSize: 40)),
); // Center
})); // Page
显示带颜色的emoji
final emoji = await pw.PdfGoogleFonts.notoColorEmoji();
pdf.addPage(pw.Page(
pageFormat: pw.PdfPageFormat.a4,
build: (pw.Context context) {
return pw.Center(
child: pw.Text(
'Hello 🐒💁👌🎍😍🦊👨 world!',
style: pw.TextStyle(
fontFallback: [emoji],
fontSize: 25,
),
),
); // Center
})); // Page
保存PDF文件
final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());
示例代码
以下是一个完整的示例代码,展示了如何使用custom_pdf_converter
插件创建并保存一个PDF文件:
import 'dart:io';
import 'package:custom_pdf_converter/widgets.dart' as pw;
Future<void> main() async {
final pdf = pw.Document();
pdf.addPage(
pw.Page(
build: (pw.Context context) => pw.Center(
child: pw.Text('Hello World!'),
),
),
);
final file = File('example.pdf');
await file.writeAsBytes(await pdf.save());
}
更多关于Flutter PDF转换插件custom_pdf_converter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter PDF转换插件custom_pdf_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用custom_pdf_converter
插件进行PDF转换的一个示例。这个插件允许你将Flutter的Widget转换成PDF文件。
首先,确保你已经在pubspec.yaml
文件中添加了custom_pdf_converter
依赖:
dependencies:
flutter:
sdk: flutter
custom_pdf_converter: ^x.y.z # 请替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
以下是一个简单的示例代码,展示如何使用custom_pdf_converter
将Flutter的Widget转换成PDF文件并保存到设备存储中:
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:custom_pdf_converter/custom_pdf_converter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('PDF Converter Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: _generatePdf,
child: Text('Generate PDF'),
),
),
),
);
}
Future<void> _generatePdf() async {
// 创建一个简单的Widget
final Widget pdfWidget = Container(
color: Colors.white,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Hello, this is a PDF document!',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
Image.network(
'https://via.placeholder.com/150',
width: 150,
height: 150,
),
],
),
);
// 获取应用文档目录
final Directory appDocDir = await getApplicationDocumentsDirectory();
final String appDocPath = appDocDir.path;
final String pdfPath = '$appDocPath/example.pdf';
// 将Widget转换为PDF并保存到指定路径
final bool result = await CustomPdfConverter.convert(
pdfWidget,
pdfPath,
paperFormat: PaperFormat.a4,
margin: EdgeInsets.all(20),
);
if (result) {
print('PDF generated successfully at $pdfPath');
// 你可以在这里添加代码以打开或分享PDF文件
} else {
print('Failed to generate PDF');
}
}
}
在这个示例中,我们做了以下几件事:
- 在
pubspec.yaml
文件中添加了custom_pdf_converter
依赖。 - 创建了一个简单的Flutter应用,其中包含一个按钮。
- 当按钮被点击时,调用
_generatePdf
函数。 - 在
_generatePdf
函数中,我们创建了一个简单的Widget(包含一个文本和一个网络图片)。 - 使用
getApplicationDocumentsDirectory
函数获取应用的文档目录,并指定PDF文件的保存路径。 - 使用
CustomPdfConverter.convert
函数将Widget转换为PDF并保存到指定路径。
请注意,custom_pdf_converter
插件的具体API可能会随着版本的更新而变化,因此请参考其官方文档以获取最新和最准确的信息。此外,由于网络图片加载是异步的,在实际应用中可能需要更复杂的处理来确保图片在转换前已加载完成。