Sağdan sola Arapça HTML'i işleme
Bir bakışta
“Bir bakışta” başlıklı bölümwriteHtml() ile sağdan sola (RTL) HTML’i PDF’e dönüştürün. CSS direction: rtl özelliğini ayarlayın ve Arapça destekli bir yazı tipi kaydedin. Motor, metni Unicode Çift Yönlü Algoritması (UAX #9) ile görsel sıraya göre yeniden dizer ve Arapça harfleri bağlamsal biçimlere göre şekillendirir. Bu tarifte küçük bir Arapça fatura işlenir. RTL; Arapça, İbranice, Farsça ve Urduca için geçerlidir. İbranice yeniden sıralanır, ancak şekillendirilmez; bu, söz konusu yazı sistemi için doğru davranıştır.
Kurulum
“Kurulum” başlıklı bölümcomposer require nextpdf/coreAyrıca Arapça destekli bir TrueType veya OpenType yazı tipine ihtiyacınız vardır. Karakter eşlemesinin Arapça Presentation Forms-B bloğunu kapsaması gerekir. Noto Naskh Arabic ve Amiri uygun, açık lisanslı yazı tipi seçenekleridir.
Kavramsal genel bakış
“Kavramsal genel bakış” başlıklı bölümRTL işleme iki girdi gerektirir: CSS direction: rtl özelliği ve kayıtlı bir Arapça yazı tipi.
direction: rtl, yerleşim motoruna metni sağdan sola yerleştirmesini söyler. Ardından motor, görsel sırayı çözümlemek için Unicode Çift Yönlü Algoritması’nı (UAX #9) kullanır. Karışık içerik doğru biçimde sıralanır: Latin sözcükler, Arapça sözcükler ve rakamlar kendi yönlerini korur. Arapça metinden sonra gelen bir sayı, rakamlarının soldan sağa sırasını korur.
Arapça bitişik yazılan bir yazı sistemidir; bu nedenle her harf, komşularına bağlı olarak farklı bir glif kullanır. Motor, her harf için başlangıç, orta, son veya yalın biçimi seçer ve Lam-Alef bitişik harfini uygular. Bu bağlamsal şekillendirme için, karakter eşlemesi Arapça Presentation Forms-B bloğunu kapsayan bir yazı tipi gerekir. Standart 14 yüz dahil olmak üzere, yalnızca Latin destekleyen bir yazı tipi Arapça çizemez.
Tabloda her hücre kendi içinde yeniden sıralanır ve şekillendirilir; hücreler başlangıç kenarına, yani direction: rtl altında sağ kenara hizalanır. Mantıksal text-align değerleri start ve end, yöne göre çözümlenir; dolayısıyla start, RTL içerik için sağ kenara karşılık gelir.
Yönü CSS direction özelliğiyle ayarlayın. HTML dir özniteliği bu özelliğe eşlenmez. Mevcut uygulama sınırları için RTL — mevcut sınırlamalar bölümüne bakın.
API yüzeyi
“API yüzeyi” başlıklı bölüm| Sembol | Konum | Rol |
|---|---|---|
Document::writeHtml(string $html): static | NextPDF\Core\Concerns\HasTextOutput | HTML parçasını geçerli imleç konumunda işler. |
FontRegistry::register(string $fontFile, string $alias = '', int $fontIndex = 0): FontInfo | NextPDF\Typography\FontRegistry | Arapça yazı tipi yüzünü bir takma ad altında kaydeder. |
DocumentFactory::create(): Document | NextPDF\Core\DocumentFactory | Doldurulmuş kayıt defterinizi kullanan bir belge oluşturur. |
Örnek şu CSS özelliklerini kullanır: direction, font-family, text-align. Kayıtlı yazı tipine, CSS font-family içinde kayıt defteri takma adını kullanarak başvurun.
Kod örneği — hızlı başlangıç
“Kod örneği — hızlı başlangıç” başlıklı bölüm<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;use NextPDF\Typography\FontRegistry;
$fontRegistry = new FontRegistry();$fontRegistry->register(__DIR__ . '/NotoNaskhArabic-Regular.ttf', alias: 'ArabicFont');
$documentFactory = new DocumentFactory($fontRegistry, new ImageRegistry(maxCacheBytes: 0));$doc = $documentFactory->create();$doc->addPage();
$doc->writeHtml( '<div style="direction: rtl; font-family: \'ArabicFont\';">' . '<h1>فاتورة</h1>' . '<p>المبلغ الإجمالي 380.00</p>' . '</div>');
$doc->save(__DIR__ . '/rtl-arabic.pdf');Başlık sağdan sola işlenir; 380.00 rakamları ise Arapça cümle içinde soldan sağa kalır.
Kod örneği — üretim
“Kod örneği — üretim” başlıklı bölümBu bağımsız örnek, bir Arapça fatura tablosunu işler. Her hücre direction: rtl değerini ve kayıtlı Arapça yazı tipini taşır; böylece motor her satırı yeniden sıralar ve şekillendirir, ardından hücreleri sağ kenara hizalar.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;use NextPDF\Typography\FontRegistry;
// Supply an Arabic-capable face whose cmap covers Arabic Presentation Forms-B.// Embed only fonts you are licensed to embed.$fontPath = __DIR__ . '/NotoNaskhArabic-Regular.ttf';if (!is_file($fontPath)) { fwrite(STDERR, "Arabic font not found at {$fontPath}\n"); exit(1);}
$fontRegistry = new FontRegistry();$fontRegistry->register($fontPath, alias: 'ArabicFont');
$documentFactory = new DocumentFactory($fontRegistry, new ImageRegistry(maxCacheBytes: 0));$doc = $documentFactory->create();$doc->setTitle('Arabic invoice');$doc->addPage();
$html = <<<'HTML'<div style="direction: rtl; font-family: 'ArabicFont'; font-size: 12pt;"> <h1>فاتورة</h1> <table style="width: 100%; border-collapse: collapse;"> <tr> <th style="border: 1px solid #333; padding: 6px;">الوصف</th> <th style="border: 1px solid #333; padding: 6px;">المبلغ</th> </tr> <tr> <td style="border: 1px solid #333; padding: 6px;">خدمات استشارية</td> <td style="border: 1px solid #333; padding: 6px;">380.00</td> </tr> <tr> <td style="border: 1px solid #333; padding: 6px;">الإجمالي</td> <td style="border: 1px solid #333; padding: 6px;">380.00</td> </tr> </table></div>HTML;
$doc->writeHtml($html);
$out = getenv('NEXTPDF_OUT');$doc->save($out !== false ? $out : __DIR__ . '/render-rtl-arabic-html.pdf');
echo "Wrote the Arabic invoice PDF\n";Sınır durumları ve tuzaklar
“Sınır durumları ve tuzaklar” başlıklı bölüm- Yazı tipini belgeyi oluşturmadan önce kaydedin.
Document::createStandalone()kendi kayıt defterini oluşturur ve başka bir yerde kaydettiğiniz bir yazı tipi yüzünü göremez. Her iki örnekte de olduğu gibi, kayıt defterinizin kullanılması için belgeyiDocumentFactoryüzerinden oluşturun. - CSS
font-familydeğerini kayıt defteri takma adıyla eşleştirin.register(..., alias: 'ArabicFont')çağrısına ilettiğiniz ad, CSS’te başvurduğunuz addır. - HTML
dirözniteliğini değil, CSSdirectionözelliğini kullanın. Yerleşimi yalnızca CSS özelliği etkiler. - Arapça metinden sonra gelen bir sayı soldan sağa kalır. Bu, UAX #9’u izler: Arapça bir harften sonra gelen bir Avrupa sayısı bir Arapça sayıya çözümlenir ve rakamlarının sırasını korur; dolayısıyla
380.00tersine çevrilmez.
RTL — mevcut sınırlamalar
“RTL — mevcut sınırlamalar” başlıklı bölümMevcut uygulama RTL metni yeniden sıralayıp şekillendirir ve tablo hücrelerini hizalar. Aşağıdaki sınırlar geçerliliğini korur. Her biri için gelecekte satır başına bir satır içi biçimlendirme satır kutusu gerekir:
- Tablolar dışında blok ve satır içi hizalama. Tablo hücreleri dışındaki blok düzeyi ve satır içi metin yeniden sıralanır ve şekillendirilir, ancak başlangıç (sol) kenardan işlenir. Tablo dışı metnin sağa veya ortaya hizalanması ve
text-align: justifydağıtımı henüz uygulanmamıştır. Tablo hücreleri hizalanır. - HTML
dirözniteliğidirectionözelliğine eşlenmez. Yönü CSSdirectionözelliğiyle ayarlayın. - Çift yönlü çözümleme metin dizisi bazında yapılır. Nötr karakterler, aynı satırdaki bir
<b>öğesinin yanındaki bir<span>gibi iki satır içi öğe arasında çözümlenmez. - Dar Arapça sütunlar mantıksal metin üzerinden ölçülür. Satır sonları mantıksal, şekillendirme öncesi metin üzerinden ölçülür; dolayısıyla çok dar bir Arapça sütun, bir satırı biraz erken veya geç kesebilir.
- Şekillendirilmiş Arapça için Presentation Forms-B kapsamı gerekir. Yazı tipi yüzünün Arapça Presentation Forms-B bloğunu kapsaması gerekir. Yalnızca OpenType GSUB ikamesine dayanan yazı tipleri ile HarfBuzz şekillendirme yolu gelecekteki çalışmanın kapsamındadır. Arapça olmayan bir yazı tipi Arapça çizemez.
Performans
“Performans” başlıklı bölümİşleme, glif sayısıyla doğrusal olarak ölçeklenir. Çift yönlü yeniden sıralama ve bağlamsal şekillendirme her satırda çalışır ve soldan sağa metne kıyasla küçük bir sabit çarpan ekler. Bu tarif için bütçe wall_ms: 1500, peak_mb: 64 şeklindedir.
Güvenlik notları
“Güvenlik notları” başlıklı bölümÇıktı boyutunu sınırlı tutmak için kullanıcı tarafından sağlanan dizelerin uzunluğunu doğrulayın. Motor metni işler, yorumlamaz ve hiçbir betik çalıştırmaz. Bir yazı tipini uzaktaki bir @font-face kaynağı üzerinden yüklerseniz, getirme işlemini güvenli dış kaynak ilkesi yönetir; öngörülebilir çıktı için yerel bir yazı tipi dosyasını tercih edin.
Uygunluk
“Uygunluk” başlıklı bölüm| İfade | Belirtim | Madde | reference_id |
|---|---|---|---|
| Görsel sıra, karakter dizilerini en yüksek düzeyden en düşük tek düzeye doğru tersine çevirerek üretilir. | Unicode UAX #9 | §3.3.6 Rule L2 (uax9#3.3.6.p13) | 814977a77019d728dc562a612098a82dc260f6844f5998eca5fe7a3baf3394af |
| Arapça bir harften sonra gelen bir Avrupa sayısı bir Arapça sayıya çözümlenir; dolayısıyla rakamlarının soldan sağa sırasını korur. | Unicode UAX #9 | §3.3.4 Rule W2 (uax9#3.3.4.p9) | 5747405357772797d62b3f4ba79328557fa0c4273a1dd5ffa8d996f24c78e120 |
Arapça bağlamsal şekillendirme (başlangıç, orta, son ve yalın biçimler ile Lam-Alef bitişik harfi), test demeti tarafından kapsanan doğrulanmış bir motor yeteneğidir; ayrı bir uygunluk iddiası değildir. Karakter eşlemesi Arapça Presentation Forms-B bloğunu kapsayan bir yazı tipi gerektirir.
Ticari bağlam
“Ticari bağlam” başlıklı bölümUygulanamaz.
Ayrıca bkz.
“Ayrıca bkz.” başlıklı bölüm- HTML: HTML+CSS’ten PDF’e işleme alt sistemi —
writeHtml()motoru ve RTL desteği. - Tipografi: yazı tipi kayıt defteri, alt kümeleme, CMap, kodlama, BiDi — UAX #9’u çözümleyen çift yönlü motor.
- Yazı tipi ve yazı sistemi destek matrisi — her yazı tipi sınıfının hangi yazı sistemlerini işleyebileceği.
- HTML’i PDF sayfası olarak işleme — soldan sağa başlangıç noktası.