@@ -686,7 +686,7 @@ pw.TextAlign _colAlign(int i) {
/// 构建入库单/出库单 A4 版式(参照「锐浪报表」单据:公司抬头 + 两行三列表头
/// + 明细表 + 单据总计 + 温馨提示 + 签字行)。入库/出库仅称谓不同。
pw . Widget _buildOrderDoc ( {
List < pw . Widget > _buildOrderDoc ( {
required pw . Font font ,
required pw . Font bold ,
required String shopName , // 公司名称(顶部抬头)
@@ -724,15 +724,12 @@ pw.Widget _buildOrderDoc({
pw . Widget metaText ( String label , String value , pw . TextAlign align ) = >
pw . Text ( ' $ label : $ value ' , style: metaStyle , textAlign: align ) ;
return pw . Container (
// 左侧竖线点缀
decoration: const pw . BoxDecoration (
border: pw . Border ( left: pw . BorderSide ( color: PdfColors . black , width: 3 ) ) ,
) ,
padding: const pw . EdgeInsets . only ( left: 14 ) ,
child: pw . Column (
crossAxisAlignment: pw . CrossAxisAlignment . stretch ,
children: [
// 返回明细块的「子组件列表」而非单个 Container:作为 MultiPage 的顶层
// children,明细表可跨页拆分。左侧竖线点缀改由 pageTheme 背景每页绘制
// (见 _orderPageTheme)——原先用非可拆分的 pw.Container 包裹整块内容,
// 当内容超过一页时 MultiPage 无法拆分,分页算法不前进→无限加页、内存暴涨
// →打印卡死(根因)。
return [
// ── 抬头:公司名 + 单据类型,左对齐内联 ──────────────────────────
pw . Row (
crossAxisAlignment: pw . CrossAxisAlignment . end ,
@@ -887,11 +884,40 @@ pw.Widget _buildOrderDoc({
pw . SizedBox ( height: 10 ) ,
pw . Text ( ' 备注: $ remark ' , style: metaStyle ) ,
] ,
] ,
) ,
) ;
] ;
}
/// 出/入库单 MultiPage 页面主题:内容区左缩进 + 全页高左侧竖线点缀(每页都画)。
/// 用 pageTheme 背景绘制竖线,让明细内容(含表格)可跨页拆分,避免非可拆分
/// Container 在内容超一页时触发 MultiPage 分页死循环。
pw . PageTheme _orderPageTheme ( ) = > pw . PageTheme (
pageFormat: PdfPageFormat . a4 ,
// 左边距 = 原始外边距 15mm + (竖线宽 3 + 内缩 14),与旧版视觉缩进一致。
margin: const pw . EdgeInsets . fromLTRB (
15 * PdfPageFormat . mm + 17 ,
12 * PdfPageFormat . mm ,
15 * PdfPageFormat . mm ,
12 * PdfPageFormat . mm ,
) ,
buildBackground: ( ctx ) = > pw . FullPage (
ignoreMargins: true ,
child: pw . Padding (
padding: const pw . EdgeInsets . fromLTRB (
15 * PdfPageFormat . mm ,
12 * PdfPageFormat . mm ,
0 ,
12 * PdfPageFormat . mm ,
) ,
child: pw . Container (
decoration: const pw . BoxDecoration (
border: pw . Border (
left: pw . BorderSide ( color: PdfColors . black , width: 3 ) ) ,
) ,
) ,
) ,
) ,
) ;
/// 生成入库单 A4 PDF 字节(与实际打印同一套排版,供预览光栅化 + 打印共用)。
Future < Uint8List > buildStockInOrderPdfImpl (
StockInOrder order , OrderPrintMeta meta ) async {
@@ -919,10 +945,8 @@ Future<Uint8List> buildStockInOrderPdfImpl(
final doc = pw . Document ( ) ;
doc . addPage ( pw . MultiPage (
pageFormat: PdfPageFormat . a4 ,
margin: const pw . EdgeInsets . symmetric ( horizontal: 15 * PdfPageFormat . mm , vertical: 12 * PdfPageFormat . mm ) ,
build: ( _ ) = > [
_buildOrderDoc (
pageTheme: _orderPageTheme ( ) ,
build: ( _ ) = > _buildOrderDoc (
font: font , bold: bold ,
shopName: meta . shopName ,
title: ' 入 库 单 ' ,
@@ -944,7 +968,6 @@ Future<Uint8List> buildStockInOrderPdfImpl(
totalQty: totalQty ,
totalAmt: totalAmt ,
) ,
] ,
) ) ;
return doc . save ( ) ;
}
@@ -997,10 +1020,8 @@ Future<Uint8List> buildStockOutOrderPdfImpl(
final doc = pw . Document ( ) ;
doc . addPage ( pw . MultiPage (
pageFormat: PdfPageFormat . a4 ,
margin: const pw . EdgeInsets . symmetric ( horizontal: 15 * PdfPageFormat . mm , vertical: 12 * PdfPageFormat . mm ) ,
build: ( _ ) = > [
_buildOrderDoc (
pageTheme: _orderPageTheme ( ) ,
build: ( _ ) = > _buildOrderDoc (
font: font , bold: bold ,
shopName: meta . shopName ,
title: ' 出 库 单 ' ,
@@ -1022,7 +1043,6 @@ Future<Uint8List> buildStockOutOrderPdfImpl(
totalQty: totalQty ,
totalAmt: totalAmt ,
) ,
] ,
) ) ;
return doc . save ( ) ;
}