iText:无法打印像∈;这样的数学字符∩∑∫∆√∠;

iText:无法打印像∈;这样的数学字符∩∑∫∆√∠;,itext,Itext,我正在使用iText 4.0.2版本生成pdf。我有一些要打印的字符/符号∈, ∩, ∑, ∫, ∆ (数学符号)和许多其他符号。 我的代码: Document document = new Document(PageSize.A4, 60, 60, 60, 60); try { PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("/home/

我正在使用iText 4.0.2版本生成pdf。我有一些要打印的字符/符号∈, ∩, ∑, ∫, ∆ (数学符号)和许多其他符号。 我的代码:

  Document document = new Document(PageSize.A4, 60, 60, 60, 60);
        try
        {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("/home/adeel/experiment.pdf"));

            document.open();

            String str = "this string will contains special character like this  ∈, ∩, ∑, ∫, ∆";

        BaseFont bfTimes = null;
        try {
            bfTimes = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.EMBEDDED);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Font fontnormal = new Font(bfTimes, 12, Font.NORMAL, Color.BLACK);
         Paragraph para = new Paragraph(str, fontnormal);
         document.add(para);

        document.close();
        writer.close();

        System.out.println("Done!");
    } catch (DocumentException e)
    {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
在上面的代码中,我将所有符号放入
str
并生成pdf文件。我尝试将unicode字符放在符号的
str
中,但效果并不理想。

请看一看示例

  • 首先,您需要一种支持所需符号的字体。顺便说一句,FreeSans.ttf就是这样一种字体。然后您需要使用正确的编码
  • 您使用的是UNICODE,因此需要
    Identity-H
    作为编码
  • 您还应该使用诸如
    \u2208
    \u2229
    \u2211
    \u222b
    \u2206
    。这不是必须的,但这是很好的做法
这是如何做到的:

public static final String DEST = "results/fonts/math_symbols.pdf";
public static final String FONT = "resources/fonts/FreeSans.ttf";
public static final String TEXT = "this string contains special characters like this  \u2208, \u2229, \u2211, \u222b, \u2206";

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    BaseFont bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    Font f = new Font(bf, 12);
    Paragraph p = new Paragraph(TEXT, f);
    document.add(p);
    document.close();
}
结果如下所示:


重要提示:您应该始终使用iText的最新官方版本。iText 4.0.2不是正式版本。

您犯了几个错误:(1)您没有使用真正的iText;iText 4.0.2。谁知道那个版本里面是什么?不要用它。(2) 您使用的字体不知道要使用的字符。(3) 即使使用了正确的字体,也使用了错误的编码。(4) 切勿编写包含非ASCII字符的源代码,请使用诸如
\u00a0
之类的符号。我对以下问题的回答中解释了上述所有问题:。你可以在我们应该使用哪种字体和编码来获得这些数学字符中找到这个问题?我们尝试用unicode符号替换符号,如“\u2220”-但该字符要么被跳过,要么生成问号。