Skip to content

性能

TCPDF-Next 的设计目标是高吞吐量的文件生成。本页涵盖内置的优化机制与实务上的性能调优建议。

延迟子引擎初始化

Document 类持有超过 20 个子引擎(Graphics、Typography、Barcode、Forms、Layers 等)的引用,但大多数都是延迟初始化的 — 只在首次访问时才会创建。

一份仅含文字的简单 PDF 永远不会实例化 SVG 解析器、条码引擎或表单字段管理器。这让内存用量与你实际使用的功能成正比。

字体子集化

TCPDF-Next 默认仅嵌入文件中实际使用的字形。FontSubsetter 会分析所有文字内容,在嵌入前从 TrueType/OpenType 字体中剔除未使用的字形。

对于使用少量字符集的文件,字体数据可从数 MB 降至数 KB。

php
use Yeeefang\TcpdfNext\Core\Document;

// 字体子集化默认开启 — 无需额外配置
$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 12)
    ->cell(0, 10, '仅嵌入此处使用的字形。');

FlateDecode 压缩

所有内容流皆使用 zlib(FlateDecode)压缩。此功能默认启用,需要 ext-zlib PHP 扩展。压缩通常可将 PDF 文件大小减少 60-80%。

流式输出(PdfWriterChunked)

对于超大型文件,分段写入器会在页面数据定稿后逐步清出,而非将整份 PDF 保留在内存中。这对调用端完全透明 — 相同的 save()output() 方法不受文件大小影响。

php
use Yeeefang\TcpdfNext\Core\Document;

// 大型文件的流式输出
$pdf = Document::create();
$pdf->addPage()->setFont('Helvetica', '', 10);

for ($i = 0; $i < 5000; $i++) {
    $pdf->cell(0, 5, "Row {$i}: data content here", newLine: true);
}

$pdf->save('large-document.pdf');
// 字体子集化与 FlateDecode 压缩自动执行

交叉引用流

TCPDF-Next 使用交叉引用流(PDF 1.5+)取代传统的 xref 表格。交叉引用流本身也经过压缩,能产生更小的文件 — 尤其是对象数量众多的文件。

线性化(快速 Web 查看)

线性化会重新排列 PDF 对象,让第一页能在整份文件下载完成前就开始显示。对任何通过 HTTP 提供的 PDF 都建议启用:

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->setLinearization(true)
    ->addPage()
    ->cell(0, 10, '浏览器中渐进式渲染')
    ->save('web-optimized.pdf');

Linearizer 会插入提示流,告知查看器如何按需获取各页面。

MAX_PAGES 常量

Document::MAX_PAGES 默认值为 10,000 页。这是一道防护机制,避免生成过程中出现无穷循环。若你的使用场景需要更多页数,可通过继承类来覆盖此常量。

最佳实践

跨页面重复使用字体

设置一次字体后让它在各页面间沿用。除非字体确实需要变更,否则避免在每一页都调用 setFont()

php
$pdf = Document::create()
    ->setFont('Helvetica', '', 10);

for ($i = 0; $i < 100; $i++) {
    $pdf->addPage()
        ->cell(0, 5, "Page {$i} content");
}

使用模板(XObjects)处理重复内容

若每页都有相同的页首、页尾或水印,可将其创建为模板并盖印到各页面上。这会将内容存储为单一 PDF 对象并多次引用,而非逐页重复。

维持压缩启用

压缩默认开启。除非需要查看原始 PDF 流以进行调试,否则不要停用它。

大型文件使用流式输出

对于超过数百页的文件,流式输出可让内存用量不随页数增长而保持稳定。

维持字体子集化

字体子集化默认开启。请确保在正式环境中不要停用 — 完整字体嵌入可能会增加数 MB 的文件大小。

缩小事务范围

事务会存储完整的文件快照。保持事务的生命周期尽可能短,以避免内存用量倍增。详见事务

总览

功能默认影响
字体子集化开启更小的字体数据(KB vs MB)
FlateDecode 压缩开启流大小减少 60-80%
交叉引用流开启更小的 xref 数据
延迟初始化开启内存用量与功能使用成正比
流式输出自动大型文件维持稳定内存用量
线性化关闭建议对 Web 传递的 PDF 启用

以 LGPL-3.0-or-later 许可证发布。