Itext阿拉伯字体显示为问号

3

我对iText库还不熟悉。我的需求是需要将输出转换为PDF格式,并且其中包含阿拉伯字符。我创建了一个测试servlet,代码如下:

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType ("application/pdf;charset=UTF-8");
Document document = new Document();
    try{
        PdfWriter.getInstance(document, 
            response.getOutputStream()); // Code 2
        document.open();

        Font f1;
  BaseFont bf  = BaseFont.createFont("C:\\WINDOWS\\Fonts\\ARIALUNI.ttf", BaseFont.CP1252, true);
  f1 = new Font(bf, 10);

        PdfPTable table = new PdfPTable(2);
        table.addCell("hellooooo1");
        table.addCell("world2");
        table.addCell("1113");
        table.addCell("422");

 // String a = "يبسبيبيبيسسسيبيببيسبيسيببي";
  String a = "سش";
  PdfPCell cell = new PdfPCell (new Paragraph (a,f1));
  table.addCell (cell);
  cell = new PdfPCell (new Paragraph ("Road",f1));
  table.addCell (cell);

        document.add(table);        
        document.close(); 
    }catch(DocumentException e){
        e.printStackTrace();
    }
}

我们使用阿拉伯字符输出的结果显示为?????。如何纠正这个问题?我在哪里犯了错误?


尝试将“CP1252”替换为“IDENTITY_H”。 - jmj
没有成功...它仍然只显示问号。 - vikka
为了谨慎起见,请尝试将 a 直接添加到文档中,而不是作为表格的一部分。如果这样仍然无法解决问题,我们就知道问题不是由 PdfTable 类引起的。 - Mark Storer
我尝试直接将段落添加到文档中,但没有成功。我用一个新的免费阿拉伯字体替换了原来的字体,并且该字体包含阿拉伯字符。现在我得到了一些奇怪的符号,而不是阿拉伯字符。 - vikka
1个回答

3

你的问题在于使用了Windows CP1252字符集创建BaseFont,该字符集仅适用于拉丁字符。尝试改用Unicode编码:

 BaseFont bf  = BaseFont.createFont("C:\\WINDOWS\\Fonts\\ARIALUNI.ttf", BaseFont.IDENTITY_H, true);

我已经进行了更改。但是仍然显示阿拉伯字符为问号。 - vikka
这可能是一个愚蠢的问题,但你已经验证过你的字体是否有阿拉伯字形了,对吧?另外一个尝试的方法是将你的字符串作为Unicode文字(例如\u1610等)传递给段落构造函数,看看它们是否被破坏了。 - stevevls
抱歉询问,我如何检查我的字体是否具有阿拉伯语字形?我尝试使用一些来自我的Windows字体目录的字体,但出现了许可错误。现在我已经下载了一些支持阿拉伯语的字体并正在使用它们。 - vikka
好的。我的字体有阿拉伯字形。我可以在Word中使用这种字体输入阿拉伯语。 - vikka
1
运行“charmap”。它将显示Windows机器上安装的所有字体的所有可用字符。您甚至可以按Unicode子范围进行排序,以便更轻松地查找阿拉伯语。 - Mark Storer
谢谢。我正在使用的字体具有阿拉伯语支持。 - vikka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接