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

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

最佳答案

感谢 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

关于java - 为什么不显示使用 PDFBox(2.0.11) 设置的表单字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51861187/

相关文章:

Java/LibGDX 在全屏窗口前面显示 JOptionPane

java - 如何清除namenode上的所有文件?

java - OpenHTMLToPDF:将自定义字体嵌入到由 HTML 创建的 PDF 中

java - 将 pdfDocument 转换为 byte[] 流 - PDFBox Java

java - PDFBox 2.0 创建签名字段并使用已签名的文档保存增量

java - Android String 值超出 if else 语句

java - 我如何在java中读取特定数据

java - 构造函数创建多个变量,如何通过其他方法返回它们?

java - 使用pdfbox将分割的pdf文档保存到远程apache服务器

java - 如何使用 PDFBox 将文本提取到 JLabel