我正在使用 python 和 pdfrw 填写 PDF 表单。我对表单中的任何单行文本字段都没有问题。但是当我尝试填充多行文本字段时,它无法正确渲染,它会忽略断行。
这是我的代码的一部分:
pdf.Root.AcroForm.update(PdfDict(NeedAppearances=PdfObject('true')))
for x in range(0, len(pdf.Root.AcroForm.Fields)):
try:
if pdf.Root.AcroForm.Fields[x].T in ['(Observaciones)']:
pdf.Root.AcroForm.Fields[x].update(PdfDict(V='This\nis\nmultiline', Ff=1))
continue
这是输出。
这是使用 Adobe Acrobat 在表单字段中进行的设置。
我选择了选项:多行、滚动长文本、允许富文本格式。
我也尝试过使用
\r
和 <br>
标签。
我应该如何设置值才能正确渲染?
在努力展平我的字段(设置为只读)同时保持多行完整之后,我终于找到了解决方案。
我遇到了这个仓促的解决方案,只需将“/Ff”值设置为 1,但这样做有可能删除表单的一些格式,这里有关于如何操作此字段的更好解释.
在 “PDF 参考:第三版” 页:552 它指出
“字段字典的Ff条目的值是一个无符号的32位 包含指定各种特征的标志的整数 场地。标志字内的位位置从 1 开始编号 (低位)到 32(高位)。“
因此,当我查看 Ff 字段时,我得到了 4096(二进制 = 0001-0000-0000-0000),用于分配我正在努力解决的表格。事实证明,第 13 位控制多行设置,只需将 Ff 设置为 1,即可擦除其余设置,仅指示特定形式应为只读。
你可以用懒惰的方式来做,给Ff值4097(或者任何你的Ff值+1)或者翻转你想要操作的字节字符串中你想要的位。
这是一个简单的方法,可以根据您的需要进行修改。
bitPosition = 0 #First position being value 0
bitValue = 1
mask = 1 << bitPosition
oldFfValue = pdf.Root.AcroForm.Fields[x].Ff
newFfValue = (int(oldFfValue) & ~mask) | ((1 << 0) & mask)
pdf.Root.AcroForm.Fields[x].Ff.update(PdfDict(Ff=newFfValue))
ps。不能 100% 确定以这种方式访问 Ff 值是否适合您,因为我的方法基于 this 人示例代码,因为它更适合我的需求。
总而言之,如果您想搞乱其余部分以了解它们控制的有趣特征,我建议您查看一下 PDF 参考文档。
其他有用的位例如:
我也遇到过这个问题。我还没有深入研究 pdfrw 的多行功能的实现,但我确实知道当我展平表单字段(Ff=1,您的代码中也有)时,它不再支持多行。尝试将其取消并查看是否再次支持多行。
我将
ff
设置为 4097
,它似乎有效,但需要检查它是否对其他事情有影响。