Pisma koja se pišu zdesna nalevo (RTL), kao što su arapski i hebrejski, ne ponašaju se kao latinični tekst kada ih upisujete u PDF, a razlika nije samo u smeru u kom se kreću oči čitaoca. U arapskom jeziku slova menjaju oblik u zavisnosti od njihove pozicije u reči, kurzivno spajanje je obavezno, a neki parovi karaktera se spajaju u jedinstvene glifove (ligature). Jednostavno obrtanje redosleda karaktera u stringu proizvodi nečitljivu zbrku izolovanih slova. Ispravno renderovanje zahteva oblikovanje teksta (text shaping), proces koji analizira string i zamenjuje sirove Unicode karaktere glifovima specifičnim za kontekst koje pismo zahteva. HotPDF upravlja ovim oblikovanjem i rasporedom smera kroz namenske RTL metode, ali dobijanje čistog izlaza zahteva usklađivanje izbora fontova i skupova karaktera od samog početka.
RTL metode crtanja: RtLTextOut
Standardna metoda TextOut podrazumeva redosled čitanja sleva nadesno i ne vrši oblikovanje. Za tekst zdesna nalevo morate koristiti RtLTextOut. Ova metoda poziva HotPDF-ov motor za oblikovanje da bi razrešio ligature, odredio ispravne kontekstualne oblike za arapska slova i rasporedio glifove zdesna nalevo.
Kod u nastavku renderuje i hebrejski i arapski string na jednoj stranici, prikazujući potrebno podešavanje.
procedure DrawRTLText(Pdf: THotPDF; const FileName: string);
begin
Pdf.FileName := FileName;
Pdf.FontEmbedding := True; // absolute requirement for custom scripts
Pdf.BeginDoc;
// 1. Hebrew Setup
// Charset parameter is HEBREW_CHARSET (177)
Pdf.CurrentPage.SetFont('Arial', [], 12, 177);
// X=500 is the right-align starting point where text begins growing left
Pdf.CurrentPage.RtLTextOut(500, 750, 0, 'שלום עולם');
// 2. Arabic Setup
// Charset parameter is ARABIC_CHARSET (178)
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 12, 178);
Pdf.CurrentPage.RtLTextOut(500, 710, 0, 'مرحبا بالعالم');
Pdf.EndDoc;
end;
Obratite pažnju na parametre koordinata u RtLTextOut. Baš kao i kod standardnog TextOut-a, koordinate se mere u tačkama od donjeg levog ugla stranice. Međutim, X koordinata (500 u ovom primeru) deluje kao desna margina odakle tekst zdesna nalevo počinje; tekst raste nalevo od te tačke.
Skupovi karaktera i ugradnja fontova
Tri konfiguracije moraju biti usklađene da bi RtLTextOut dao ispravan izlaz. Prva je izbor skupa karaktera (character set). Windows definiše specifične charset konstante za ova pisma: HEBREW_CHARSET (177) i ARABIC_CHARSET (178). Prosleđivanje ispravnog skupa karaktera metodi SetFont govori sistemu koju kodnu stranicu da koristi prilikom razrešavanja glifova fonta. Iako DEFAULT_CHARSET radi za jednostavne zapadne višestruke stranice, namenski RTL rasporedi bi trebalo da navedu tačan skup karaktera kako bi se sprečilo da Windows ubaci nekompatibilni zamenski font.
Drugi zahtev je učitavanje Unicode fonta. Standardni Windows TrueType fontovi često dele svoje glifove. Da bi se renderovao arapski, datoteka fonta koju ugrađujete mora sadržati blokove prezentacionih oblika arapskog jezika (Arabic Presentation Forms-A i Forms-B). Ako font ne sadrži ove glifove, motor za oblikovanje ne može zameniti karaktere, pa će izlaz sadržati prazne kvadrate ili upitnike. Arial i Times New Roman sadrže ove blokove, ali mnogi prilagođeni korporativni fontovi ne.
Treći zahtev je FontEmbedding. Morate podesiti FontEmbedding := True pre poziva BeginDoc, kao što je objašnjeno u vodiču za Hello World. Ugradnja garantuje da specifični Unicode font koji sadrži RTL glifove putuje zajedno sa PDF-om, obezbeđujući da se renderuje identično na računarima koji nemaju instaliran taj font.
Dvosmerni tekst i interpunkcija
Stvarni dokumenti su retko čist arapski ili čist hebrejski; često mešaju RTL tekst sa latiničnim imenima, brojevima ili znakovima interpunkcije. To je dvosmerni (BiDi) tekst. Standardni znaci interpunkcije (kao što su tačke, zarezi i zagrade) nemaju fiksni smer; njihova pozicija zavisi od okolnih karaktera.
Kada se rečenica završava tačkom, postavljanje te tačke na kraj vaše Delphi string konstante renderovaće je na levoj strani stranice u RTL bloku. To je ispravan redosled čitanja, iako u vašem izvornom kodu izgleda obrnuto. Ako pomešate latinične reči u RTL string, BiDi algoritam mora odrediti gde dolazi do promene smera. Za složene BiDi rasporede koji sadrže ugneždene smerne blokove, trebalo bi da segmentišete tekst i napravite odvojene pozive RtLTextOut i TextOut kako biste eksplicitno pozicionirali svaki blok, umesto da se oslanjate na rezoluciju jednog stringa.
Metode RtLTextOut, SetFont i opcije za ugradnju fontova prikazane ovde deo su standardnog HotPDF Component API-ja za Delphi i C++Builder.