flutter - 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,
];
}
笔记:
- SQL查询快~200ms,所以应该不是延迟的原因。
问题:
- 为什么慢?可能是因为内存流失?
- 关于如何使它不那么慢的任何解决方法?
- 如何减小文件大小?
谢谢
解决方案
推荐阅读
- arrays - 使用 .flatten 后,相同的字符串不相等
- java - 如何解决android studio 4.1“矢量图标包不兼容”问题?
- c++ - 计算算法复杂度
- angular - Angular 材质表的过滤器字符串为空的 filterPredicate
- c# - C# Access OleDB 分别添加时间和日期
- flutter - 什么是颤振存储库
- c++ - 使用 Winsock C++ 的蓝牙连接
- operating-system - 使用 Semaphore 确定三个进程的执行顺序并打印“AABC”
- bash - 如何递归地grep多个文件夹中的文件?我无法管道递归猫输出
- word-embedding - 从 BERT 模型中提取单词特征