簡體   English   中英

使用 PDFBox 格式化數字

[英]Format Numbers using PDFBox

我有一個 PDF 文件(我無法編輯),里面有一個表格,我可以在其中輸入數字。 最低的表格單元格自動總結輸入。 當我手動輸入數字(使用 Acrobat Reader)時,它們的格式正確並且總和工作正常,但是當使用 PDFBox 時,它們不是,即缺少千位分隔符,並且不計算總和。 我可以計算總和並進入該領域。 順便說一句,這一切都在德國語言環境中。

在我使用 PDFBox 填寫 PDF 后,其他用戶可能會使用 Acrobat Reader 對其進行編輯並輸入更多數字或對其進行編輯,因此總和必須正常工作。 這是我的意思的截圖: 左邊的數字格式不正確

有沒有辦法告訴表單字段重新格式化它們的輸入以反映它們在內部指定的格式?

當我手動將我的數字格式化為“###,##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("\\.", ""));

問題是,Acrobat Forms 除了它們的聲明式布局(可通過 PDFBox 解析和分析)還可以有用 JavaScript 編寫的腳本,由於顯而易見的原因(例如缺乏完整的 PDF 數據模型和解釋器),不會對其進行評估在 PDFBox 中。

您可以從 PDF 中提取腳本(表單是標准的 XML 文檔,腳本位於相關的腳本標記中),然后嘗試在您的 Java 代碼中模擬 JavaScript 的行為。 除此之外,沒有太多可以做的。

正如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 代碼。 但是,接下來就是根據需要解析它並取決於原始字段類型是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM