Flutter如何自定义printing包打印预览并应用用户所选打印参数
各端参考效果
- Android端图片打印预览:

- Android端页面尺寸预览列表:

- iOS端页面尺寸预览:

当前项目依赖版本
printing: ^5.9.1
pdf: ^3.8.1
现有打印预览实现代码
await Printing.layoutPdf( // [onLayout] 会在用户切换打印机、修改打印设置时被多次调用 onLayout: (PdfPageFormat format) { // 此处返回int数组格式的合法PDF文档即可 return doc.save(); }, );
对应实现方案
1. 修改默认页面尺寸、裁剪可选尺寸列表
printing: ^5.9.1 版本的layoutPdf方法原生提供了对应配置参数,不需要自定义预览页面即可实现:
- 传入
format参数指定默认页面尺寸,直接赋值为PdfPageFormat.a4即可替换默认的ISO A4选项 - 传入
formats参数定义允许选择的页面尺寸白名单,不在列表内的尺寸选项会自动从选择列表中移除
核心配置示例:
await Printing.layoutPdf( // 设置默认选中A4尺寸 format: PdfPageFormat.a4, // 自定义可选尺寸列表,仅保留需要的选项 formats: const [ PdfPageFormat.a4, // 可按需追加其他尺寸,比如PdfPageFormat.a5、PdfPageFormat.letter ], // 开启后会优先读取系统打印页的用户设置 usePrinterSettings: true, onLayout: (PdfPageFormat format) { // 动态生成PDF的逻辑 return _generatePdf(format); }, );
2. 运行时响应用户设置、按选中参数打印
onLayout回调本身的设计就是为了响应配置变更:用户每次修改打印设置(切换尺寸、调整边距、切换色彩模式等),这个回调都会重新触发,传入最新的配置参数。你之前的写法直接返回预生成的固定PDF,自然无法适配动态参数,调整为动态生成PDF即可:
- 页面尺寸适配:不要提前生成固定尺寸的PDF文档,在
onLayout触发时,使用入参传入的format(即用户当前选中的页面规格)创建对应尺寸的PDF页面 - 黑白/彩色模式适配:
- 如果使用系统自带的打印设置弹窗,开启
usePrinterSettings: true后,用户选择的黑白/彩色模式会由打印机层面自动适配;如果需要在PDF生成阶段就完成色彩转换,在绘制内容时将所有文本、图片、图形元素转为灰度/黑白色即可 - 如果是自定义预览页面上的黑白开关,将开关状态存为状态变量,生成PDF时读取该状态决定渲染色彩即可
动态生成PDF的参考代码:
- 如果使用系统自带的打印设置弹窗,开启
/// 根据传入的配置生成对应规格的PDF Future<List<int>> _generatePdf(PdfPageFormat format, {bool isBlackWhite = false}) async { final doc = pw.Document(); doc.addPage( pw.Page( // 使用用户当前选中的页面格式,不要写死尺寸 pageFormat: format, build: (pw.Context context) { // 根据色彩模式设置内容颜色 final contentColor = isBlackWhite ? PdfColors.black : PdfColors.blue; return pw.Center( child: pw.Text( "打印测试内容", style: pw.TextStyle(color: contentColor, fontSize: 24), ), ); }, ), ); return doc.save(); }
如果需要在用户确认打印时获取最终配置做业务处理,可以监听Printing.printingInfo流拿到打印任务的全流程状态和参数。
内容的提问来源于stack exchange,提问作者Mahendra Parmar
相关产品推荐
相关产品推荐

