Python - 如何使用 pdfrw 正确填充 PDF 表单中的多行文本字段?

问题描述 投票:0回答:4

我正在使用 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>
标签。

我应该如何设置值才能正确渲染?

python pdf acrobat pdf-form pdfrw
4个回答
4
投票

在努力展平我的字段(设置为只读)同时保持多行完整之后,我终于找到了解决方案。

我遇到了这个仓促的解决方案,只需将“/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 参考文档。

其他有用的位例如:

  • 第 14 位用于密码星号输入。
  • 第 23 位用于禁用拼写检查。
  • 第 24 位用于禁用字段滚动。

1
投票

我也遇到过这个问题。我还没有深入研究 pdfrw 的多行功能的实现,但我确实知道当我展平表单字段(Ff=1,您的代码中也有)时,它不再支持多行。尝试将其取消并查看是否再次支持多行。


0
投票

我无法阅读西班牙语设置,但如果您确保选中这两个字段,那么您可能会没事。

Setting


0
投票

我将

ff
设置为
4097
,它似乎有效,但需要检查它是否对其他事情有影响。

© www.soinside.com 2019 - 2024. All rights reserved.