文本编辑器中的PDF表单字段

时间:2014-07-27 23:16:32

标签: pdf acrobat

长话短说;我想仅使用文本编辑器从pdf表单编辑只读字段。我成功了,但我想理解为什么在某些情况下它不起作用......

我注意到如果我的原始文档版本为PDF 1.5(没有字段,以2010年为单位保存为pdf)并使用Acrobat Pro XI添加字段,请使用另存为另存为... - &gt ;优化PDF并使其与Acrobat 6.0兼容。我的字段在文本编辑器中看起来像这样(记事本++):

<</AP<</N 28 0 R>>/DA(/Helv 12 Tf 0 g)/DV(mytextfield)/F 4/FT/Tx/Ff 1/MK<<>>/P 3 0 

R/Rect[99.4934 686.99 249.493 708.99]/Subtype/Widget/T(%mytextfield)/Type/Annot/V(mytextfield)>>
endobj
28 0 obj
<</BBox[0.0 0.0 150.0 22.0]/FormType 1/Length 88/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</Font<</Helv 20 0 R>>/ProcSet[/PDF/Text]>>/Subtype/Form/Type/XObject>>stream
/Tx BMC 
q
1 1 148 20 re
W
n
BT
/Helv 12 Tf
0 g
2 6.548 Td
(mytextfield) Tj

每次看到'mytextfield'时都很容易修改,这是我的字段的内容以及你看到'%mytextfield'的地方,它是我的字段的名称。

另一方面,如果我使用我的PDF 1.5(由单词2010保存)而不是使用acrobat pro XI进行优化保存(在添加字段之后),我将其正常保存(另存为),我得到一个PDF 1.6以下(在记事本++中):

<</AcroForm 25 0 R/Lang(fr-CH)/MarkInfo<</Marked true>>/Metadata 3 0 R/Pages 15 0 R/StructTreeRoot 8 0 R/Type/Catalog>>
endobj
19 0 obj
<</Annots 26 0 R/Contents 22 0 R/CropBox[0 0 595.32 841.92]/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 595.32 841.92]/Parent 15 0 R/Resources<</ExtGState<</GS0 30 0 R>>/Font<</TT0 33 0 R>>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 0/Tabs/S/Type/Page>>
endobj
20 0 obj
<</BBox[0.0 0.0 150.0 22.0]/FormType 1/Length 85/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</Font<</Helv 28 0 R>>/ProcSet[/PDF/Text]>>/Subtype/Form/Type/XObject>>stream
/Tx BMC 
q
1 1 148 20 re
W
n
BT
/Helv 12 Tf
0 g
2 6.548 Td
(mytextfield) Tj

这不是编辑字段的简单格式(如果我更改mytextfield,我会收到损坏的文档!)。现在,如果我在acrobat pro中打开这个PDF 1.6并使用上面提到的优化PDF技巧保存它,那么该字段会转换为第一个;但事实并非如此!相反,我得到完全相同的字段格式。

所以我的问题如下:

  1. 有没有办法确保我的pdf表格,无论原件是哪个PDF版本,都可以使用Acrobat Pro或任何其他程序转换为正确的格式(易于编辑的字段)?
  2. 有没有办法轻松编辑PDF 1.6字段?

1 个答案:

答案 0 :(得分:1)

评论中的OP清楚地表明,在他的编辑过程中,他用更长或更短的东西替换了PDF数据。

这通常是个坏主意,因为PDF文件有一个交叉引用表(或流),表示每个间接对象(每个nnn 0 obj...endobj)的相应偏移量。用不同长度的数据替换PDF数据会使编辑位置后的对象的这些交叉引用信息无效。

因此,要在编辑后获得有效的PDF,至少必须更新交叉引用信息,这在单纯的文本编辑器中是一个真正的麻烦(在交叉引用表的情况下)或甚至几乎不可能(在压缩交叉的情况下)参考流)。

详细信息可以在PDF规范ISO 32000-1中找到。

此外,OP表示他在编辑后通过在PDF查看器中打开来检查文档有效性。

这也不是一个好主意,因为众所周知的PDF查看器通常倾向于在运行中尝试修复无效的PDF而不必显示这一点。操作PDF的程序通常需要有效的PDF(至少在它们正在操作的方面有效)作为输入,因此可能会拒绝或(甚至更糟)将编辑过的PDF篡改。

OP表明他的任务已在this question中描述。除非有一些合适的JS库,否则他基本上必须根据他的需要编写一个。

在此处尝试使用增量更新而不是操纵源PDF的内部信息可能是有利的。有关此内容,请参阅上述规范中的第7.5.6节增量更新

PS OP问

  

增量更新是否适用于只读字段

增量更新只是组织更改的另一种方式 - 您可以在原始文件中更改的所有内容也可以使用增量更新进行更改。实际上,您甚至可以使用增量更新执行更多操作:如果签名文档经常允许对文档进行某些更改,但这些更改必须作为增量更新进行,否则签名将在结构上被破坏。