İçeriğe geç

Sağdan sola Arapça HTML'i işleme

writeHtml() 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.

Terminal window
composer require nextpdf/core

Ayrı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.

RTL 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.

SembolKonumRol
Document::writeHtml(string $html): staticNextPDF\Core\Concerns\HasTextOutputHTML parçasını geçerli imleç konumunda işler.
FontRegistry::register(string $fontFile, string $alias = '', int $fontIndex = 0): FontInfoNextPDF\Typography\FontRegistryArapça yazı tipi yüzünü bir takma ad altında kaydeder.
DocumentFactory::create(): DocumentNextPDF\Core\DocumentFactoryDoldurulmuş 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.

<?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.

Bu 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";
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";">
  • 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 belgeyi DocumentFactory üzerinden oluşturun.
  • CSS font-family değ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, CSS direction ö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.00 tersine çevrilmez.

Mevcut 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: justify dağıtımı henüz uygulanmamıştır. Tablo hücreleri hizalanır.
  • HTML dir özniteliği direction özelliğine eşlenmez. Yönü CSS direction ö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.

İş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.

Çı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.

İfadeBelirtimMaddereference_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.

Uygulanamaz.