разрешить арабский текст в таблице PDF с помощью itext7 (xamarin android)

Мне нужно поместить данные моего списка в таблицу в файле pdf. В моих данных есть несколько арабских слов. Когда создается мой PDF-файл, арабские слова не отображаются. Я поискал и обнаружил, что мне нужен itext7.pdfcalligraph, поэтому я установил его в своем приложении. Я тоже нашел этот код https://itextpdf.com/en/blog/technical-notes/displaying-text-different-languages-single-pdf-document и попытался сделать что-то подобное, чтобы разрешить арабские слова в моей таблице, но я не мог этого понять вне.

Это пробный код, прежде чем я применю его к своему настоящему списку:

var path2 = global::Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
filePath = System.IO.Path.Combine(path2.ToString(), "myfile2.pdf");
stream = new FileStream(filePath, FileMode.Create);
PdfWriter writer = new PdfWriter(stream);
PdfDocument pdf2 = new iText.Kernel.Pdf.PdfDocument(writer);
            
Document document = new Document(pdf2, PageSize.A4);
FontSet set = new FontSet();
set.AddFont("ARIAL.TTF");


document.SetFontProvider(new FontProvider(set));
document.SetProperty(Property.FONT, "Arial");
 
string[] sources = new string[] { "يوم","شهر 2020" };
 iText.Layout.Element.Table table = new iText.Layout.Element.Table(2, false);
 foreach (string source in sources)
                {
                    Paragraph paragraph = new Paragraph();
                    Bidi bidi = new Bidi(source, Bidi.DirectionDefaultLeftToRight);
                    if (bidi.BaseLevel != 0)
                    {
                        paragraph.SetTextAlignment(iText.Layout.Properties.TextAlignment.RIGHT);
                    }

                    paragraph.Add(source);
                    table.AddCell(new Cell(1, 1).SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER).Add(paragraph));
                }
                document.Add(table);
                document.Close();

Я обновил свой код и добавил arial.ttf в папку с ресурсами. я получаю следующее исключение:

System.InvalidOperationException: «FontProvider и FontSet пусты. Невозможно разрешить имя семейства шрифтов (см. ElementPropertyContainer # setFontFamily) без инициализированного FontProvider (см. RootElement # setFontProvider). ' и я все еще не могу понять это. Любые идеи? заранее спасибо


person rana hd    schedule 07.09.2020    source источник
comment
Измените свой код, чтобы он был самодостаточным и представлял собой минимально воспроизводимый образец. Прямо сейчас у него есть неопределенные tableItems записи, а также избыточный textView, Toast, Rsultitem, закомментированный код.   -  person Alexey Subach    schedule 07.09.2020
comment
пожалуйста, дайте мне знать, в порядке ли отредактированный код   -  person rana hd    schedule 07.09.2020
comment
Ошибка говорит сама за себя: FontProvider and FontSet are empty.. Проверьте возвращаемое значение set.AddFont("ARIAL.TTF") - согласно документации метод возвращает true в случае успешного добавления шрифта и false в противном случае.   -  person Alexey Subach    schedule 08.09.2020
comment
да, он возвращает false, я изменил свой путь к шрифту на это: set2.AddFont("C:\\Windows\\Fonts\\Arial.TTF");, но он все тот же. что я должен делать?   -  person rana hd    schedule 08.09.2020
comment
Возвращает истину или ложь? new File("C:\\Windows\\Fonts\\Arial.TTF").exists() возвращает истину или ложь?   -  person Alexey Subach    schedule 10.09.2020


Ответы (1)


- C #

У меня аналогичная ситуация с турецкими персонажами, и я выполнил следующие действия:

  • Создайте папку в корневой папке проектов: / wwwroot / Fonts.
  • Добавьте OpenSans-Regular.ttf в папку Fonts

Путь для шрифта = ›../wwwroot/Fonts/OpenSans-Regular.ttf

  • Создайте шрифт, как показано ниже:
public static PdfFont CreateOpenSansRegularFont()
{
    var path = "{Your absolute path for FONT}";
    return PdfFontFactory.CreateFont(path, PdfEncodings.IDENTITY_H, true);
}

и используйте это как:

paragraph.Add(source)
         .SetFont(FontFactory.CreateOpenSansRegularFont());  //set font in here

table.AddCell(new Cell(1, 1)
     .SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER)
     .Add(paragraph));

Вот как я использовал фабрику шрифтов для турецких символов, например: ü, i, ç, ş, ö

Для Xamarin-Android вы можете попробовать

string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
var path = Path.Combine(documentsPath, "Fonts/Arial.ttf");
person Burak    schedule 09.09.2020
comment
Привет, сэр, спасибо за ответ, но где мне найти папку wwwroot для xamarin android, я использовал несколько способов доступа к пути к моему файлу ttf, который находится в папке с моими ресурсами, но я продолжаю получать это исключение: System.IO. IOException: мой путь не найден как файл или ресурс. - person rana hd; 09.09.2020
comment
конечно, сэр, я постоянно меняю свой код, чтобы найти решение, но все пути, которые я использую, дают мне исключение, о котором я упоминал. `` PdfFont arab = PdfFontFactory.CreateFont (@C: \ Windows \ Fonts \ Arial.ttf); document2.SetFont (arab); `` я получаю его по пути внутри моей функции createfont - person rana hd; 09.09.2020
comment
да, сэр, я тоже пробовал это, я добавил его в свою папку с активами, но у меня такая же проблема - person rana hd; 09.09.2020
comment
к сожалению, я не смог это исправить :( Кажется, что среда хостинга предназначена для Интернета. Я пробовал следующее: string fn = "Arial.ttf"; string fp = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); string pc=System.IO.Path.Combine(fp,fn); PdfFont russian = PdfFontFactory.CreateFont(pc); но все тот же - person rana hd; 09.09.2020
comment
Пожалуйста, проверьте это одно stackoverflow.com/questions/41676173/ < / а> - person Burak; 09.09.2020
comment
Чтобы избежать долгой беседы в комментариях, я отредактировал свой ответ, пожалуйста, посмотрите на него, и если вы все еще получаете ошибку, поделитесь трассировкой стека ошибок, чтобы я мог посмотреть исключение. - person Burak; 09.09.2020
comment
хорошо, сэр, я попробую код, который вы упомянули, но как мне поделиться трассировкой стека ошибок - person rana hd; 09.09.2020
comment
он все еще там: System.IO.IOException: '/data/user/0/com.companyname.app36/files/fonts\ARIAL.TTF not found as file or resource.' это так обидно :( - person rana hd; 09.09.2020
comment
/fonts\ARIAL.TTF должен быть /fonts/ARIAL.TTF - person Burak; 09.09.2020
comment
да, заметил, поправил но все равно System.IO.IOException: '/data/user/0/com.companyname.app36/files/fonts/ARIAL.TTF not found as file or resource.' :( - person rana hd; 09.09.2020