Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示格式化的数字并保存双值_Java_Pdfbox - Fatal编程技术网

Java 显示格式化的数字并保存双值

Java 显示格式化的数字并保存双值,java,pdfbox,Java,Pdfbox,我见过PDF格式的表单,您可以在本地格式中写入数字,PDF在后台存储双值,可以使用PDFBox读取。 我如何分辨示例中的字段,例如,取数字125.5(双精度)并显示“125,5”(我的区域设置)? 当用户编辑字段时,背景中的值仍然是有效的双精度值。是否有一些内置的机制,或者变通方法是什么样子的?提前谢谢 public final class CreateSimpleForm { private static final PDFont FONT = PDType1Font.HELVETIC

我见过PDF格式的表单,您可以在本地格式中写入数字,PDF在后台存储双值,可以使用PDFBox读取。 我如何分辨示例中的字段,例如,取数字125.5(双精度)并显示“125,5”(我的区域设置)? 当用户编辑字段时,背景中的值仍然是有效的双精度值。是否有一些内置的机制,或者变通方法是什么样子的?提前谢谢

public final class CreateSimpleForm
{
    private static final PDFont FONT = PDType1Font.HELVETICA;
    private static final float FONT_SIZE = 12;

    private CreateSimpleForm()
    {
    }

    public static void main(String[] args) throws IOException
    {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage(PDRectangle.A4);
        document.addPage(page);

        PDResources resources = new PDResources();
        resources.put(COSName.getPDFName("Helv"), FONT);

        PDAcroForm acroForm = new PDAcroForm(document);
        document.getDocumentCatalog().setAcroForm(acroForm);

        acroForm.setDefaultResources(resources);

        String defaultAppearanceString = "/Helv 0 Tf 0 g";
        acroForm.setDefaultAppearance(defaultAppearanceString);

        PDTextField textBox = new PDTextField(acroForm);
        textBox.setPartialName("SampleField");
        defaultAppearanceString = "/Helv " + FONT_SIZE + " Tf 0 0 0 rg";
        textBox.setDefaultAppearance(defaultAppearanceString);

        acroForm.getFields().add(textBox);

        PDAnnotationWidget widget = textBox.getWidgets().get(0);
        PDRectangle rect = new PDRectangle(50, 750, 200, 50);
        widget.setRectangle(rect);
        widget.setPage(page);

        widget.setPrinted(true);
        page.getAnnotations().add(widget);

        textBox.setValue("Sample field");

        document.save("test.pdf");
        document.close();
    }
}

我不知道这是否是最好的方法,但现在我会一直这样,直到有人想出更好的解决方案

我用UI表示创建了我的可见字段,并用“background”值创建了一个隐藏字段,每次编辑可见字段时,该值都由javascript格式化。 当我试图读取数据时,我必须忽略可见字段,而集中精力于隐藏字段

这对我来说是最简单的解决方案(当然需要稍微清理一下)

public final class CreateSimpleForm {
    private static final PDFont FONT = PDType1Font.HELVETICA;
    private PDAcroForm acroForm;
    private String defaultAppearanceString;
    private PDPage page;

    public static void main(String[] args) throws IOException {
        new CreateSimpleForm();
    }

    private CreateSimpleForm() throws IOException {
        PDDocument document = new PDDocument();
        page = new PDPage(PDRectangle.A4);
        document.addPage(page);

        PDResources resources = new PDResources();
        resources.put(COSName.getPDFName("Helv"), FONT);

        acroForm = new PDAcroForm(document);
        document.getDocumentCatalog().setAcroForm(acroForm);

        acroForm.setDefaultResources(resources);

        defaultAppearanceString = "/Helv 0 Tf 0 g";
        acroForm.setDefaultAppearance(defaultAppearanceString);


        createFormattedField("myField", 125.5);

        document.save("test.pdf");
        document.close();
    }

    private void createFormattedField(String name, Double value) throws IOException {
        String nameHidden = name + "_hidden";
        PDTextField textBox = createField(name, false);
        textBox.setValue(String.format("%1$,.2f", value));
        createField(name + "_hidden", true).setValue(value.toString());
        PDActionJavaScript tfJs = new PDActionJavaScript("this.getField(\"" + nameHidden + "\").value = this.getField(\"" + name + "\").value.replace(/\\./g,'').replace(/\\,/g,'.');");
        PDAnnotationAdditionalActions actions = new PDAnnotationAdditionalActions();
        actions.setPC(tfJs);
        actions.setBl(tfJs);
        textBox.getWidgets().get(0).setActions(actions);
    }

    private PDTextField createField(String name, boolean hidden) throws IOException {
        PDTextField textBox = new PDTextField(acroForm);
        textBox.setPartialName(name);
        textBox.setDefaultAppearance(defaultAppearanceString);

        acroForm.getFields().add(textBox);

        PDAnnotationWidget widget = textBox.getWidgets().get(0);
        PDRectangle rect = new PDRectangle(50, 750, 200, 50);
        widget.setRectangle(rect);
        widget.setPage(page);

        widget.setPrinted(true);
        page.getAnnotations().add(widget);

        widget.setHidden(hidden);
        return textBox;
    }
}