使用Itext

时间:2019-06-11 21:47:49

标签: kotlin itext

我正在尝试在PDF上传递数字值,但它以String形式传递。问题是PDF的最后一行用于对上述所有值求和,但是由于该值是字符串而不是整数,因此此功能不起作用。

val form = PdfAcroForm.getAcroForm(pdfDoc, true)
val fields = form.formFields 

fields[newFieldName]?.setValue(value.valueAsString)
                                ?.setFont(font)
                                ?.setFontSize(TEXT_SIZE)

问题是setValue方法,但是我没有在文档中找到有关如何传递Integer值的任何内容。那么如何传递整数值呢?

编辑:

尝试过此操作,但未将值放在字段上

fields[newFieldName]?.setRichText(PdfNumber(2.0))
?.setFont(font)
?.setFontSize(TEXT_SIZE)

Edit2:有什么方法可以在acro字段上获取嵌入函数,以便对其进行编辑,并使其也可以在总和字符串值上加以考虑?

1 个答案:

答案 0 :(得分:1)

PDF格式仅知道AcroForm文本字段的字符串值。附加到字段的JavaScript代码可能仅强制使用数字字符,但设置字段值时iText不执行任何JavaScript。

因此,关于您的原始问题

  

问题是setValue方法,但是我没有在文档中找到有关如何传递Integer值的任何内容。那么如何传递整数值?

没有用于设置整数值的特殊iText方法。


然后,在注释中发现原来特定于整数的问题不是实际问题。相反:

  

问题是,当我使用Adobe Reader手动编写数值时,pdf的最后一行上的sum函数起作用(4 | 5 | 6-> 15),所以有什么方法可以做到这一点itext?

所以实际的问题是,iText更改后,计算的字段内容没有更新。

这样做的原因是PDF中的此功能是由PDF中的一些JavaScript代码实现的,以在发生某些事件的情况下计算总和,但是iText(核心)在编辑表单字段时不会执行任何JavaScript(因为更改了它们)不是通过GUI,而是立即,这些事件将不会直接适用。)

因此,您还必须计算有问题的总和,并自行设置总和字段。


  

我可以计算总和并将其放置在正确的字段中,但是如果我这样做了,然后在下一行我打开Adobe Reader以输入一个数字,很可能js函数将无法执行“ 12”(由我,将其作为字符串放置)+ 5(在sum上方的一行中输入手动整数)。

字段的值始终以字符串形式存储在PDF中。因此,通过iText或Adobe设置字符串的方式应该没有什么区别。

共享PDF之后,我可以看一下它的结构和其中的JavaScript。

实际上,它是AcroForm表单(不是XFA表单!),求和和平均值的计算在设置为计算( C )附加操作( AA < / strong>)的相应 total average 字段。要求和或求平均值的字段由字段名称定义,例如对于字段名称“ 1-Place_Total”,脚本将对字段“ 1-Place_1” ..“ 1-Place_12”的内容计算 total

var srcName = event.target.name;
var srcCategory = srcName.substring(srcName.indexOf("_")+1)
var baseName = srcName.replace("Total","").replace("Average","");
var total = Number(0);
var lastMonth = 0;

for(i=1; i < 13; i++){
    var thisMonth = baseName + i;
    var monthVal = this.getField(thisMonth).value;
    total = Number(total) + Number(monthVal);
    if(monthVal > 0){
        lastMonth = i;
    }
}

if(total == 0){
    event.value = "";
}
else if(srcCategory == "Total"){
    event.value = total;
}
else if(srcCategory == "Average"){
    event.value = total / lastMonth;
}

表单字段附加操作“计算”指定为

  

一个JavaScript动作,当另一个字段的值更改时,将执行该动作以重新计算该字段的值。 (名称 C 代表“计算”。)

     

(ISO 32000-1,表196 –表单字段的附加动作字典中的条目)

由于脚本立即从有问题的字段中获取值(在某些其他脚本可能已将其存储的地方并不特殊),因此您可以手动更改PDF中的任意字段值以触发此函数进行计算无论单个字段的值是由iText还是由Adobe设置的,所有适用字段的总和。

在小数点分隔符的外观和字段值可能不同的情况下,分数数字可能仍然是一个问题,但是当您要求设置 integer 值的方法时,我假设那应该不是问题。


我必须承认我还没有测试过,答案仅基于规范。如果您创建概念验证后发现它不起作用,请共享该代码,然后我将对其进行更深入的研究。