使用syncfusion_flutter_pdf生成指定格式PDF的问题求助
网格位置偏移设置
你目前调用grid.draw时传入的bounds参数左上角x坐标为0,所以网格会从页面最左侧开始渲染。如果需要让网格从第三列对应的水平位置开始,直接调整Rect.fromLTWH的第一个参数即可,同时需要预留出页脚的高度避免内容被页脚遮挡:
// 示例中前面预留200宽度(可根据实际需求调整为你需要的前两列留白宽度),高度减去页脚占用的100 grid.draw( page: page, bounds: Rect.fromLTWH(200, 0, page.getClientSize().width - 200, page.getClientSize().height - 100));
多页页脚统一显示
你现在只在手动创建的第一页调用了drawFooter方法,PdfGrid自动分页生成的新页面不会自动执行页脚绘制逻辑,需要通过PdfGrid的分页回调给所有页面添加页脚,修改后的完整生成逻辑参考:
Future<void> generateInvoice() async { final PdfDocument document = PdfDocument(); final PdfPage page = document.pages.add(); final Size pageSize = page.getClientSize(); final PdfGrid grid = PdfGrid(); grid.columns.add(count: 6); final PdfGridRow headerRow = grid.headers.add(1)[0]; headerRow.style.backgroundBrush = PdfSolidBrush(PdfColor(68, 114, 196)); headerRow.style.textBrush = PdfBrushes.white; headerRow.cells[0].value = 'Product Image'; headerRow.cells[1].value = 'Product Id'; headerRow.cells[1].stringFormat.alignment = PdfTextAlignment.center; headerRow.cells[2].value = 'Product Name'; headerRow.cells[3].value = 'Metal'; headerRow.cells[4].value = 'Stone'; headerRow.cells[5].value = 'Quantity'; for(int i = 0; i < _totalItems; i++){ final PdfGridRow row = grid.rows.add(); var imageResponse1 = await get(Uri.parse(photoArray[i])); row.cells[0].value = PdfBitmap(imageResponse1.bodyBytes.toList()); row.cells[1].value = array[i]; row.cells[2].value = nameArray[i]; row.cells[3].value = metalArray[i]; row.cells[4].value = stoneArray[i]; row.cells[5].value = '1'; grid.rows[i].height = 100; } grid.columns[2].width = 200; for (int i = 0; i < headerRow.cells.count; i++) { headerRow.cells[i].style.cellPadding = PdfPaddings(bottom: 5, left: 5, right: 5, top: 5); } grid.applyBuiltInStyle(PdfGridBuiltInStyle.listTable4Accent5); // 绘制网格并监听分页,给每一页加页脚 PdfLayoutResult layoutResult = grid.draw( page: page, bounds: Rect.fromLTWH(200, 0, page.getClientSize().width - 200, page.getClientSize().height - 100), callback: (PdfGridPageLayoutArgs args) { // 每一页渲染完成前调用drawFooter drawFooter(args.page, args.page.getClientSize()); } )!; // 保存逻辑不变 final List<int> bytes = document.save(); document.dispose(); Directory directory = (await getExternalStorageDirectory()); String path = directory.path; File file = File('$path/Output.pdf'); await file.writeAsBytes(bytes, flush: true); setState(() { isApiCallProcess = false; }); OpenFile.open('$path/Output.pdf'); } // drawFooter方法无需修改 void drawFooter(PdfPage page, Size pageSize) { final PdfPen linePen = PdfPen(PdfColor(142, 170, 219, 255), dashStyle: PdfDashStyle.custom); linePen.dashPattern = <double>[3, 3]; page.graphics.drawLine(linePen, Offset(0, pageSize.height - 100), Offset(pageSize.width, pageSize.height - 100)); const String footerContent = '''\r\n\r\nAny Questions? shreennansharda@gmail.com Or 971529893336'''; page.graphics.drawString( footerContent, PdfStandardFont(PdfFontFamily.helvetica, 9), format: PdfStringFormat(alignment: PdfTextAlignment.right), bounds: Rect.fromLTWH(pageSize.width - 30, pageSize.height - 70, 0, 0)); }
如果需要调整网格的起始水平位置,直接修改Rect.fromLTWH的第一个参数数值即可,数值越大网格越靠右。
内容的提问来源于stack exchange,提问作者Manish Shah
相关产品推荐
相关产品推荐

