用java中的pdfbox在pdf中为等式插入双值

4smxwvx5  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(740)

我正在努力做一个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型
奇怪的是:当我手动更改文档中的值时,即使使用不同的文档查看器,一切都正常。

kgsdhlau

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字段中的值:

AFSimple_Calculate("PRD", new Array ("Anzahl1", "Einzelpreis in € exkl USt1.0.0.0.0"));

但是由于字段值是可继承的,并且.0字段都没有自己的值,因此一旦触发表单计算并使用它,计算就会看到100。
因此,您应该填写 Einzelpreis in € exkl USt1.0.0.0.0 而是字段。更安全的检索方法不是通过字段列表中的索引,而是通过名称:

PDField fieldByName = acroForm.getField("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快照,在该快照中,该行为已被更改。

相关问题