[英]PDFbox Could not find font: /Helv
我嘗試將表單字段添加到現有PDF文件但出現以下錯誤PDFbox Could not find font: /Helv
我在Java中的代碼有以下視圖:
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)
以下是PDF鏈接: https : //drive.google.com/file/d/0B2--NSDOiujoR3hOZFYteUl2UE0/view?usp=sharing
您的新文本字段沒有默認外觀,因此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 。
原因是您和源PDF的組合不提供文本字段的默認外觀,而PDFBox提供的默認設置無關緊要。
根據規范,包含可變文本的每個字段(例如您的文本字段)必須具有DA默認外觀值:
DA字符串(必需;可繼承)默認外觀字符串,包含一系列有效頁面內容圖形或文本狀態運算符,用於定義字段的文本大小和顏色等屬性。
(ISO 32000-1,表222 - 包含可變文本的所有字段共有的附加條目)
除了字段樹中的父字段之外, DA值還可以從AcroForm字典繼承:
DA string (可選)變量文本字段的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字體在默認資源中,除非它們也完全丟失。
我剛看到蒂爾曼也在這里寫了一個答案。 您可以在那里找到解決問題的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.