使用PDFBox格式化数字

时间:2019-07-16 16:31:28

标签: java pdfbox

我有一个PDF文件(无法编辑),带有可在其中输入数字的表格。最低的表格单元格将自动汇总输入。当我手动输入数字(使用Acrobat Reader)时,它们的格式正确且总和很好,但是当使用PDFBox时,它们却没有,即缺少千位分隔符,并且不计算总和。我可以计算总和并输入字段。 顺便说一下,所有这些都是在德语语言环境中进行的。

在我使用PDFBox填充PDF之后,其他用户可能会使用Acrobat Reader编辑它并输入更多数字或对其进行编辑,因此总和必须正常工作。这是我的意思的屏幕截图:numbers on left are not formatted correctly

有没有办法告诉表单字段重新格式化其输入以反映其内部指定的格式?

当我手动将我的数字(双精度数)格式化为“ ###,## 0.00”的格式时,总和不再起作用。当我手动更改任何输入时,将重新计算总和,并且出现错误“输入的值与字段的格式不匹配”​​。不幸的是,由于机密性问题,我无法直接共享文件,但是如果需要,我可以尝试仅使用表创建自己的文件...

Locale.setDefault(Locale.GERMAN);

File bbb = //obviously instantiated to the where the file is
InputStream in = new FileInputStream(bbb);
PDDocument doc = PDDocument.load(in);
PDAcroForm acro = doc.getDocumentCatalog().getAcroForm();

//using the following line messes up the sum
acro.getField("row1").setValue(new DecimalFormat("###,##0.00").format(1000));

//using the following line works (including sum) but no thousands separator
acro.getField("row1").setValue(new DecimalFormat("###,##0.00").format(1000).replaceAll("\\.", ""));

2 个答案:

答案 0 :(得分:0)

问题在于,Acrobat Forms除了其声明式布局(可通过PDFBox进行解析和分析)外,还可能具有用JavaScript编写的脚本,出于明显的原因(例如,缺少完整的PDF数据模型和解释器)在PDFBox中不进行评估。

您可以从PDF中提取脚本(该表单是标准的XML文档,并且这些脚本位于相关的脚本标记中),然后尝试在Java代码中模仿JavaScript的行为。除此之外,没有什么可以做的。

答案 1 :(得分:0)

正如 Piotr Wilkin 所提到的,字段格式是用 JavaScript 代码编写的。我使用以下代码来提取具有以下格式的脚本标记:

String js = Optional.ofNullable(acroForm.getField(fieldName)).map(PDField::getCOSObject)
        // Additional-actions dictionary. Defining the actions to be taken in response to various trigger events.
        .map(d -> (COSDictionary) d.getDictionaryObject(COSName.AA))
        // F dictionary. A JavaScript action to be performed before the field is formatted to display its current value.
        .map(d -> (COSDictionary) d.getDictionaryObject(COSName.F))
        // JS string. A string or stream containing the JavaScript script to be executed.
        .map(d -> d.getString(COSName.JS))
        .orElse(null);

这将为您提供定义格式的 JavaScript 代码。但是,接下来就需要根据原始字段类型来解析它了。