Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java iText-在页面的不同位置附加pdf表格单元格短语中的阿拉伯文文本_Java_Pdf_Itext - Fatal编程技术网

Java iText-在页面的不同位置附加pdf表格单元格短语中的阿拉伯文文本

Java iText-在页面的不同位置附加pdf表格单元格短语中的阿拉伯文文本,java,pdf,itext,Java,Pdf,Itext,我想做一份英文和阿拉伯文的pdf报告。我在这一页上有许多表格/短语。我想显示阿拉伯语文本也随着英语。我在iText doxument中也看到了使用ColumnText的阿拉伯语示例。我无法控制自己。我的疑问是如何设置canvas.setSimpleColumn(36750559780),这个方法中的参数用于不同位置的表/短语。我也提到了下面的问题。我仍然有问题 , 下面是我的代码 private static final String ARABIC = "\u0627\u0644\u0633\

我想做一份英文和阿拉伯文的pdf报告。我在这一页上有许多表格/短语。我想显示阿拉伯语文本也随着英语。我在iText doxument中也看到了使用ColumnText的阿拉伯语示例。我无法控制自己。我的疑问是如何设置canvas.setSimpleColumn(36750559780),这个方法中的参数用于不同位置的表/短语。我也提到了下面的问题。我仍然有问题


下面是我的代码

private static final String ARABIC = "\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a";
    private static final String FONT = "resources/fonts/ARIALUNI.TTF";


    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf"));
    document.open();
    Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    PdfPTable table = new PdfPTable(3);
    Phrase phrase = new Phrase();
    Chunk chunk = new Chunk("test value", inlineFont);

    phrase.add(chunk);
    // I want to add Arabic text also here..but direction is not //correct.also coming as single alphabets
    p.add(new Chunk(ARABIC, f));
    PdfPCell cell1 = new PdfPCell(phrase);
    cell1.setFixedHeight(50f);
    table.addCell(cell1);
    document.add(table);
    document.close();

你的代码有点马虎

例如:

  • 您定义了一个包含3列的
    PdfPTable
    ,但只添加了一个单元格。那张桌子永远不会被渲染
  • 您可以使用名称
    短语
    定义
    短语,但稍后在代码中使用
    p.add(…)
    。代码中没有名为
    p
    的变量
这种对StackOverflow阅读器的不尊重可能会导致无法获得答案,因为您希望读者不仅能够解决实际问题——不能在单个
PdfPCell
-中使用英语和阿拉伯语文本,而且能够修复代码中的所有其他(可避免的)错误

这是一个工作示例:

public static final String FONT = "resources/fonts/NotoNaskhArabic-Regular.ttf";
public static final String ARABIC = "\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a";

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    PdfPTable table = new PdfPTable(1);
    Phrase phrase = new Phrase();
    Chunk chunk = new Chunk("test value");
    phrase.add(chunk);
    phrase.add(new Chunk(ARABIC, f));
    PdfPCell cell = new PdfPCell(phrase);
    cell.setUseDescender(true);
    cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
    table.addCell(cell);
    document.add(table);
    document.close();
}
结果如下所示:

正如你所看到的,英文和阿拉伯文都可以很好地阅读。您可能会对文本的对齐方式和顺序感到惊讶。当我们在从右向左的书写系统中工作时,左和右是切换的。默认情况下,文本是左对齐的,但一旦我们引入RTL运行方向,就会更改为右对齐

在代码中,首先添加英文文本,然后添加阿拉伯文文本。阿拉伯文文本从右向左阅读。这就是为什么你会看到英语文本在右边,为什么阿拉伯语文本会被添加到英语文本的左边


所有这些都在iText 7中得到了改进。iText 7有一个额外的pdfCalligraph模块,以透明的方式处理其他书写系统。

感谢Bruno的快速响应,并为我的代码共享中的问题道歉。我在iText页面中将代码与示例混合。在使用ColumnText的示例中,给出的方向是canvas.setRunDirection(PdfWriter.RUN\u direction\u LTR);有没有一种方法可以在这种情况下使用类似的方法。我需要左边的英语和右边的阿拉伯语。pdfCalligraph也是付费版本吗?无法使用Maven下载iText 7。正在检查。如果没有任何帮助,我计划对英语和阿拉伯语使用单独的单元格。如果您希望在iText 5中左侧显示英语,右侧显示阿拉伯语,则需要切换添加内容的顺序。pdfCalligraph是封闭源代码;你可以得到30天的试用版。我从Maven下载了iText 7,没有任何问题:。安装pdfCalligraph:在上搜索pdfCalligraph。