我尝试将表单字段添加到现有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
答案 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在 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 在默认资源中,除非它们也完全丢失。
我刚看到蒂尔曼也在这里写了一个答案。您可以在那里找到解决问题的方法。