簡體   English   中英

PDFbox找不到字體:/ Helv

[英]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中

您沒有提供默認外觀,並且您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM