为什么不显示使用 PDFBox(2.0.11) 设置的表单字段?

Why are Form Fields set with PDFBox(2.0.11) not being displayed?

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

这似乎是一个常见问题,但 none 我见过的修复似乎有效。

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");
                }
            }

感谢 Tilman Hausherr 帮助我找到了一个最终源于 MacOSX 预览应用程序怪癖的答案。

预览出于某种原因去除了一些功能,这也会导致您无法在 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

如果不是很明显:不要使用 Mac 的预览创建/编辑/保存您的模板 pdf 以与 PDFBox 一起使用。

我 运行 遇到了同样的问题,不得不 re-create Acrobat Pro 中的 PDF。使用这个 PDF,上面的代码工作得很好。