Как написать арабский текст с помощью 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

Я попытался закодировать текст и сделать его строкой юникода, используя этот код

 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;
 }

и получите возвращенную строку в абзац и сохраните документы PDF с параметром unicode, установленным в true

Но это все равно.

Я не могу понять, как это сделать.

Отчеты были сделаны с использованием библиотеки MigraDoc 1.50.5147.


person Jood jindy    schedule 16.11.2020    source источник
comment
У меня работает, см. скрипт .NET. Всегда не забывайте публиковать минимальный воспроизводимый пример.   -  person Prolog    schedule 17.11.2020
comment
ок спасибо большое попробую   -  person Jood jindy    schedule 17.11.2020
comment
я попробовал это и тот же результат, который он дал мне   -  person Jood jindy    schedule 17.11.2020
comment
Я немного смущен. Какой результат вы ожидаете?   -  person Prolog    schedule 17.11.2020
comment
строка العلامة, но в pdf она выглядит так, как на картинке выше, поэтому мне нужно, чтобы она была в pdf такой же, как в С# (соединенные символы с правильными глифами символов), я не знаю, как это сделать   -  person Jood jindy    schedule 17.11.2020
comment
@Joodjindy то, что вы видите в Windows и .NET (не только ASP.NET), имеет мало общего с PDF. И строки Windows, и строки .NET имеют Юникод, и точка. Ваши строки уже являются строками Unicode. Вам не нужно ничего экранировать, чтобы печатать на арабском или китайском языке, и этот вопрос доказывает это - SO - это приложение ASP.NET. PDF с другой стороны сложна - это даже не формат документа, это набор инструкций по печати. Поскольку ответы в, вероятно, дублирующемся Unicode в PDF объясняют, что это беспорядок   -  person Panagiotis Kanavos    schedule 17.11.2020
comment
@Joodjindy, как показывают ответы в Unicode in PDF, метаданные могут быть в формате Unicode, но отображаемый текст требует доработки. Если вы получаете перевернутую строку, это означает, что PdfSharp уже обрабатывает глифы Unicode, но не языки RTL.   -  person Panagiotis Kanavos    schedule 17.11.2020


Ответы (1)


PDFsharp пока не поддерживает языки с письмом справа налево: http://www.pdfsharp.net/wiki/PDFsharpFAQ.ashx#Does_PDFsharp_support_for_Arabic_Hebrew_CJK_Chinese_Japanese_Korean_6

Вы можете обойти это ограничение, перевернув строку.

PDFsharp пока не поддерживает лигатуры шрифтов. Вероятно, вы сможете обойти это ограничение, заменив буквы правильным глифом (начало, середина, конец) в зависимости от положения.

person I liked the old Stack Overflow    schedule 17.11.2020
comment
это главное ... в арабском языке есть много возможностей, так как я могу заменить каждый символ правильным глифом? я видел, что глифы для одного и того же символа в UTF-16 различаются, поэтому мне интересно, есть ли связь ... если есть библиотека, которая дает мне код UTF-16 для арабского слова с правильными глифами, это было бы здорово ... недавно я пробовал iText7 - person Jood jindy; 17.11.2020
comment
Я почти ничего не знаю об арабском языке. Кажется, каждая буква имеет отдельную форму, начальную форму, конечную форму и среднюю форму. Разделите текст на слова, затем используйте правильные коды для начала, середины, конца, отдельного слова. Просто догадываюсь - надеюсь, так и будет. - person I liked the old Stack Overflow; 17.11.2020