Flutter中如何一次性打印多份HTML字符串内容?
实现多份HTML内容打印的解决方案
你可以通过以下两种方式实现一次性打印多份HTML内容,无需保存文件:
方式一:重复生成PDF页面
在onLayout回调中,先将HTML转换为单页PDF字节流,再将这份内容重复添加到新PDF文档中,生成包含多份内容的完整文档:
await Printing.layoutPdf( onLayout: (PdfPageFormat format) async { // 转换单份HTML为PDF字节流 final singlePagePdf = await Printing.convertHtml( format: format, html: '<html><body><p>Hello!</p></body></html>', ); // 设置打印份数 final copyCount = 3; // 创建新的PDF文档实例 final pdf = pw.Document(); // 读取单页PDF的页面数据 final pages = await pw.PdfMerger().importPages(singlePagePdf); // 循环添加多份页面 for (var i = 0; i < copyCount; i++) { pdf.addPage(pw.MultiPage( pages: pages, // 可选:添加页码或份数标识 footer: (context) => pw.Align( alignment: pw.Alignment.center, child: pw.Text('第${i+1}份'), ), )); } // 生成最终PDF字节流并返回 return await pdf.save(); }, );
方式二:修改HTML内容重复渲染
直接在HTML字符串中重复内容,并添加分页符,让Printing包一次性渲染出多页内容:
await Printing.layoutPdf( onLayout: (PdfPageFormat format) async { final copyCount = 3; String repeatedHtml = ''; // 循环拼接HTML内容,每份后加分页符 for (var i = 0; i < copyCount; i++) { repeatedHtml += '<html><body><p>Hello!</p></body></html>'; if (i != copyCount - 1) { repeatedHtml += '<div style="page-break-after: always;"></div>'; } } // 转换拼接后的HTML为PDF return await Printing.convertHtml( format: format, html: repeatedHtml, ); }, );
两种方式的适用场景
- 方式一更适合复杂HTML内容,避免重复渲染带来的性能损耗;
- 方式二更简洁,适合简单内容,但大HTML重复拼接会增加内存占用。
内容的提问来源于stack exchange,提问作者Vampiress
相关产品推荐
相关产品推荐

