2017-08-15 78 views
-1

我想将字体设置为以西里尔文为单位的文本。我成功将文本转换为cyrilic,但我无法将字体设置为相同的文本。Itext如何将UTF编码和字体设置为段落

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

为什么你在'addContent'尝试应用'FontSelector'和'Font'?你可以让选择器选择一种字体,或者你自己明确地做... – mkl

回答

2

由于@mkl表示的意见,你混合FontSelector功能,让你一个Phrase,可以使用适当的Unicode字体(字体与BaseFont.IDENTITY_H作为编码参数),用一个简单的字体创建ParagraphFont.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 p = new Paragraph(fs.process(paragraph)); 
document.add(p); 

只要你不更换不正确的字体正确字体:另外,如果你真的需要一个Paragraph对象,你也可以这样做:

Paragraph p = new Paragraph(); 
p.add(fs.process(paragraph)); 
document.add(p); 

甚至“PhraseString,你可能没问题。

请注意,您可能甚至不需要FontSelector。这样做没有错:

BaseFont unicode = BaseFont.createFont(
    fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
Font font = new Font(unicode, 12); 
Paragraph p = new Paragraph(paragraph, font); 

在我看来,你正在使事情变得不必要的复杂。

+0

它的工作原理!非常感谢你! :) –

+0

通常情况下,当答案解决了问题时,答案被接受。请检查评分旁边的复选标记(目前得分为0)。 –