Itext如何将UTF编码和Font设置为段落

时间:2017-08-15 07:05:35

标签: itext

我想将字体设置为西里尔文本。我成功将文本转换为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);
}

1 个答案:

答案 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);

在我看来,你正在做一些不必要的事情。