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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 00:45:05