PDF字段看起来与PDF小丑不可见

时间:2013-04-21 21:59:46

标签: java pdf-generation

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

但是,有些PDF查看器会在我填写的字段中呈现一些不可见的文本,除非您点击它们,在这种情况下它们会变得可见。这个forum post解释了这可能发生在可填写表格的PDF中,并且可以通过将PDF字段的背景颜色设置为“无”来修复,即使GUI已经说明背景颜色是“没有。”这对其他人有用,我想亲自尝试一下。

不幸的是,我仍然坚持如何在PDFClown中实际执行此操作。对于Field类,没有像field.setBackgroundColor(null)这样的直接方法,我无法通过以下方法找到方法:使用其他一种访问方法,例如getDefaultAppearanceState()

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

编辑:可以找到包含此问题的示例PDF here。 PDF中的所有内容都填写了PDF Clown。请特别注意左上角的两个字段(标有“名称”)在被点击之前是不可见的。右边的五个字段在被点击之前也是不可见的,除了之前看不见的“魅力”字段,但是我手动输入值然后它变得可见。其他所有内容都是由PDF Clown引入的,但不像其他领域那样可见。

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

2 个答案:

答案 0 :(得分:1)

作为初步分析:

在我的原始评论中几乎可疑,“名称行1”字段包含值(字段字典 V )“Doc Lightning”但是正常的外观流(字段字典 AP < / strong> - &gt;外观词典,键 N ),不显示任何文字。

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

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

编辑:

我刚刚将当前(主干)PDF Clown AcroFormFillingSample.java示例应用于尚未填写的字符表(即包含文件的初始1458834字节的修订版),结果还可以,即使没有点击它们,所有字段内容都是可见的。因此,您的来源中有一些特别的东西......(或者您使用旧版本?)

详细信息:

character sheet of 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,在资源中正确定义,BTW),然后打印......没有!

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

  

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

因此,当没有显示“名称行1”的值“Doc Lightning”而是显示空的外观流时,PDF查看器的行为与预期的一样。

答案 1 :(得分:0)

在重新审视此问题并仔细查看源代码之后,我意识到PDF {C ++的示例Sample.java类有一个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查看器会生成流的新外观,这是它自己制作的外观,它完全可以理解编辑任务。”似乎上面的代码行生成了一个被理解为用于阅读(也可能是编辑?)的外观。