Itext7 不显示阿拉伯语文本

问题描述 投票:0回答:2

我正在尝试使用 IText7 创建 Pdf 文档。尽管表格看起来符合预期,但发现了一个大问题,这不显示阿拉伯字母。

我尝试添加新字体并更改编码。 我以错误的方向显示阿拉伯字母,并且它们被分开,将基本方向从右向左更改没有帮助。

这是代码的一部分:

string font = "naskh.ttf";
PdfFontFactory.Register(font);
FontProgram fontProgram = FontProgramFactory.CreateFont(font, true); 
PdfFont f = PdfFontFactory.CreateFont(font,true);
Cell cell = new Cell(1, 3)
    .Add(new Paragraph(" English عربي "))
    .SetFont(f).SetFontScript(UnicodeScript.ARABIC)
    .SetFontSize(33).SetBaseDirection(BaseDirection.RIGHT_TO_LEFT)
    .SetFontColor(DeviceGray.WHITE)
    .SetBackgroundColor(new DeviceRgb(80, 140, 80))
    .SetTextAlignment(TextAlignment.CENTER);

结果是这样的: Result

我已经尝试了网上能找到的所有内容,其中很多都是java或旧版本,我尝试将它们更改为在c# Itext7上工作,但仍然没有结果 我最近的床是和

PdfFont f = PdfFontFactory.CreateFont(alaw, "Identity-H", true);
我有 3 个字母顺序错误

我什至尝试使用

\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628
(从答案中复制为字符串,但仍然没有显示。

我无法使用付费附加组件 有什么办法可以写阿拉伯语吗?

c# pdf arabic itext7 non-ascii-characters
2个回答
1
投票

添加语言处理器:

        LanguageProcessor languageProcessor = new ArabicLigaturizer();

并像这样修改单元格或 PdfDocument:

  com.itextpdf.kernel.pdf.PdfDocument tempPdfDoc = new com.itextpdf.kernel.pdf.PdfDocument(new PdfReader(pdfFile.getPath()), TempWriter);
        com.itextpdf.layout.Document TempDoc = new com.itextpdf.layout.Document(tempPdfDoc);
        com.itextpdf.layout.element.Paragraph paragraph0 = new com.itextpdf.layout.element.Paragraph(languageProcessor.process("الاستماره الالكترونية--الاستماره الالكترونية--الاستماره الالكترونية--الاستماره الالكترونية"))
                .setFont(f).setBaseDirection(BaseDirection.RIGHT_TO_LEFT)
                .setFontSize(15);

最终结果会是这样的:

    String font = "your Arabic font";
    PdfFontFactory.register(font);
    FontProgram fontProgram = FontProgramFactory.createFont(font, true);
    PdfFont f = PdfFontFactory.createFont(fontProgram, PdfEncodings.IDENTITY_H);
    LanguageProcessor languageProcessor = new ArabicLigaturizer();
    com.itextpdf.kernel.pdf.PdfDocument tempPdfDoc = new 
    com.itextpdf.kernel.pdf.PdfDocument(new PdfReader(pdfFile.getPath()), TempWriter);
    com.itextpdf.layout.Document TempDoc = new 
    com.itextpdf.layout.Document(tempPdfDoc);
    com.itextpdf.layout.element.Paragraph paragraph0 = new 
    com.itextpdf.layout.element.Paragraph(languageProcessor.process("الاستماره الالكترونية--الاستماره الالكترونية--الاستماره الالكترونية--الاستماره الالكترونية"))
                .setFont(f).setBaseDirection(BaseDirection.RIGHT_TO_LEFT)
                .setFontSize(15);

//看看我如何使用 setBaseDirection & 并且不使用 TextAlignment ,没有它它也能工作


0
投票

对于 C# 这对我有用(字体类型非常重要,我使用了 arial 阿拉伯语)

using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using iText.Kernel.Geom;
using iText.IO.Font;
using iText.Kernel.Font;
using iTextSharp.text.pdf; // used iTextSharp for ArabicLigaturizer class and you have to use it unless you gonna get reversed words
using PdfWriter = iText.Kernel.Pdf.PdfWriter;
using PdfDocument = iText.Kernel.Pdf.PdfDocument;
using PdfEncodings = iText.IO.Font.PdfEncodings;
using PdfFont = iText.Kernel.Font.PdfFont;

string arabicFontPath = @"Full path to your font\alfont_com_arial-1.ttf";
FontProgram fontProgram = FontProgramFactory.CreateFont(arabicFontPath, true);
PdfFont f = PdfFontFactory.CreateFont(fontProgram, PdfEncodings.IDENTITY_H);
var arabicLanguageProcessor = new ArabicLigaturizer();

table.AddCell(new Paragraph(arabicLanguageProcessor.Process(item.NameAr ?? DefaultValue))
    .SetFont(f)
    .SetBaseDirection(BaseDirection.RIGHT_TO_LEFT)
    .SetFontSize(14));
© www.soinside.com 2019 - 2024. All rights reserved.