为什么不显示通过PDFBox(2.0.11)设置的表单域?

时间:2018-08-15 14:56:40

标签: java pdfbox

我正在使用PDFBox 2.0.11打开PDF表单并提取值。这按预期工作。当我尝试设置一个值时,它似乎起作用。当我打开PDF时,不会显示该值。如果我单击该字段,则该值将按设置显示,但是当我单击该字段时,该值将再次消失。

这似乎是一个常见问题,但我见过的所有修复方法似乎都无效。

if(file.exists())
    {
        PDDocument doc = PDDocument.load(file);
        doc.setAllSecurityToBeRemoved(true);
        PDDocumentCatalog catalog = doc.getDocumentCatalog();
        PDAcroForm form = catalog.getAcroForm();

        // Add Font
        PDResources resources = new PDResources();
        resources.put(COSName.getPDFName("Helv"), PDType1Font.HELVETICA);
        form.setDefaultResources(resources);
        // End Add Font

        form.setNeedAppearances(false);
        List<PDField> fields = form.getFields();

        for (Object field : fields) 
        {
            if (field instanceof PDTextField) {
                PDTextField pdTextbox = (PDTextField) field;
                System.out.println("PDTextBox " + pdTextbox.getFullyQualifiedName() + " " + pdTextbox.getValue());

                if(pdTextbox.getFullyQualifiedName().equalsIgnoreCase("a3_5"))
                {
                    try {
                        pdTextbox.getWidgets().get(0).setHidden(false);
                        pdTextbox.setValue("5500");
                    }
                    catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
            else
            {
                System.out.print(field);
                System.out.print(" = ");
                System.out.print(field.getClass());
                System.out.println();
            }
        }

        doc.save("..._MINE_UPDATE.pdf");
        doc.close();
    }  

堆栈跟踪

java.io.IOException: Could not find font: /Helvetica
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.processSetFont(PDDefaultAppearanceString.java:179)
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.processOperator(PDDefaultAppearanceString.java:132)
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.processAppearanceStringOperators(PDDefaultAppearanceString.java:108)
at org.apache.pdfbox.pdmodel.interactive.form.PDDefaultAppearanceString.<init>(PDDefaultAppearanceString.java:86)
at org.apache.pdfbox.pdmodel.interactive.form.PDVariableText.getDefaultAppearanceString(PDVariableText.java:93)
at org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.<init>(AppearanceGeneratorHelper.java:100)
at org.apache.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:262)
at org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField.applyChange(PDTerminalField.java:228)
at org.apache.pdfbox.pdmodel.interactive.form.PDTextField.setValue(PDTextField.java:218)
at com.controller.TestPDFBox.loadData(TestPDFBox.java:87)

跳过循环

for (COSName fontResourceName : widgetResources.getFontNames())
            {
                try
                {
                    if (acroFormResources.getFont(fontResourceName) == null)
                    {
                        LOG.debug("Adding font resource " + fontResourceName + " from widget to AcroForm");
                        acroFormResources.put(fontResourceName, widgetResources.getFont(fontResourceName));
                    }
                }
                catch (IOException e)
                {
                    LOG.warn("Unable to match field level font with AcroForm font");
                }
            }

2 个答案:

答案 0 :(得分:1)

感谢Tilman Hausherr帮助我获得了一个答案,该答案最终源于MacOSX的Preview应用程序的怪癖。

由于某些原因,预览会去除功能,这也会导致您无法在PDF中正确设置值。

尽管我确实对以下内容的Add Font部分进行了更改,但是上面的代码仍然可以正常工作。

// Add Font
PDResources resources = form.getDefaultResources();
if(resources == null)
{
    resources = new PDResources();
}
resources.put(COSName.getPDFName("Helvetica"), PDType1Font.HELVETICA);
if(form.getDefaultResources() == null)
{
    form.setDefaultResources(resources);
}
// End Add Font

答案 1 :(得分:0)

如果情况不太明显:请勿使用Mac的Preview创建/编辑/保存模板pdf,以用于PDFBox。

我遇到了同样的问题,不得不在Acrobat Pro中重新创建PDF。使用此PDF,以上代码可以很好地工作。