PdfPcell阿拉伯字符串的空输出

时间:2014-04-24 11:49:10

标签: java pdf arabic pdfptable

我有这部分代码:

//Staff
// Title font
BaseFont titleBf = null;
try {
titleBf = BaseFont.createFont(BaseFont.TIMES_ROMAN,BaseFont.CP1252, BaseFont.EMBEDDED);
} catch (IOException e) {
System.out.println(e.getMessage());
}
com.itextpdf.text.Font titleFont = new com.itextpdf.text.Font(titleBf,24);
titleFont.setColor(new BaseColor(0, 0, 204));
/*
 * Pdf creation
*/
Document document = new Document();
PdfWriter.getInstance(document,new FileOutputStream(fc.getSelectedFile() + ".pdf"));
document.open();

/*
* Title
*/
Paragraph p = new Paragraph("مرحبا بكم",titleFont);
p.setSpacingAfter(20);
p.setAlignment(1); // Center
document.add(p);
//Staff
document.close();

输出为空。 即使我试图添加简单的pdfpcell,我得到了相同的结果,这是方法:

com.itextpdf.text.Font fontNormal = FontFactory.getFont(
                ("arialuni.ttf"), BaseFont.CP1252, BaseFont.EMBEDDED,
                8, com.itextpdf.text.Font.NORMAL);

Chunk chunkArabic = new Chunk("مرحبا العالم", fontNormal);
infoTab.addCell(new PdfPCell(new Phrase(chunkArabic)));
document.add(infoTab);

1 个答案:

答案 0 :(得分:2)

可能会遇到不同的问题。

  1. 编码:您在源代码中添加了阿拉伯文字。如果使用错误的编码保存Java文件,则该文本将损坏。如果使用错误的编码编译Java文件,该文本将损坏。等等。我希望你明白这个主意。像这样存储文字文本:"\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628"以避免这样的问题。
  2. Chapter 11 of my book中所述,仅在PdfPCellColumnText的上下文中支持从右到左书写和阿拉伯语连字。我发现您使用的是PdfPCell,但我没有看到您在任何地方使用cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);。那是错的。
  3. 您正在使用对象fontNormal,但您没有告诉我们您实际使用的是哪种字体。例如:如果您使用标准的Type1字体Helvetica,则不会显示任何文本,因为Helvetica不知道如何呈现阿拉伯文本。
  4. 修正案:您现在已更新了问题,表明您正在使用"arialuni.ttf"。但是,您使用的编码错误:CP1252是Latin Alphabet的编码。您应该使用BaseFont.IDENTITY_H

    更新:查看问题的更新以及额外的评论,我发现了两个主要错误。

    1. 您假设字体名称为"arialuni.ttf"。这是字体文件,但不是字体名称。另外:你问FontFactory这个字体,但是你告诉FontFactory在哪里寻找字体吗?您确定FontFactory可以找到c:/windows/fonts/或文件arialuni.ttf存储的任何目录。
    2. 您正在声明字体,但您没有使用它:Paragraph p = new Paragraph("\u062D\u064A\u0633\u0648");使用默认字体创建Paragraph
    3. 这是有效的代码:

      BaseFont bf = BaseFont.createFont(
          "c://windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      Font font = new Font(bf, 8);
      PdfPTable table = new PdfPTable(1);
      PdfPCell  cell = new PdfPCell(new Phrase("\u062D\u064A\u0633\u0648", font));
      cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
      table.addCell(cell);
      document.add(table);
      

      结果如下(放大): enter image description here