代码之家  ›  专栏  ›  技术社区  ›  Bizon4ik

PDFbox找不到字体:/Helv

  •  1
  • Bizon4ik  · 技术社区  · 7 年前

    PDFbox Could not find font: /Helv

            PDDocument pdf = PDDocument.load(inputStream);
            PDDocumentCatalog docCatalog = pdf.getDocumentCatalog();
            PDAcroForm acroForm = docCatalog.getAcroForm();
            PDPage page = pdf.getPage(0);
    
            PDTextField textBox = new PDTextField(acroForm);
            textBox.setPartialName("SampleField");
            acroForm.getFields().add(textBox);
            PDAnnotationWidget widget = textBox.getWidgets().get(0);
            PDRectangle rect = new PDRectangle(0, 0, 0, 0);
            widget.setRectangle(rect);
            widget.setPage(page);
            widget.setAppearance(acroForm.getFields().get(0).getWidgets().get(0).getAppearance());
    
            widget.setPrinted(false);
    
            page.getAnnotations().add(widget);
    
            acroForm.refreshAppearances();
            acroForm.flatten();
            pdf.save(outputStream);
            pdf.close();
    

    你知道为什么会出现异常吗?

    存在堆栈顶部跟踪

    java.io.IOException: Could not find font: /Helv
    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.PDAcroForm.refreshAppearances(PDAcroForm.java:368)
    at com.workjam.service.impl.PDFService.fillForm(PDFService.java:85)
    

    https://drive.google.com/file/d/0B2--NSDOiujoR3hOZFYteUl2UE0/view?usp=sharing

    2 回复  |  直到 7 年前
        1
  •  4
  •   Tilman Hausherr    6 年前

    您的新文本字段没有默认外观,因此PDFBox为您创建了一个( /Helv 0 Tf 0 g

    解决方案1:从您正在使用的字段中获取它(这不会适用于每个PDF,因为您正在进行几个假设,即有一个字段,它是一个文本字段)

    textBox.setDefaultAppearance(((PDTextField)acroForm.getFields().get(0)).getDefaultAppearance());
    

    PDResources resources = new PDResources();
    resources.put(COSName.getPDFName("Helv"), PDType1Font.HELVETICA);
    acroForm.setDefaultResources(resources);
    

    CreateSimpleForm.java 源代码下载示例。

    更新:这已在2.0.8中修复,请参阅问题 PDFBOX-3943 .

        2
  •  1
  •   mkl    7 年前

    原因是您和源PDF没有为文本字段提供默认外观,而PDFBox提供了不合理的默认值。

    默认外观

    DA公司 默认外观值:

    DA公司 (必需;可继承) 默认外观字符串,包含一系列有效的页面内容图形或文本状态运算符,这些运算符定义了字段文本大小和颜色等属性。

    (ISO 32000-1,表222包含变量文本的所有字段通用的附加条目)

    DA公司 值也可以从 顶形 字典:

    一串 (可选) 变量文本字段的DA属性的文档范围默认值(见12.7.3.3,变量文本)。

    在您的PDF中

    顶形 词典

    acroForm.refreshAppearances() . 因此PDFBox可能会因信息缺失而拒绝该呼叫。

    不过,它的工作方式有所不同,因为PDFBox提供了某些默认值 字典条目,如果它们不存在,尤其是

    final String adobeDefaultAppearanceString = "/Helv 0 Tf 0 g ";
    
    // DA entry is required
    if (getDefaultAppearance().length() == 0)
    {
        setDefaultAppearance(adobeDefaultAppearanceString);
    }
    

    但遗憾的是,PDFBox无法确保字体 直升机

    解决

    我刚刚看到蒂尔曼在这里也写了一个答案。你可以在那里找到解决问题的方法。