首页 > 解决方案 > Dart-PDF - Flutter - 超过 100 页的慢速 PDF 渲染

问题描述

我正在根据数据库中的数据生成带有单个表的多页 PDF 文档。没什么花哨的,全是文字。但是生成 331 页 (~9MB) 需要 8 分钟以上。但如果我只生成61 个页面(~1.67MB),它只需要 10 seconds。似乎花费的时间成倍增加。

如果这很重要,我的目标是 Windows 版本。

# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter

  pdf: ^2.1.0
  printing: ^4.1.0
$ flutter doctor -v
[√] Flutter (Channel dev, 1.26.0-1.0.pre, on Microsoft Windows [Version 10.0.19042.804], locale en-US)
    • Flutter version 1.26.0-1.0.pre at C:\Users\User\Code\Programs\flutter
    • Framework revision 63062a6443 (5 months ago), 2020-12-13 23:19:13 +0800
    • Engine revision 4797b06652
    • Dart version 2.12.0 (build 2.12.0-141.0.dev)

[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.8.3)
    • Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
    • Visual Studio Community 2019 version 16.8.30804.86
    • Windows 10 SDK version 10.0.18362.0

[√] Android Studio (version 4.0)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 49.0.2
    • Dart plugin version 193.7547
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] VS Code, 64-bit edition (version 1.52.1)
    • VS Code at C:\Program Files\Microsoft VS Code
    • Flutter extension version 3.20.0

[√] Connected device (1 available)
    • Windows (desktop) • windows • windows-x64 • Microsoft Windows [Version 10.0.19042.804]

生成 PDF 的代码:

import 'package:pdf/widgets.dart' as pw;

Future<pw.Document> generate() {
  final pdf = pw.Document(compress: false);

  // multipage for auto new page
  pdf.addPage(pw.MultiPage(
    maxPages: 200, // quick fix to allow more than 20 pages in dev
    build: _handleBuild,
  ));

  return pdf;
}

List<pw.Widget> _handleBuild(pw.Context context) {
  // retrieves 1 row
  final List<List<dynamic>> summaryDataset = retrieveSummaryFromDb();

  // possibly returns more than 6000 rows
  final List<List<dynamic>> detailsDataset = retrieveDetailsFromDb();

  final reportTitle = pw.Container(
    child: pw.Text('Sales Transaction Report'),
    alignment: pw.Alignment.center,
  );

  final fromDate = DateTime.now();
  final toDate = DateTime.now();
  final reportDate = pw.Header(
      text: 'Date: ${fromDate}-${toDate}',
      level: 2);
  final reportClerk = pw.Header(text: 'Clerk: Steven', level: 2);

  final summaryTable = pw.Table.fromTextArray(
      data: summaryDataset,
      border: pw.TableBorder.all(),
      headers: <String>[
        'No. of Transactions',
        'Total Disc',
        'Total Amt.',
      ]);

  final detailsTable = pw.Table.fromTextArray(
      data: detailsDataset,
      border: pw.TableBorder.all(),
      headers: <String>[
        'Date',
        'Time',
        'OR/Inv',
        'Clerk',
        'Disc',
        'Disc Amount',
        'Amount',
        'Remarks'
      ]);
  return [
    reportTitle,
    reportDate,
    reportClerk,
    detailsTable,
    summaryTable,
  ];
}

笔记:

  1. SQL查询快~200ms,所以应该不是延迟的原因。

问题:

  1. 为什么慢?可能是因为内存流失?
  2. 关于如何使它不那么慢的任何解决方法?
  3. 如何减小文件大小?

谢谢

标签: flutterdartpdfdart-pub

解决方案


推荐阅读