tcpdf中文乱码需注册中文字体;smalot/pdfparser无法识别表格结构;fpdi合并pdf报错需解压或升级;php不支持生成交互式表单字段。

用 tcpdf 生成 PDF 时中文乱码怎么办
默认字体不支持中文,直接写汉字会变成方块或空白。TCPDF 自带的 helvetica、times 都是西文字体,必须显式注册中文字体。
- 下载一个支持 Unicode 的 TTF 中文字体(如
simhei.ttf或NotoSansCJKsc-Regular.otf),放到项目目录下(比如fonts/) - 调用
$pdf->addTTFfont()注册字体,返回新字体名(通常是文件名转小写加下划线,如simhei) - 再用
$pdf->setFont('simhei', '', 12)切换,之后所有writeHTML()或Cell()才能正常显示中文 - 注意:不能跳过注册步骤直接传路径给
setFont(),否则报错Undefined font and no default font set
用 smalot/pdfparser 读取 PDF 文字内容时提取不到表格数据
smalot/pdfparser 是基于文本流解析的,它把 PDF 当作文本容器处理,而表格在 PDF 中通常由线条+坐标定位构成,没有语义化“表格”结构。所以它只能拿到散落的单元格文字,但无法还原行列关系。
- 如果只要纯文本(比如合同正文、说明段落),
$parser->parseFile('a.pdf')->getText()足够用 - 如果需要识别表格,得配合
tabula-java或camelot-py(需命令行调用);PHP 侧可执行exec('java -jar tabula.jar -p all input.pdf')导出 CSV - 另有一种折中方式:先用
poppler-utils的pdftotext -layout提取带空格对齐的文本,再按缩进/空格做简单列切分——适合格式非常固定的报表
setasign/fpdi 合并 PDF 时提示 Unable to find object
这个错误常见于源 PDF 使用了较新的 PDF 标准(如 1.7+)或含加密、流压缩、交叉引用流(XRef stream),而 FPDI 默认只兼容基础 PDF 1.4–1.5 结构。
- 先用
qpdf --stream-data=uncompress input.pdf output.pdf解压流,再试导入 - 检查是否加密:
pdfinfo input.pdf | grep Encrypted,若为yes,需先用qpdf --decrypt解密 - 升级到
setasign/fpdiv2.6+,它内置了对 XRef stream 的支持,但依然不支持 AES-256 加密 - 避免直接合并扫描版 PDF(图像型),它们体积大且无文本对象,FPDI 虽能加载页,但后续操作(如加水印)可能失败
生成带表单字段(Form Fields)的 PDF 并导出填写值
PHP 原生和主流库(tcpdf、fpdi)都不支持创建交互式表单字段(如 TextField、CheckBox),只能生成静态内容。要实现“用户填 PDF 表单 → PHP 读回值”,得走两条路:
- 前端用
pdf-lib(JS)生成含字段的 PDF,用户浏览器填写后提交PDF bytes,PHP 用setasign/fpdi+setasign/fpdf读取 FDF 数据(需额外解析/AcroForm字典) - 更稳的方式:放弃 PDF 表单,用 HTML 表单收集数据,后端用
tcpdf把结果渲染成只读 PDF —— 避开字段解析的坑 - 若必须双向交互,建议用
PDFtk命令行:pdftk form.pdf fill_form data.fdf output filled.pdf,PHP 只负责生成.fdf文件(纯文本键值对)
PDF 表单字段的序列化和反序列化不是 PHP 生态的强项,容易卡在 PDF 规范版本、字段命名空间、编码转换这些细节上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











