-1

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

提前致谢

帕斯卡

请在此处找到链接:https ://drive.google.com/file/d/0B8O5n5QFSSNrSGVlNllOcEJHRzQ/edit?usp=sharing

我在 Ubuntu 上。也许这就是为什么!我正在使用 evince 查看文件,但是当我打印它时得到相同的结果。我附上了我看到的截图。https://drive.google.com/file/d/0B8O5n5QFSSNrWXJyY2VpSkt5NE0/edit?usp=sharing 当我说重复时,我应该说阴影。该字段的值首先在没有字体样式的情况下显示,然后用所需的字体覆盖。

我展示的代码非常简单。2 个数组是字段的名称及其关联值。如果值为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)
}
4

1 回答 1

0

总结一下

该问题似乎是由于手头的 PDF 中的多个字段注释对每个字段都有所不同,因此具有不同的外观。

详细地

查看文档版本BOE-267-L1-Rev-1.unlocked-with-fields.pdf,我们将检查第一页上最顶部的字段,“This Claim is Filed for Fiscal Year 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 

这些的定义描述了页面上略有不同的位置:

  /Rect[166.765 693.57 188.965 701.479]
...
  /Rect[165.4 706.28 187.6 714.19]

和不同的默认外观字符串

  /DA(/Arial 8 Tf 0 g)
...
  /DA(/Helv 0 Tf 0 g )

因此,您会得到该字段的多个、不同的外观也就不足为奇了。实际令人惊讶的是,在 Adob​​e Reader 上由 iText 填充的版本显示双精度值。

@Bruno 有人可能想尽快调查一下。

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

于 2014-02-03T15:02:30.117 回答