PAYATHON 2026

PHPWord 1.4 中 firstLine 首行缩进为什么不生效?

数据小许

结论

这段 indentation 配置本身没有明显问题。PHPWord 仓库有一条尚未关闭的缺陷报告,反馈称在 1.4.0 中使用 ['indentation' => ['firstLine' => 400]] 没有效果。维护者回复提到,结果可能受输出格式影响,并展示了 RTFWriter 能生成首行缩进。建议先确认实际使用的 Writer,并检查生成文件中的段落属性,以判断问题出在 PHPWord 写入过程还是文档查看端。PHPWord 缺陷报告

排查生成的 DOCX

你提供的代码通过 addText() 传入段落样式,其中 firstLine 的值为 400。PHPWord 默认使用 twip 作为缩进单位,400 twip 等于 20 pt。PHPWord Settings

先用 Word2007 Writer 保存文件,再复制一份 .docx 并解压。检查 word/document.xml 中对应段落的属性,确认是否包含类似内容:

<w:ind w:firstLine="400"/>

如果没有该属性,缩进就没有写入 DOCX。如果属性存在,但显示效果仍不符合预期,可以检查文档应用的段落样式,以及打开文件的软件是否覆盖了直接格式。

可尝试的处理方式

  1. 确认 Writer 和保存格式。如果输出不是 DOCX,可根据实际 Writer 检查对应的缩进输出。缺陷报告展示了 RTFWriter 生成 \fi400 的例子,但这不能证明 Word2007 Writer 在 PHPWord 1.4 中也能正常工作。缺陷报告中的 Writer 讨论
  2. 评估是否临时使用 PHPWord 1.3.0。缺陷报告中的用户留言称该版本可用。可以先在项目副本中生成并检查文件,再决定是否采用这一临时方案。
  3. 如果按字符缩进也符合需求,可以暂时使用 firstLineChars。你提到该属性可用,但它与按 twip 指定的 firstLine 设置不同,不能直接视为等价替换。

现有资料无法确认 PHPWord 1.4 中 firstLine 失效的具体原因,也无法确认哪个版本修复了此问题。可以保留现有样式写法,并根据生成文件中的缩进属性和实际 Writer 输出判断问题所在。

备注:内容仅供参考。