使用iTextSharp在C#中将PDF转换为阿拉伯语

4
我想在C#中创建一个包含阿拉伯文本内容的PDF文件。我正在使用iTextSharp来创建它。我遵循了http://geekswithblogs.net/JaydPage/archive/2011/11/02/using-itextsharp-to-correctly-display-hebrew--arabic-text-right.aspx中的指示。我想在PDF中插入以下阿拉伯语句子。

تم إبرام هذا العقد في هذا اليوم [●] م الموافق [●] من قبل وبين .

[●]需要替换为动态英文单词。我尝试使用ARIALUNI.TTF [此教程链接建议使用它] 来实现这一点。代码如下:

public void WriteDocument()
{
    //Declare a itextSharp document 
    Document document = new Document(PageSize.A4);

    //Create our file stream and bind the writer to the document and the stream 
    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(@"D:\Test.Pdf", FileMode.Create));

    //Open the document for writing 
    document.Open();

    //Add a new page 
    document.NewPage();

    //Reference a Unicode font to be sure that the symbols are present. 
    BaseFont bfArialUniCode = BaseFont.CreateFont(@"D:\ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    //Create a font from the base font 
    Font font = new Font(bfArialUniCode, 12);

    //Use a table so that we can set the text direction 
    PdfPTable table = new PdfPTable(1);
    //Ensure that wrapping is on, otherwise Right to Left text will not display 
    table.DefaultCell.NoWrap = false;

    //Create a regex expression to detect hebrew or arabic code points 
    const string regex_match_arabic_hebrew = @"[\u0600-\u06FF,\u0590-\u05FF]+";
    if (Regex.IsMatch("م الموافق", regex_match_arabic_hebrew, RegexOptions.IgnoreCase))
    {
        table.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
    }

    //Create a cell and add text to it 
    PdfPCell text = new PdfPCell(new Phrase(" : "+"من قبل وبين" + " 2007 " + "م الموافق" + " dsdsdsdsds " + "تم إبرام هذا العقد في هذا اليوم ", font));
    //Ensure that wrapping is on, otherwise Right to Left text will not display 
    text.NoWrap = false;

    //Add the cell to the table 
    table.AddCell(text);

    //Add the table to the document 
    document.Add(table);

    //Close the document 
    document.Close();

    //Launch the document if you have a file association set for PDF's 
    Process AcrobatReader = new Process();
    AcrobatReader.StartInfo.FileName = @"D:\Test.Pdf";
    AcrobatReader.Start();
}

在调用此函数时,我得到了一个包含以下Unicode字符的PDF文件。

اذه يف دقعلا اذه ماربإ مت dsdsdsdsds قفاوملا م 2007 نيبو لبق نم مويلا

它与我们硬编码的阿拉伯语句子不匹配。这是字体的问题吗?请帮助我或建议我实现相同的其他方法。


你漏掉了 text.RunDirection = PdfWriter.RUN_DIRECTION_RTL; - VahidN
4个回答

8
@csharpcoder的想法是正确的,但他的执行有误。他没有将单元格添加到表格中,而且表格最终也没有出现在文档中。
void Go()
{
    Document doc = new Document(PageSize.LETTER);
    string yourPath = "foo/bar/baz.pdf";
    using (FileStream os = new FileStream(yourPath, FileMode.Create))
    {
        PdfWriter.GetInstance(doc, os); // you don't need the return value

        doc.Open();

        string fontLoc = @"c:\windows\fonts\arialuni.ttf"; // make sure to have the correct path to the font file
        BaseFont bf = BaseFont.CreateFont(fontLoc, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font f = new Font(bf, 12);

        PdfPTable table = new PdfPTable(1); // a table with 1 cell
        Phrase text = new Phrase("العقد", f);
        PdfPCell cell = new PdfPCell(text);
        table.RunDirection = PdfWriter.RUN_DIRECTION_RTL; // can also be set on the cell
        table.AddCell(cell);
        doc.Add(table);
        doc.Close();
    }
}

你可能想要去掉单元格边框等,但这些信息可以在SO或iText网站上找到。iText应该能够处理同时包含RTL和LTR字符的文本。
编辑:
我认为源问题实际上是与Visual Studio和Firefox(我的浏览器)中如何呈现阿拉伯文有关,或者与字符串如何连接有关。我不太熟悉阿拉伯文编辑器,但如果我们这样做,文本似乎会正确显示:

Arabic text in Visual Studio

我需要截图,因为在VS和浏览器之间复制粘贴会打乱文本的顺序。


5

从右到左的书写和阿拉伯语连字号仅在ColumnText和PdfPTable中受支持!

尝试以下代码:

    Document Doc = new Document(PageSize.LETTER);

//Create our file stream
using (FileStream fs = new FileStream(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf"), FileMode.Create, FileAccess.Write, FileShare.Read))
{
    //Bind PDF writer to document and stream
    PdfWriter writer = PdfWriter.GetInstance(Doc, fs);

    //Open document for writing
    Doc.Open();

    //Add a page
    Doc.NewPage();

    //Full path to the Unicode Arial file
    string ARIALUNI_TFF = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "arabtype.TTF");

    //Create a base font object making sure to specify IDENTITY-H
    BaseFont bf = BaseFont.CreateFont(ARIALUNI_TFF, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    Font f = new Font(bf, 12);
    //Write some text, the last character is 0x0278 - LATIN SMALL LETTER PHI
    Doc.Add(new Phrase("This is a ميسو ɸ", f));

    //add Arabic text, for instance in a table
    PdfPCell cell = new PdfPCell();
    cell.AddElement(new Phrase("Hello\u0682", f));
    cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
    //Close the PDF
    Doc.Close();
}

我尝试过这个。但是 Doc.Add(new Phrase("This is a ميسو ɸ", f)); 打印出来的是 This is a وسيم ɸ。两者不同。如何解决? - NOBLE M.O.
请确保您拥有所需的阿拉伯字体。这是一段可工作的代码。给自己一个休息,然后再试一次。你会想出来的。 - coder3521
希望所有用户都能使用这个评论。这是ItextSharp阿拉伯文本只能与Table和phrase关键字一起使用。 - mahdi moghimi

3

我希望这些笔记可以帮助你,以下是相关答案:

  1. Use a safe code to achieve your font:

    var tahomaFontFile =  Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Fonts), 
        "Tahoma.ttf");
    
  2. Use BaseFont.IDENTITY_H and BaseFont.EMBEDDED properties.

    var tahomaBaseFont = BaseFont.CreateFont(tahomaFontFile, 
         BaseFont.IDENTITY_H, 
         BaseFont.EMBEDDED);
    var tahomaFont = new Font(tahomaBaseFont, 8, Font.NORMAL);
    
  3. Use PdfWriter.RUN_DIRECTION_RTL, for both your cell and your table:

    var table = new PdfPTable(1) 
        { 
            RunDirection = PdfWriter.RUN_DIRECTION_RTL 
        };
    
    var phrase = new Phrase("تم إبرام هذا العقد في هذا اليوم [●] م الموافق [●] من قبل وبين .", 
         tahomaFont);
    var cell = new PdfPCell(phrase)
        {
            RunDirection = PdfWriter.RUN_DIRECTION_RTL,
            Border = 0,
        };
    

2

我相信你的问题在字符串结构部分,尝试使用以下代码,它在我的机器上能够正常工作。祝好运。

public static void GeneratePDF()
{
    // 在这里添加代码
}

        //Declare a itextSharp document 
        Document document = new Document(PageSize.A4);
        Random ran = new Random();
        string PDFFileName = string.Format(@"C:\Test{0}.Pdf", ran);
        //Create our file stream and bind the writer to the document and the stream 
        PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(PDFFileName, FileMode.Create));
        //Open the document for writing 
        document.Open();
        //Add a new page 
        document.NewPage();


        var ArialFontFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.ttf");
        //Reference a Unicode font to be sure that the symbols are present. 
        BaseFont bfArialUniCode = BaseFont.CreateFont(ArialFontFile, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        //Create a font from the base font 
        Font font = new Font(bfArialUniCode, 12);


        //Use a table so that we can set the text direction 
        var table = new PdfPTable(1)
        {
            RunDirection = PdfWriter.RUN_DIRECTION_RTL,
        };
        //Ensure that wrapping is on, otherwise Right to Left text will not display 
        table.DefaultCell.NoWrap = false;

        ContentObject CO = new ContentObject();
        CO.Name = "Ahmed Gomaa";
        CO.StartDate = DateTime.Now.AddMonths(-5);
        CO.EndDate = DateTime.Now.AddMonths(43);

        string content = string.Format(" تم إبرام هذا العقد في هذا اليوم من قبل {0} في تاريخ بين {1} و {2}", CO.Name, CO.StartDate, CO.EndDate);
        var phrase = new Phrase(content, font);
        //var phrase = new Phrase("الحمد لله رب العالمين", font);
        //Create a cell and add text to it 
        PdfPCell text = new PdfPCell(phrase)
        {
            RunDirection = PdfWriter.RUN_DIRECTION_RTL,
            Border = 0
        };
        //Ensure that wrapping is on, otherwise Right to Left text will not display 
        text.NoWrap = false;

        //Add the cell to the table 
        table.AddCell(text);

        //Add the table to the document 
        document.Add(table);

        //Close the document 
        document.Close();

        //Launch the document if you have a file association set for PDF's 
        Process AcrobatReader = new Process();
        AcrobatReader.StartInfo.FileName = PDFFileName;
        AcrobatReader.Start();
    }
}

public class ContentObject
{
    public string Name { set; get; }
    public DateTime StartDate { set; get; }
    public DateTime EndDate { set; get; }
}

`


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