我正在努力做一个java小项目:我做了一个程序,自动填充pdf格式。基本上一切对我来说都很好,但是有一个问题:在这个pdf公式(这是我公司提供的,所以我必须处理这个文档)中有一个等式字段,用于从项目数和单个价格计算成本。当我将单个项目的价格作为字符串插入pdf时
public void setEinzelpreis(String Einzelpreis)
{
try {
fieldList.get(30).setValue(Einzelpreis);
...
第一行的空字段上应该有单个价格。行的最后一个单元格由pdf自动计算。当我在“空”字段中单击pdf时,值显示为:
当我单击另一个字段时,该值将消失。这是我的问题。我正在通过pdfbox获取fieldlist,获取pfd的fieldlist的代码是:
try {
pdfTemplate = PDDocument.load(template);
PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
if (acroForm != null)
{
// Get field names
fieldList = acroForm.getFields();
}
...
那么,有人能看出我做错了什么吗?也许pdf想要一个双倍的值作为等式,而我给出了一个字符串?但我不知道如何在字段列表中写双精度。谢谢你的每一个提示!真诚的,巴斯蒂安
编辑:我正在使用的pdf文件:https://1drv.ms/b/s!av6exjpnxlgoioouuxl6qv4eugkqg?e=ocfhvc
这是我生成的文件:https://1drv.ms/b/s!AV6EXJPNXLGOIVK-huruxw2ary\ U w?e=d1zca8型
奇怪的是:当我手动更改文档中的值时,即使使用不同的文档查看器,一切都正常。
1条答案
按热度按时间kgsdhlau1#
首先,pdf中的acroform表单结构很奇怪。看起来有人使用了一个他不懂的图形表单生成工具,点击、拖拽、删除、复制。。。直到一个观众的形式做了他想要的,不在乎它已经变得难以维持。
尤其是einzelpreis字段有一个完全不必要的中间字段和最终字段结构,例如。
因此,该领域
Einzelpreis in € exkl USt1
(the'€' 上面的树中缺少)不是要填充的字段,它只是一个中间字段。要填写的实际表单字段是Einzelpreis in € exkl USt1.0.0.0.0
.不幸的是,您在代码中只获取
PDAcroForm
,这个字段正好是中间字段Einzelpreis in € exkl USt1
; 作为中介字段,它本身没有可见的小部件,因此setValue
调用不会更改可见的einzelpreis。计算gesamtpreis的javascript指令也使用final字段中的值:
但是由于字段值是可继承的,并且.0字段都没有自己的值,因此一旦触发表单计算并使用它,计算就会看到100。
因此,您应该填写
Einzelpreis in € exkl USt1.0.0.0.0
而是字段。更安全的检索方法不是通过字段列表中的索引,而是通过名称:(节选自Fill测试)
testFill2020_04BeschaffungsantragEinzelpreis
)填写该字段后,“100”应该在表单中可见。
gesamtpreis值未计算的其余问题是由于@tilman在对问题的评论中已经提到的事实:pdfbox不使用javascript。因此,您必须自己计算这些值,并相应地更新相关字段。
如果需要知道表单字段的正确名称,可以按照tilman的建议使用pdfbox-pdfdebugger。如果将鼠标悬停在该字段上,它将在底部的状态栏中显示名称。
顺便说一下
AcroForm
方法getFields
无论如何都不会返回此处所需的字段。正如javadocs中所描述的,这个方法将返回所有文档根字段,在层次结构中没有进一步的字段,至少不会立即返回(从用户Angular 看,方法名getFields
用词不当。不过,从pdf规范的Angular 来看,它是准确的,因为acroforms对象中的相应条目具有关键字段。)不过,请注意,您可能需要更新pdfbox版本。在早期版本中,pdfbox没有用javascript操作更新字段的外观(相信一些javascript会以任何方式填充它)。我使用了当前的3.0.0快照,在该快照中,该行为已被更改。