อนุญาตข้อความภาษาอาหรับในตาราง 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
ใช่ มันคืนค่าเท็จ ฉันเปลี่ยนเส้นทางแบบอักษรของฉันเป็น: 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 ใต้โฟลเดอร์แบบอักษร

เส้นทางสำหรับแบบอักษรคือ =› ../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
เพื่อหลีกเลี่ยงการสนทนาที่ยาวนานในความคิดเห็น ฉันได้แก้ไขคำตอบแล้ว โปรดดูคำตอบ และหากคุณยังคงได้รับข้อผิดพลาด โปรดแบ่งปันการติดตามสแต็กข้อผิดพลาด เพื่อให้ฉันสามารถดูข้อยกเว้นได้ - 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