Pdf itext setField与字段值重复

Pdf itext setField与字段值重复,pdf,itext,acrofields,Pdf,Itext,Acrofields,我对iText和acrofields有一个奇怪的问题。我创建了一个PDF并添加了acrofields。现在,当我执行form.setField(“一个字段名”、“一个值”)并显示或打印PDF时,该值会被复制(一次以较小的字体,一次以该文档的预期字体)。我检查了文档的结构,看起来我的Acrofield没有重复。这可能是什么原因 提前谢谢 帕斯卡 请在此处找到链接: 我在Ubuntu上。也许这就是原因!我正在使用evince查看文件,但打印时得到的结果相同。我包括了一个我看到的屏幕截图。 当我说复制

我对iText和acrofields有一个奇怪的问题。我创建了一个PDF并添加了acrofields。现在,当我执行form.setField(“一个字段名”、“一个值”)并显示或打印PDF时,该值会被复制(一次以较小的字体,一次以该文档的预期字体)。我检查了文档的结构,看起来我的Acrofield没有重复。这可能是什么原因

提前谢谢

帕斯卡

请在此处找到链接:


我在Ubuntu上。也许这就是原因!我正在使用evince查看文件,但打印时得到的结果相同。我包括了一个我看到的屏幕截图。 当我说复制,我应该说阴影。该字段的值首先不显示字体样式,然后用所需字体覆盖

我展示的代码非常简单。两条arrays是字段及其关联值的名称。如果值为xxxx,我将字段值设置为该数组中的索引。正如你在屏幕截图上看到的,它也被阴影遮住了。我的打印输出与屏幕截图一模一样。我还没有在其他平台上尝试过

下面是用groovy编写的代码

    File mergeForm (String path, Map fields, Map values, String newFile) {
    println "Merge Form: $path"
    def file = grailsApplication.mainContext.getResource(path)?.inputStream

    if (file == null)
       return null

    def reader = new PdfReader(file)
    def stamper = new PdfStamper(reader, new FileOutputStream(newFile))
    def form = stamper.getAcroFields()

    fields.eachWithIndex { k, v, i ->

        def val = ""
        if (v instanceof Closure) {
            val = v(values)
        }
        else if (v == '_xxxx_') {
           val = "${i + 1}"
        }
        else if (values[v]) {
           val = values."$v"
        }

        println "setting value[$i]: ${val} to: $k"
        form.setField (k, val)
    }

    stamper.close()
    return new File (newFile)
}
总结一下 问题似乎是由于PDF中每个字段的多个字段注释有所不同,因此具有不同的外观

详细地 查看文档版本,我们将检查第一页最上面的字段,“此索赔是在20财年提交的”。我们看到,页面对象9在其注释数组中(在对象265中)具有(除其他外)对象304和对象180,这两个对象都是该字段的注释

304 0 obj
<<
  /Ff 12582912
  /MaxLen 2
  /F 4
  /Type/Annot
  /Subtype/Widget
  /T(This Claim is Filed for Fiscal Year 20)
  /P 9 0 R
  /Q 1
  /MK<<>>
  /FT/Tx
  /Rect[166.765 693.57 188.965 701.479]
  /DA(/Arial 8 Tf 0 g)
  /AA<</F 333 0 R/K 334 0 R>>
>>
endobj 
...
180 0 obj
<<
  /Ff 0
  /F 4
  /Type/Annot
  /Subtype/Widget
  /DR<</Font<</Helv 2 0 R>>>>
  /T(This Claim is Filed for Fiscal Year 20)
  /V()
  /AP<</N 179 0 R>>
  /P 9 0 R
  /BS<</W 0.5/S/S>>
  /FT/Tx
  /Rect[165.4 706.28 187.6 714.19]
  /DA(/Helv 0 Tf 0 g )
>>
endobj 
和不同的默认外观字符串

  /DA(/Arial 8 Tf 0 g)
...
  /DA(/Helv 0 Tf 0 g )
因此,这个字段出现多个不相同的外观并不奇怪。真正令人惊讶的是,AdobeReader上由iText填充的版本没有显示双值

@布鲁诺:有人可能会想尽快调查此事


其他字段也有重复的外观;大多数情况下,页面位置几乎相同,但是默认的外观流仍然不同,这也会导致它们出现多个不相同的外观。

您能提供一个示例文档和代码示例来重现您的问题吗?感谢您抽出时间。我用一个文件和一些代码更新了我的问题。我用Adobe Reader打开了文档,没有看到重复的字段。你能说得更具体些吗?我以前从未见过这种行为(除了在实现不佳的PDF查看器中查看文档时)。@pascaldemily我显然不知道您的
字段
参数试图引入哪些新值。因此,我通过将每个字段的值设置为其键名的尾随5个字符来测试填充该表单。结果看起来和预期的一样。因此,请提供使PDF看起来不好的实际键值对。您可能还想提供一个示例输出来说明这个问题。也许这就是原因。我正在使用evince查看文件,但打印时得到的结果相同。我包括了一个我看到的屏幕截图。我最初从下载该文件:但它被锁定(acrofields存在但无法保存),我使用pdfunlock将其解锁(不知道如何使用iText),然后编写了一个小程序重新插入acrofields。现在我看到,在没有字段的解锁版本中,这些字段仍然被引用(做了grep,因为我不知道pdf文件格式)(但我猜不是以/TU开头的acrofields)。我怎样才能使用它们呢?然后写了一个小程序来重新插入acrofields-我想你必须修复这个程序…;)我想是吧。我只是对字段和注释感到困惑。例如,在我解锁文件后,我认为剩下的是注释。当我添加acrofields时,它不会覆盖注释(请注意,我甚至不知道这是否是正确的语义)。实际上,如果文件被锁定,移除该锁定可能违背其作者的意愿。另一方面,如果作者明确允许您根据需要使用他的文档,或者您使用的软件不支持PDF的细粒度权限,那么这可能是可以接受的。较新的iText版本支持忽略所有者密码的标志。谢谢@mkl。事实上,该表格来自公共政府网站,用于填写福利豁免。我是为非营利组织编程的,需要填写字段以便他们可以打印。不知道为什么他们会锁定该文件,因为它应该被归档和打印。我应该研究哪些函数来移除该锁,或者如何使用itext移除注释以避免阴影。谢谢
  /DA(/Arial 8 Tf 0 g)
...
  /DA(/Helv 0 Tf 0 g )