Java PDF字段使用PDF小丑显示为不可见

Java PDF字段使用PDF小丑显示为不可见,java,pdf-generation,Java,Pdf Generation,我使用的Java版本填写PDF表单的字段。这非常有效,我能够以编程方式填写表单并保存它们,没有任何问题 但是,一些PDF查看器会在我填写的字段中显示一些不可见的文本,除非您单击它们,否则它们将变为可见。这就解释了这种情况通常会发生在可填写表单的PDF中,并且可以通过将PDF字段的背景色设置为“无”来解决,即使GUI已经说背景色为“无”。这对其他人有效,我想自己试试 不幸的是,我一直在研究如何在PDFClown中真正做到这一点。对于field类,没有像field.setBackgroundColo

我使用的Java版本填写PDF表单的字段。这非常有效,我能够以编程方式填写表单并保存它们,没有任何问题

但是,一些PDF查看器会在我填写的字段中显示一些不可见的文本,除非您单击它们,否则它们将变为可见。这就解释了这种情况通常会发生在可填写表单的PDF中,并且可以通过将PDF字段的背景色设置为“无”来解决,即使GUI已经说背景色为“无”。这对其他人有效,我想自己试试

不幸的是,我一直在研究如何在PDFClown中真正做到这一点。对于field类,没有像
field.setBackgroundColor(null)
这样的直接方法,我无法通过使用其他访问器方法之一来找到实现方法,比如
getDefaultAppearanceState()

有没有人知道如何在PDF小丑中做到这一点

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


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

作为第一个分析:

正如我最初的评论中所怀疑的,字段“名称行1”包含值(字段字典V)“Doc Lightning”,但包含正常的外观流(字段字典AP->外观字典,键N),不显示文本

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

如果您填写了该表单字段,并且之后没有其他工具更改您的结果,那么,您的代码或PDF小丑中就出现了问题。请提供一些自足的样本代码和尚未填写的文件,以复制问题

编辑:

我刚刚将当前(主干)PDF小丑
AcroFormFillingSample.java
示例应用于尚未填充的字符表(即,由文件的初始1458834字节组成的修订版),结果正常,所有字段内容都可见,即使不点击它们。因此,在你的来源中有一些特别的东西。。。(或者您是否使用旧版本?)

详细信息:

其中第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
并且对象538中的流仅包含:

/Tx BMC
q
1 0 0 1 2 -7.331 cm
/Helv 12 Tf
Q
EMC
因此,正常外观流在字段中定位(相应地设置当前转换矩阵),并选择字体(Helvetica,在Resources中正确定义,顺便说一句),然后打印。。。没什么

交互式表单词典(对象144)根本不包含条目。根据PDF规范,表218,该条目为

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


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

在重新讨论这个问题并仔细查看源代码后,我意识到PDFClown示例的
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查看器生成流的新外观,一种它自己制作的外观,它完全理解用于编辑任务。”似乎上面的代码行所做的是生成一种被理解为用于阅读(可能是编辑?)的外观.

请提供该问题的示例文档。顺便说一句,如果您填写的PDF既没有填写字段的外观流(指望PDF查看器创建适当的外观),也没有设置NeedAppearancess标志(如果设置了,则指示PDF查看器创建外观流),则可能会发生这种情况;类似的事情一直是我们讨论的话题。请检查您的PDF文件以了解这一点,或者提供一个示例PDF。@mkl目前正在讨论一个具有这种行为的示例PDF。有一个可以在字段()上设置的标志枚举,但我没有看到一个名为NeedAppearanses的枚举。感谢您的详细分析!我相信当时的情况是,我在设置PDF时为那些“空”字段输入了空字符串,然后用实际文本重写了这些空值。我得到了一个新的未填充的PDF,没有进一步的问题。当然,这就引出了一个问题,当我填写一次,然后再次覆盖它时,如何防止不可见的文本。Hhmmm,如果两次填写该字段会产生这种不必要的影响,您可能需要向PDF小丑开发报告……没错,这可能是PDFClown中的错误。基本上,我从你的回答中发现,覆盖字段不起作用,你必须做一次。嗯,我认为这是一个bug或至少是一个错误
//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);