【发布时间】:2021-12-22 06:01:43
【问题描述】:
我一直在尝试使用 LibreOffice Writer 7.2.2.2 制作可填写的 PDF 文件。文档如下所示:
垂直线右侧的所有字段都是表单文本框,每个字段都有自己的名称(tbxOrderId、tbxFullName...)。每个文本框都使用 SF Pro Text Light 作为字体。只有右下角的 (tbxTotal) - Total €123.00 有 Oswald Regular。当我使用 LibreOffice Writer 填写这些字段时,文档看起来还不错。
下面是我的导出设置。我选择Archive PDF A-2b 是为了将字体嵌入到文档中。
这是我对导出的 PDF 文件运行 pdffonts 时的输出。
但是,当我运行以下仅更改 tbxOrderId 和 tbxTotal 值的代码时,输出的 PDF 文档缺少这些字体。
public class Start {
public static void main(String[] args) {
try {
PDDocument pDDocument = PDDocument.load(new File("/media/stoyank/Elements/Java/tmp/Receipt.pdf"));
PDAcroForm pDAcroForm = pDDocument.getDocumentCatalog().getAcroForm();
PDField field = pDAcroForm.getField("tbxOrderId");
field.setValue("192753");
field = pDAcroForm.getField("tbxTotal");
field.setValue("Total: €192.00");
pDAcroForm.flatten();
pDDocument.save("/media/stoyank/Elements/Java/tmp/output.pdf");
pDDocument.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我尝试通过参考this Stackoverflow question手动添加字体,但仍然没有成功:
PDDocument pDDocument = PDDocument.load(new File("/media/stoyank/Elements/Java/tmp/Receipt.pdf"));
PDAcroForm pDAcroForm = pDDocument.getDocumentCatalog().getAcroForm();
InputStream font_file = ClassLoader.getSystemResourceAsStream("Oswald-Regular.ttf");
PDType0Font font = PDType0Font.load(pDDocument, font_file, false);
if (font_file != null) font_file.close();
PDResources resources = pDAcroForm.getDefaultResources();
if (resources == null) resources = new PDResources();
resources.put(COSName.getPDFName("Oswald-Regular"), font);
pDAcroForm.setDefaultResources(resources);
pDAcroForm.refreshAppearances();
PDField field = pDAcroForm.getField("tbxOrderId");
field.setValue("192753");
field = pDAcroForm.getField("tbxTotal");
field.setValue("Total: €192.00");
pDAcroForm.flatten();
pDDocument.save("/media/stoyank/Elements/Java/tmp/output.pdf");
pDDocument.close();
在我写入这些文本框字段后,我想展平文档。
这是我的文件夹结构:
系统:Ubuntu 20.04
另外,here is a link 到我然后导出为 PDF 和导出的 PDF 的 ODT 文件。
【问题讨论】:
-
我认为您还需要调用 setDefaultAppearance 以便它使用新的(非子集)字体。请参阅
CreateSimpleFormWithEmbeddedFont.java示例。请注意,字体名称不是“Oswald-Regular”,它是您从 resources.add() 得到的。 (不是 resources.put()) -
@TilmanHausherr 检查了
CreateSimpleFormWithEmbeddedFont.java文件并应用了所有内容。仍然没有成功。输出是乱码。我也收到WARNING: Using fallback font LiberationSans for CID-keyed TrueType font Oswald-Regular。这是代码:pastebin.com/51huv5Jm -
@TilmanHausherr 在 GitHub 上发布了该项目。这是链接:github.com/stoyanK7/pdfbox-stackoverflow-question
标签: java pdfbox truetype pdf-form acrofields