在评论区,Funkystein写道,你描述的问题通常发生在以下情况下:
- 你使用的字体没有该字形。或者
- 你没有使用正确的编码。
我已经写了一个示例来说明这一点:
RupeeSymbol。
public static final String DEST = "results/fonts/rupee.pdf";
public static final String FONT1 = "resources/fonts/PlayfairDisplay-Regular.ttf";
public static final String FONT2 = "resources/fonts/PT_Sans-Web-Regular.ttf";
public static final String FONT3 = "resources/fonts/FreeSans.ttf";
public static final String RUPEE = "The Rupee character \u20B9 and the Rupee symbol \u20A8";
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(DEST));
document.open();
Font f1 = FontFactory.getFont(FONT1, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12);
Font f2 = FontFactory.getFont(FONT2, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12);
Font f3 = FontFactory.getFont(FONT3, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12);
Font f4 = FontFactory.getFont(FONT3, BaseFont.WINANSI, BaseFont.EMBEDDED, 12);
document.add(new Paragraph(RUPEE, f1));
document.add(new Paragraph(RUPEE, f2));
document.add(new Paragraph(RUPEE, f3));
document.add(new Paragraph(RUPEE, f4));
document.close();
}
RUPEE
常量是一个
String
,其中包含卢比字符和卢比符号:
"The Rupee character ₹ and the Rupee symbol ₨"
。
这些字符以Unicode值的形式存储,因为如果我们以其他方式存储这些字符,则可能无法正确呈现。例如:如果您将值作为Winansi从数据库检索,则会得到不正确的字符。
我测试了三种不同的字体(PlayfairDisplay-Regular.ttf,PT_Sans-Web-Regular.ttf和FreeSans.ttf),并使用
IDENTITY_H
进行三次编码。我还第四次使用
WINANSI
来显示它错了。
结果是名为
rupee.pdf的文件:
如您所见,前两种字体知道如何绘制卢比字符。第三个不知道。前两种字体不知道如何绘制卢比符号。第三个可以。但是,如果您使用错误的编码,则所有字体都不会绘制正确的字符或符号。
简而言之:您需要找到一个知道如何绘制所需字符或符号的字体,然后必须确保您正在使用正确的编码(对于
String
和
Font
)。
您可以在此处
下载完整的示例代码。
"assets/arial .ttf"
。它应该是"assets/arial.ttf"
。同时确保您已将字体 arial.ttf 复制到您的assets
文件夹中。 - Phantômaxx