1

我编写了一个简单的代码来编辑 pdf 中表单的内容。一切正常(新的 pdf 是用修改后的形式创建的),但是抛出了一个关于字体的奇怪异常。这是我的代码:

try {
        PDDocument pdfDoc = PDDocument.load("/home/giozh/universita/schedepazienti.pdf");
        PDDocumentCatalog docCatalog = pdfDoc.getDocumentCatalog();
        PDAcroForm acroForm = docCatalog.getAcroForm();

        PDField field = acroForm.getField("dx1");
        if (field != null) {
            field.setValue("asd");
        } else {
            System.err.println("No field found with name:" + "applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]");
        }
        pdfDoc.save("/home/giozh/universita/schedepazienti1.pdf");
        pdfDoc.close();
    } catch (IOException ex) {
        Logger.getLogger(Prove.class.getName()).log(Level.SEVERE, null, ex);
    } catch (COSVisitorException ex) {
        Logger.getLogger(Prove.class.getName()).log(Level.SEVERE, null, ex);
    }

这是例外:

Grave: error while creating a font
java.io.IOException: Cannot create font as /SubType is not set.
at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:88)
at org.apache.pdfbox.pdmodel.PDResources.getFonts(PDResources.java:203)
at org.apache.pdfbox.pdmodel.interactive.form.PDAppearance.getFontAndUpdateResources(PDAppearance.java:439)
at org.apache.pdfbox.pdmodel.interactive.form.PDAppearance.setAppearanceValue(PDAppearance.java:268)
at org.apache.pdfbox.pdmodel.interactive.form.PDVariableText.setValue(PDVariableText.java:131)
at prove.Prove.main(Prove.java:37)

(第 37 行是我调用 setValue() 方法的地方)我该如何解决?

4

2 回答 2

1

在本质上

您的 PDF 有一个错误,该错误被优雅地(仅带有一些日志输出)被忽略。

细节

PDF 中的AcroForm字典如下所示:

4 0 obj
<<
  /Fields [ 12 0 R ]
  /DA(/Helvetica 0 Tf 0 g )
  /DR
  <<
    /Font
    <<
      /Helvetica 11 0 R
      /Encoding<</PDFDocEncoding 10 0 R>>
    >>
  >>
  /NeedAppearances true
>>
endobj

那里的字体字典包含一个用于字体Helvetica的条目(这是相关字段中使用的字体,参见其DA/Helvetica 0 Tf 0.000000 0.000000 0.000000 rg )和一个用于Encoding的条目,其值不代表字体一点也不。

PDFBox 尝试解析名为Encoding的“字体” ,但未能成功。但PDResources.getFonts()只记录产生的异常并继续忽略此问题:

try
{
    newFont = PDFontFactory.createFont( (COSDictionary)font );
}
catch (IOException exception)
{
    LOG.error("error while creating a font", exception);
}

(pdfbx-1.8.2.jar, org.apache.pdfbox.pdmodel.PDResources)

因此,您会看到以“创建字体时出错”为首的异常(因为它是这样显式记录的),但结果是正确创建的(因为该异常基本上被忽略了)。

于 2013-11-12T21:47:13.840 回答
0

我只是想补充一点,我遇到了 Helvetica 字体的类似问题,这是一种标准字体,结果是表单文本区域的大小。表格会填满,但当它变平时,字段会消失。我认为这是一系列问题(包装、溢出等),但日志中唯一的错误是关于字体的。该表单是使用 adobe 创建的,并用 PDFbox 填充

于 2016-12-05T12:25:32.660 回答