【问题标题】:PDF form field in a text editor文本编辑器中的 PDF 表单域
【发布时间】:2014-07-27 23:16:32
【问题描述】:

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

我注意到,如果我有原始文档的 PDF 1.5 版本(没有字段,由 word 2010 保存为 pdf)并使用 Acrobat Pro XI 添加字段,请使用另存为其他... ->优化 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(由 word 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. 有没有办法确保使用 Acrobat Pro 或任何其他程序将我的 pdf 表单(无论原始 PDF 版本是哪个 PDF 版本)转换为正确的格式(易于编辑的字段)?
  2. 有没有办法轻松编辑 PDF 1.6 字段?

【问题讨论】:

  • 在编辑字段内容的过程中,是否确保不更改字段内容的大小?如果你不这样做,你会相应地更新交叉引用吗?如果不这样做,您肯定会创建无效文档。
  • 你是在说我的第二个问题吗?如果是,我尝试更改 bbox 标签中的长度,但没有帮助。我还尝试保持相同的文本长度,但没有成功。请注意,在 1.5 版中,我什至不需要更改长度! PS 什么是交叉引用?
  • 不,我说的是一般的编辑。 PDF 文件有一个交叉引用表(或流),指示每个间接对象的相应偏移量(每个 nnn 0 obj...endobj)。如果在编辑过程中您用更长或更短的东西替换了某些东西,那么您会破坏这些交叉引用。顺便说一句,您如何测试您的编辑是否正常?希望不仅仅是在 PDF 查看器中打开文件。 PDF 查看器经常即时修复 PDF...
  • 是的,通过查看查看器(阅读器):o) 好的,我应该怎么做?我理解交叉引用的东西,但有没有解释这个的文件?或者你能告诉我一步一步怎么做吗?谢谢!
  • 基本上在文本编辑器中手动编辑 PDF 是一种可靠的方法。因此,我的建议是不要这样做。如果您仍想尝试,您将找到文档here

标签: pdf acrobat


【解决方案1】:

cmets 中的 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问了

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

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

【讨论】:

  • 很好的答案!还有两个问题:增量更新是否适用于只读字段?如果是,如何通过 acrobat(或任何其他程序)添加增量更新,以便在文本编辑器中查看其结构?
  • 第二个问题呢?
  • 如何添加增量更新 - 如果您有允许添加注释的签名文档,请使用当前的 Adob​​e Reader 或 Acrobat 添加此类注释;此更改将作为增量更新自动完成。在您之前的问题中,您提到了 iText;如果您对 Java 没问题,请创建一个 PdfStamper,并将 append 参数设置为 true;这也将创建增量更新。
猜你喜欢
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2021-06-07
相关资源
最近更新 更多