我正在使用Apache POI生成.docx文档。我在项目中添加了外部字体。例如:
String playfairDisplayRegular = this.getClass().getClassLoader().getResource("PlayfairDisplay-Regular.ttf").getFile();
我在段落中使用playfairDisplayRegular。当我在字段中的文档中用字体名称标记文本时,例如路径:
/C:/Users/..../Documents...
代替字体名称(字体正在工作)。有任何想法吗 ?
问候,阿图尔
答案 0 :(得分:1)
URL.getFile()
仅返回URL的文件名部分(+可选查询部分?...
)。
对于资源(文件可能位于jar中,位于类路径中),应该尽量不要使用File,而应使用InputStream。
使用java.awt.Font:
Font font = Font.createFont(Font.TRUETYPE_FONT,
getClass().getResourceAsStream("/PlayfairDisplay-Regular.ttf"));
您现在可以在docx中使用font.getFamily()
(对于XSLFTextRun.setFontFamily
)等等。
同时apache poi也许可以嵌入字体(给您的许可证问题!),但是您自己做应该很简单:.docx是zip格式,字体在/fonts/
子目录中。您可以在用MSWord编写的小型docx中对其进行测试。可以通过zip文件系统"jar:file:/C:/... .docx"
和Files.copy
来写文件。
答案 1 :(得分:0)
使用 java.awt.Font 对我来说是有问题的,因为我的语法如下:
printParagraph(createParagraphWithAlignment(document, ParagraphAlignment.RIGHT),
"something",
new Font(playfairDisplayRegular, 12, Boolean.TRUE, Boolean.FALSE));
使用的方法:
protected XWPFRun printParagraph(XWPFParagraph paragraph, String text, Font font) {
XWPFRun run = paragraph.createRun();
run.setText(text);
run.setFontSize(font.getSize());
run.setBold(font.getBold());
run.setItalic(font.getItalic());
run.setFontFamily(font.getName());
return run;
}
protected XWPFParagraph createParagraphWithAlignment(IBody ibody, ParagraphAlignment alignment) {
XWPFParagraph paragraph = castParagraph(ibody);
paragraph.setAlignment(alignment);
return paragraph;
}