tcpdf 官方不提供 composer 包,需用 composer require tecnickcom/tcpdf;php 版本不兼容时应锁死 6.5.0 版;中文需设 cid0cs 字体;水印须用绝对坐标与 rotate 精确控制。

composer install tcpdf 失败或找不到包
TCPDF 官方不提供 Composer 官方包,composer require tecnickcom/tcpdf 是唯一有效方式——不是 tcpdf/tcpdf,也不是 setasign/fpdi-tcpdf(那是 FPDI 扩展)。很多人输错 vendor 名直接报 Could not find package。
常见错误现象:Package tecnickcom/tcpdf has a PHP requirement incompatible with your PHP version,因为 TCPDF 6.6+ 要求 PHP ≥ 7.1,而旧项目可能还在用 PHP 5.6。这时得锁死版本:composer require tecnickcom/tcpdf:6.5.0。
实操建议:
- 先确认 PHP 版本:
php -v - 生产环境建议加
--no-dev避免带入测试类 - 安装后别急着用
new TCPDF(),先检查vendor/tecnickcom/tcpdf/tcpdf.php是否存在且可读
new TCPDF() 后生成空白 PDF 或中文乱码
TCPDF 默认字体是 helvetica,不支持中文。直接写汉字会变成方块或空格,甚至整个文档渲染失败、输出为空白 PDF(浏览器显示“无法加载PDF”或下载后打不开)。
必须显式设置中文字体,推荐用 cid0cs(内置 UTF-8 中文支持):
require_once 'vendor/tecnickcom/tcpdf/tcpdf.php';
$pdf = new TCPDF();
$pdf->setLanguageArray(['a_meta_charset' => 'UTF-8']);
$pdf->setFont('cid0cs', '', 12); // 关键:必须设这个字体
$pdf->addPage();
$pdf->writeHTML('你好世界', true, false, true, false, '');
注意:cid0cs 仅在 TCPDF ≥ 6.2.12 中稳定;若用老版本,得手动复制 fonts/unbatang.ttf 并用 addTTFfont() 注册,容易路径出错或编码不匹配。
addImage() 加水印后 PDF 打不开或位置偏移
TCPDF 没有「水印」专用方法,得靠 setImageScale() + Image() 叠加在页眉/页脚/内容层。常见问题是 PDF 在 Adobe Reader 里提示“文件已损坏”,或图片只显示一半——基本是坐标系理解错了。
TCPDF 的 (0,0) 在左上角,Y 向下增长;但 Image() 的 $y 参数默认是“距页面顶部距离”,不是“距当前行距离”。如果在 writeHTML() 后立刻调用,当前 Y 坐标可能已超出页面高度。
实操建议:
- 水印图建议用透明 PNG,尺寸控制在 200×200px 内,太大易触发内存溢出
- 用
$pdf->startPageGroup()配合setPageMark()确保每页都加,而不是只在第一页 - 安全写法:在
startPage()后立即画水印,用绝对坐标,比如$pdf->Image('watermark.png', 50, 100, 100, 0, '', '', '', true, 300)
生成带文字水印的 PDF 性能差、内存爆掉
有人用 writeHTML('<div style="opacity:0.1;">CONFIDENTIAL</div>') 想实现文字水印,结果生成 10 页 PDF 就报 Fatal error: Allowed memory size exhausted。这是因为 TCPDF 的 HTML 解析器对 CSS 支持极弱,opacity 不生效,反而反复重绘导致内存泄漏。
正确做法是用 rotate() + setTextColor() + writeHTMLCell() 手动绘制斜文字:
$pdf->startPageGroup();
$pdf->setPageMark();
$pdf->addPage();
$pdf->rotate(25, 105, 148); // 绕中心点旋转
$pdf->setTextColor(200, 200, 200);
$pdf->setFont('helvetica', 'B', 40);
$pdf->writeHTMLCell(0, 0, 15, 120, 'DRAFT', 0, 1, 0, true, 'C', true);
$pdf->rotate(0);
关键点:旋转后必须 rotate(0) 重置,否则后续内容全歪;文字颜色别用纯灰(128,128,128),TCPDF 渲染时容易发虚;字号超过 50 容易撑破页面边界。
复杂点在于:TCPDF 的 rotate 是基于 PDF 坐标系的,单位是度,原点默认是页面左下角(不是左上角),所以实际调试时得反复试 x/y 和旋转中心——这个细节几乎没人提,但改错一个参数就能让水印从“看不见”变成“刚好居中”。










