PDFbox找不到字体:/ Helv

时间:2017-09-26 18:26:03

标签: java pdfbox

我尝试将表单字段添加到现有PDF文件,但出现以下错误.globl main .data msg: .asciiz "Input a number: " x: .word 1 .text main: li $v0,4 # display the first message la $a0, msg syscall li $v0, 5 # call for an input read, stores in $v0 syscall move $t0, $v0 # move the input to a temporary register lw $t1, x # loads x into $t1 registers # Show Output doLoop: sub $v0, $t0, $t1 # subtracts 1 from given input stores in $v0 move $s0, $v0 li $v0, 1 # Prepares to print integer move $a0, $v0 syscall bgt $a0, 0, doLoop li $v0,10 # load the "exit" number into register $v0 syscall

我在Java中的代码有以下视图:

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();

以下是PDF链接:https://drive.google.com/file/d/0B2--NSDOiujoR3hOZFYteUl2UE0/view?usp=sharing

2 个答案:

答案 0 :(得分:2)

您的新文字字段没有默认外观,因此PDFBox会为您制作一个(/Helv 0 Tf 0 g)。

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

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

解决方案2:初始化默认资源:

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

另请参阅源代码下载中的CreateSimpleForm.java示例。

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

答案 1 :(得分:1)

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

默认外观

根据规范,包含可变文本的每个字段(例如您的文本字段)必须具有 DA 默认外观值:

  

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

     

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

除了字段树中的父字段外, DA 值也可以从 AcroForm 字典继承:

  

<强> DA   串   (可选)可变文本字段的DA属性的文档范围默认值(请参阅12.7.3.3,“变量文本”)。

     

(ISO 32000-1,表218 - 交互式表格字典中的条目)

在您的PDF

您没有提供默认外观,并且您的PDF在 AcroForm 词典中没有默认值。

因此,严格来说,在您致电acroForm.refreshAppearances()时,它无效。因此,由于缺少信息,PDFBox可以拒绝该呼叫。

它的工作方式不同,因为PDFBox提供某些 AcroForm 字典条目的默认值(如果它们不存在),特别是

final String adobeDefaultAppearanceString = "/Helv 0 Tf 0 g ";

// DA entry is required
if (getDefaultAppearance().length() == 0)
{
    setDefaultAppearance(adobeDefaultAppearanceString);
}

不幸的是,虽然PDFBox不能确保此处使用的字体 Helv 在默认资源中,除非它们也完全丢失。

解决方案

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