2

我使用 Java 版的PDF Clown来填写 PDF Acroforms 的字段。这很好用,我能够以编程方式填写表格并保存它们而不会出现任何问题。

但是,某些 PDF 查看器会在我正在填写的字段中呈现一些不可见的文本,除非您单击它们,在这种情况下它们变得可见。此论坛帖子解释说,这通常发生在可填写表单的 PDF 中,并且可以通过将 PDF 字段的背景颜色设置为“无”来修复它,即使 GUI 已经说背景颜色为“无”。这对其他人有用,我想自己尝试一下。

不幸的是,我被困在如何在 PDFClown 中实际执行此操作。没有像field.setBackgroundColor(null)Field 类这样的直接方法,我无法通过使用其他访问器方法之一找到方法,喜欢getDefaultAppearanceState()

有没有人知道如何在 PDF Clown 中做到这一点?

编辑:可以在此处找到有关此问题的示例 PDF 。此 PDF 中的所有内容均使用 PDF Clown 填充。请特别注意左上角的两个字段(标有“名称”)在单击之前是不可见的。右侧的五个字段在单击之前也是不可见的,除了“魅力”字段,它之前是不可见的,但后来我手动输入了值,然后它才可见。PDF Clown 将其他所有内容放入其中,但与其他字段不同的是,它是可见的。

编辑 2:后来发现只有当您覆盖现有的可填写表格字符表中的值时才会发生这种情况。可以在此处下载原件。

4

2 回答 2

1

作为第一个分析:

几乎与我原来的评论中所怀疑的一样,字段“Name Line 1”包含值(字段字典V)“Doc Lightning”,但正常的外观流(字段字典AP -> 外观字典,键N)不显示任何文本。

此外,交互式表单字典条目NeedAppearances未设置为true; 因此,PDF 查看器相信外观流是最新的。只有当您单击该字段并因此发出您要编辑的信号时,PDF 查看器才会生成流的新外观,这是它自己制作的外观,它完全理解编辑任务。

因此,如果您填写了该表单字段并且之后没有其他工具更改您的结果,那么您的代码或 PDF Clown 中有问题。请提供一些独立的示例代码和尚未填写的文档以重现该问题。

编辑:

我刚刚将当前(主干)PDF ClownAcroFormFillingSample.java样本应用于尚未填充的字符表(即由文件的初始 1458834 字节组成的修订版),结果还可以,所有字段内容都可见,即使没有点击进入它们。因此,您的源代码中有一些特别之处......(或者您使用的是旧版本?)

详细地:

Doc Lightning 字符表的第 1页引用了对象 162 中的注释:

/MK      <<>>
/F       4
/Type    /Annot
/Subtype /Widget
/Rect    [37.0108, 617.055, 156.923, 631.717]
/FT      /Tx
/DA      /Helv 12 Tf 0 g
/T       (Name Line 1)
/V       (Doc Lightning)
/P       47 0 R
/AP      537 0 R

因此,该字段的值确实是“Doc Lightning”。

另一方面,对象 537 中的外观字典引用了正常外观流:

/N       538 0 R

对象 538 中的流仅包含:

/Tx BMC
q
1 0 0 1 2 -7.331 cm
/Helv 12 Tf
Q
EMC

因此,正常外观流在字段中的位置(相应地设置当前转换矩阵)并选择一种字体(Helvetica,在资源中正确定义,顺便说一句),然后打印......什么都没有!

交互式表单字典(对象 144)根本包含NeedAppearances条目。根据 PDF 规范ISO 32000-1:2008表 218,此条目是

一个标志,指定是否为文档中的所有小部件注释构造外观流和外观字典(参见 12.7.3.3,“可变文本”)。默认值:

因此,当不显示“Name Line 1”的值“Doc Lightning”而是显示空的外观流时,PDF 查看器的行为就像预期的那样。

于 2013-04-23T08:06:30.587 回答
0

重新审视这个问题并仔细查看源代码后,我意识到Sample.javaPDFClown 的示例类有一个applyDocumentSettings()方法,其中包含我的源代码中缺少的三行代码:

//Previously we instantiated "document" from org.pdfclown.files.File.getDocument()
ViewerPreferences view = new ViewerPreferences(document); // Instantiates viewer preferences inside the document context.
document.setViewerPreferences(view); // Assigns the viewer preferences object to the viewer preferences function.
view.setDisplayDocTitle(true);

我不确定最后一行是否真的必要,但我继续前进并保持良好状态。

用户 mkl 在他的回答中写道:“PDF 查看器生成了流的新外观,它自己制作的外观,它完全理解编辑任务。” 似乎上面的代码行是生成一个被理解为用于阅读(也可能是编辑?)的外观。

于 2013-07-31T06:54:13.293 回答