You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何自定义printing包打印预览并应用用户所选打印参数

各端参考效果
  • Android端图片打印预览:Android端图片打印预览
  • Android端页面尺寸预览列表:Android端页面尺寸预览列表
  • iOS端页面尺寸预览: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 21:54:32