我有一个单页的pdf表单,它使用自定义字体(用libreoffice制作)。最终输出文件将多次使用此模板。页面中的每个表单控件都将我的自定义字体设置为其字体类型。 pdf文件也嵌入了字体。这里是文件属性according to foxit。我还将文件复制到没有安装字体的系统,并用Reader DC填充它,字体确实正确显示。此外,字体也是installed on my system。这是填写表单字段的相关代码。
try(PDDocument finalDoc = new PDDocument())
{
template = new File(templatePath);
List<PDField> fields = new ArrayList<PDField>();
System.out.println("Pages to build: " + results.size());
for(i = 0; i < results.size(); i++)
{
System.out.println("Building page: " + (i+1));
singleResult = results.get(i);
PDDocument doc = PDDocument.load(template);
PDDocumentCatalog documentCatalog = doc.getDocumentCatalog();
PDAcroForm acroForm = documentCatalog.getAcroForm();
//acroForm.setNeedAppearances(false); //#First option
PDField field = acroForm.getField("txtUsername");
field.setValue(nameAndNumber.get(0));
field.setPartialName("txtUsername" + i);
fields.add(field);
field = acroForm.getField("txtPhoneNumber");
field.setValue(nameAndNumber.get(1));
field.setPartialName("txtPhoneNumber" + i);
fields.add(field);
finalDoc.addPage(doc.getPage(0));
}
PDAcroForm finalForm = new PDAcroForm(finalDoc);
//finalForm.setNeedAppearances(false); //#Second option
finalDoc.getDocumentCatalog().setAcroForm(finalForm);
finalForm.setFields(fields);
finalForm.flatten(fields, true); //#Third option
finalDoc.save(new File("outputPDF.pdf"));
}catch(Exception e)
{
//Do Stuff
}
现在,如果注释掉选项1,2或3(如上所示),我的outputPDF.pdf文件中没有可见文本。如果这三个中的任何一个未被注释,我会看到可见的文本,但它在Arial中有以下警告
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'ArialMT' for 'AccordAltMedium'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'ArialMT' for 'AccordAltMedium'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'ArialMT' for 'AccordAltRegular'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'ArialMT' for 'AccordAltRegular'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'ArialMT' for 'AccordAltRegular'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'ArialMT' for 'AccordAltRegular'
Jul 21, 2016 8:29:29 PM org.apache.pdfbox.pdmodel.font.PDTrueTypeFont <init>
WARNING: Using fallback font 'Arial-BoldMT' for 'AccordAltBold'
我现在还不完全确定导致问题的是什么。我能猜到的最接近的是当我尝试使用以下代码读取模板中嵌入的所有字体时:
PDDocument docTemp = PDDocument.load(new File(templatePath));
PDPage page = docTemp.getPage(0);
Iterable<COSName> pageFonts=page.getResources().getFontNames();
for(COSName c:pageFonts)
{
System.out.println(c.getName());
}
我将此列表视为输出:
Font:F1
Font:F2
Font:F3
Font:He
我猜这意味着PDFBox并没有将文档中的字体识别为正确的字体,但我不确定为什么会这样。我使用的是PDFBox 2.0.2,但我也尝试过2.0.1。 LibreOffice Writer是版本5.1.4.2
有人可以帮帮我吗?我把整个工作日花在了这上面,而且我的智慧结束了。我也试过以PDF和FDF的形式出口,但没有区别。
Link to pdf我不确定为什么这个文件不大,每个三种字体都是30kb,但我对PDF标准不够了解什么都有。 Link to odt (large because fonts embedded.)