首页 > 解决方案 > 如何使用 MigraDoc 编写阿拉伯语文本?

问题描述

我为此使用 ASP,我必须生成 PDF 格式的报告并将文件发送回客户,以便他们下载。

我使用 MigraDoc 库制作了报告,它们很棒,但是在我尝试使用阿拉伯语文本后,我发现文本在 LTR 中并且字符脱节,所以我编写了这段代码来测试一下

    ...............
    MigraDoc.DocumentObjectModel.Document reportDoc = new MigraDoc.DocumentObjectModel.Document();
    reportDoc.Info.Title = "test";
    sec = reportDoc.AddSection();
    string fileName = "test.pdf";
    addformattedText(sec, "العبارة", true);
    PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
    renderer.Document = reportDoc;
    renderer.RenderDocument();
    MemoryStream pdfStream = new MemoryStream();
    renderer.PdfDocument.Save(pdfStream);
    byte[] bytes = pdfStream.ToArray();
    ...............


    private void addformattedText(Section sec,string text, bool shouldBeBold = false)
    {
        var tf = sec.AddTextFrame();
        var p = tf.AddParagraph(text);
        p.Format.Font.Name = "Tahoma";
        if (shouldBeBold) p.Format.Font.Bold = true;
    }

我得到这样的输出 测试pdf输出

我尝试使用此代码对文本进行编码并使其成为 unicode 字符串

 private string getEscapedString(string text)
 {
     if (true || HasArabicCharacters(text))
     {
         string uString = "";
         byte[] utfBytes = Encoding.Unicode.GetBytes(text);
         foreach (var u in utfBytes)
         {
             if (u != 0)
             {
                 uString += String.Format(@"\u{0:x4}", u);
             }
         }
         return uString;
     }
     else
         return text;
 }

并将返回的字符串放入一个段落中,并将 unicode 参数设置为 true 的 PDF 文档保存

但这都是一样的。

我不知道如何完成它。

报告是使用 MigraDoc 1.50.5147 库完成的。

标签: c#arabicmigradoc

解决方案


问题是阿拉伯语字体在乞求、最后、连接和单独时有 4 种不同的形状,其中 Pdfsharp 和 MigraDoc 无法识别要打印的更远的形状,您需要反转字符顺序来解决这个问题,您可以使用AraibcPdfUnicodeGlyphsResharper来帮助做到这一点工作如下:

using PdfSharp.Drawing;
using PdfSharp.Pdf;
using AraibcPdfUnicodeGlyphsResharper;
namespace MigraDocArabic
{
internal class PrintArabicUsingPdfSharp
{
    public PrintArabicUsingPdfSharp(string path)
    {
        PdfDocument document = new PdfDocument();
        document.Info.Title = "Created with PDFsharp";
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        // Create an empty page
        PdfPage page = document.AddPage();

        // Get an XGraphics object for drawing
        XGraphics gfx = XGraphics.FromPdfPage(page);

        // Create a font
        XFont font = new XFont("Arial", 20, XFontStyle.BoldItalic);
        var xArabicString = "كتابة اللغة  العربية شيئ جميل".ArabicWithFontGlyphsToPfd();
        // Draw the text
        gfx.DrawString("Hello, World!", font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Center);
        gfx.DrawString(xArabicString, font, XBrushes.Black, new XRect(50, 50, page.Width, page.Height), XStringFormats.Center);

        // Save the document...
        document.Save(path);

    }
}

}

不要忘记扩展方法顺便说一句,这也适用于 iText7,也可以查看图像以获取结果

结果


推荐阅读