itext setField复制字段值

时间:2014-02-03 04:43:54

标签: pdf itext acrofields

我对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个arrray是字段的名称及其关联值。如果值为 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)
}

1 个答案:

答案 0 :(得分:0)

总结

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

详细

查看文档版本BOE-267-L1-Rev-1.unlocked-with-fields.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 

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

  /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 )

因此,您获得此字段的多个不同外观并不奇怪。令人惊讶的是,Adobe Reader上的iText填充的版本显示双倍值。

@Bruno有人可能希望在有一段时间后立即对此进行调查。

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