我想将字体设置为西里尔文本。我成功将文本转换为cyrilic,但我无法将字体设置为相同的文本。
File fontFile = new File("arialuni.ttf");
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT));
document.open();
writer.getAcroForm().setNeedAppearances(true);
Font boldFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD);
Font normalFont = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.ITALIC);
BaseFont unicode = BaseFont.createFont(fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
FontSelector fs = new FontSelector();
fs.addFont(new Font(unicode));
addContent(document,article.getTitle(),fs,boldFont);
private static void addContent(Document document,String paragraph,FontSelector fs,Font font) throws DocumentException {
Phrase phrase = fs.process(paragraph);
Paragraph p = new Paragraph(phrase.toString(),font);
document.add(p);
}
答案 0 :(得分:2)
正如@mkl在评论中指出的那样,您混合FontSelector
功能,为您提供Phrase
可以使用相应的unicode字体(带BaseFont.IDENTITY_H
的字体作为编码参数),使用简单字体(Paragraph
)创建Font.FontFamily.TIMES_ROMAN
。
执行fs.process(paragraph)
后,您会得到一个Phrase
,其中每个Chunk
都有正确的字体,但当您执行phrase.toString()
时,您会丢弃所有这些字体,然后用Font.FontFamily.TIMES_ROMAN
替换它们。这没有任何意义。
为什么不替换它:
Phrase phrase = fs.process(paragraph);
Paragraph p = new Paragraph(phrase.toString(),font);
document.add(p);
使用:
document.add(fs.process(paragraph));
为什么您的addContent()
方法需要Font
作为参数?此外,如果您确实需要Paragraph
对象,也可以执行此操作:
Paragraph p = new Paragraph();
p.add(fs.process(paragraph));
document.add(p);
甚至:
Paragraph p = new Paragraph(fs.process(paragraph));
document.add(p);
只要不将Phrase
“展平”为String
,就不会使用不正确的字体替换正确的字体,那么您可能没问题。
请注意,您甚至可能不需要FontSelector
。这样做没有错:
BaseFont unicode = BaseFont.createFont(
fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(unicode, 12);
Paragraph p = new Paragraph(paragraph, font);
在我看来,你正在做一些不必要的事情。