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 を取得しました。

2007 年に dsdsdsdsdsds が 2007 年に公開されました。

ハードコーディングされたアラビア語の文と一致しません。これはフォントの問題ですか?私を助けるか、同じことを実装する他の方法を提案してください。

4

4 に答える 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 Web サイトの他の場所にあります。iText は、RTL 文字と LTR 文字の両方を含むテキストを処理できる必要があります。

編集

ソースの問題は、実際にはアラビア語のテキストが Visual Studio と Firefox (私のブラウザー) でどのようにレンダリングされるか、または文字列がどのように連結されるかにあると思います。私はアラビア語のテキスト エディターにはあまり詳しくありませんが、次のようにするとテキストが正しく出力されるようです。

Visual Studio のアラビア語テキスト

参考までに、VS からブラウザーにコピーして貼り付けると (逆も同様)、テキストの部分の順序が乱れるため、スクリーンショットを撮る必要がありました。

于 2015-12-30T12:38:37.537 に答える
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();
}
于 2015-12-30T11:33:04.643 に答える