JAVA-字体路径而不是docx中的字体名称

时间:2018-10-25 11:56:52

标签: java apache-poi

我正在使用Apache POI生成.docx文档。我在项目中添加了外部字体。例如:

String playfairDisplayRegular = this.getClass().getClassLoader().getResource("PlayfairDisplay-Regular.ttf").getFile();

我在段落中使用playfairDisplayRegular。当我在字段中的文档中用字体名称标记文本时,例如路径:

/C:/Users/..../Documents...

代替字体名称(字体正在工作)。有任何想法吗 ?

问候,阿图尔

2 个答案:

答案 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)等等。

在docx中嵌入字体:

同时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;
}