Java PdfPcell阿拉伯字符串的空输出

Java PdfPcell阿拉伯字符串的空输出,java,pdf,arabic,pdfptable,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 = n

我有那部分代码:

//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();
输出为空。 即使我尝试添加simple
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);

不同的问题可能在起作用

  • 编码:您正在将阿拉伯语文本放入源代码中。如果使用错误的编码保存Java文件,则该文本将被损坏。如果使用错误的编码编译Java文件,则该文本将被损坏。等等我希望你能明白。像这样存储文本:
    “\u0644\u0648\u0631\u0627\u0646\u0633\u0627\u0644\u0639\u0631\u0628”
    ,以避免类似问题
  • 如中所述,从右向左书写和阿拉伯文连字仅在
    PdfPCell
    ColumnText
    的上下文中受支持。我看到您使用的是
    PdfPCell
    ,但我没有看到您使用的是
    cell.setRunDirection(PdfWriter.RUN\u DIRECTION\RTL)任何地方。那是错误的
  • 您使用的是对象
    fontNormal
    ,但您没有告诉我们您实际使用的字体。例如:如果您使用的是标准的Type1字体Helvetica,则不会显示任何文本,因为Helvetica不知道如何呈现阿拉伯语文本
  • 修正案:您现在已经更新了您的问题,表明您正在使用
    “arialuni.ttf”
    。但是,您使用了错误的编码:CP1252是的编码。您应该使用
    BaseFont.IDENTITY\u H

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

  • 您假设字体的名称为
    “arialuni.ttf”
    。这是字体文件,但不是字体名称。另外:您向
    FontFactory
    询问此字体,但您是否告诉
    FontFactory
    在哪里查找字体?您确定
    FontFactory
    可以找到
    c:/windows/fonts/
    或存储文件
    arialuni.ttf
    的任何目录吗
  • 您正在声明字体,但未使用它:
    段落p=新段落(“\u062D\u064A\u0633\u0648”)使用默认字体创建
    段落
  • 这是有效的代码:

    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);
    
    结果如下所示(放大):

    谢谢,我改为
    段落p=新段落(“\u062D\u064A\u0633\u0648”);p.第(20)段之后的设定值;p.setAlignment(1);//中心文件。添加(p)但在vainI中,我将为您提供一个示例。给我一些时间。你仍然有两个主要错误,清楚地表明你忽略了文档(这是令人沮丧的)。我会更新我的答案。我看到一些让我感觉做了正确的事情的文档;我这样尝试:
    BaseFont bf0=null;尝试{bf0=BaseFont.createFont(“arialuni.ttf”,BaseFont.IDENTITY,BaseFont.EMBEDDED);}catch(IOException e){e.printStackTrace();}段落p=新段落(“\u062D\u064A\u0633\u0648”,new com.itextpdf.text.Font(bf0,10));p、 在(20)之后设置垫片;文件.添加(p)