Arabisches RTL-HTML rendern
Auf einen Blick
Abschnitt betitelt „Auf einen Blick“Mit writeHtml() rendern Sie HTML mit Rechts-nach-links-Laufrichtung (RTL) als PDF. Setzen Sie die CSS-Eigenschaft direction: rtl und registrieren Sie eine arabischfähige Schriftart. Die Engine ordnet den Text mit dem Unicode-Bidirektionalalgorithmus (UAX #9) in die visuelle Reihenfolge um und formt arabische Buchstaben kontextabhängig. Dieses Rezept rendert eine kleine arabische Rechnung. RTL gilt für Arabisch, Hebräisch, Persisch und Urdu. Hebräisch wird umgeordnet, aber nicht geformt; für diese Schrift ist das korrekt.
Installation
Abschnitt betitelt „Installation“composer require nextpdf/coreAußerdem benötigen Sie eine arabischfähige TrueType- oder OpenType-Schriftart. Ihre Zeichentabelle muss den Block Arabic Presentation Forms-B abdecken. Noto Naskh Arabic und Amiri sind geeignete, offen lizenzierte Schriftschnitte.
Konzeptioneller Überblick
Abschnitt betitelt „Konzeptioneller Überblick“Für RTL-Rendering benötigen Sie zwei Eingaben: die CSS-Eigenschaft direction: rtl und eine registrierte arabische Schriftart.
direction: rtl weist das Layout an, Text von rechts nach links zu platzieren. Die Engine verwendet anschließend den Unicode-Bidirektionalalgorithmus (UAX #9), um die visuelle Reihenfolge aufzulösen. Gemischte Inhalte werden korrekt geordnet: lateinische Wörter, arabische Wörter und Ziffern behalten jeweils ihre eigene Laufrichtung. Eine Zahl, die auf arabischen Text folgt, behält ihre Ziffernreihenfolge von links nach rechts.
Arabisch ist eine verbundene Schrift: Jeder Buchstabe verwendet je nach Nachbarzeichen eine andere Glyphe. Die Engine wählt für jeden Buchstaben die Anfangs-, Mittel-, End- oder isolierte Form und wendet die Lam-Alef-Ligatur an. Diese kontextabhängige Formung erfordert eine Schriftart, deren Zeichentabelle den Block Arabic Presentation Forms-B abdeckt. Eine rein lateinische Schriftart einschließlich der Standard-14-Schriftschnitte kann Arabisch nicht darstellen.
In Tabellen wird jede Zelle separat umgeordnet und geformt; die Zellen werden an der Anfangskante ausgerichtet, unter direction: rtl also an der rechten Kante. Die logischen text-align-Werte start und end werden anhand der Laufrichtung aufgelöst, sodass start bei RTL-Inhalt auf die rechte Kante abgebildet wird.
Setzen Sie die Laufrichtung mit der CSS-Eigenschaft direction. Das HTML-Attribut dir wird nicht darauf abgebildet. Die aktuellen Implementierungsgrenzen finden Sie unter RTL — aktuelle Einschränkungen.
API-Oberfläche
Abschnitt betitelt „API-Oberfläche“| Symbol | Speicherort | Rolle |
|---|---|---|
Document::writeHtml(string $html): static | NextPDF\Core\Concerns\HasTextOutput | Rendert das HTML-Fragment an der aktuellen Cursorposition. |
FontRegistry::register(string $fontFile, string $alias = '', int $fontIndex = 0): FontInfo | NextPDF\Typography\FontRegistry | Registriert den arabischen Schriftschnitt unter einem Alias. |
DocumentFactory::create(): Document | NextPDF\Core\DocumentFactory | Erstellt ein Dokument, das Ihr gefülltes Register liest. |
Das Beispiel verwendet diese CSS-Eigenschaften: direction, font-family, text-align. Verweisen Sie in CSS über font-family mit dem Registeralias auf die registrierte Schriftart.
Codebeispiel — Schnellstart
Abschnitt betitelt „Codebeispiel — Schnellstart“<?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');Die Überschrift wird von rechts nach links gerendert, und die Ziffern 380.00 behalten im arabischen Satz ihre Reihenfolge von links nach rechts.
Codebeispiel — Produktion
Abschnitt betitelt „Codebeispiel — Produktion“Dieses eigenständige Beispiel rendert eine arabische Rechnungstabelle. Jede Zelle setzt direction: rtl und die registrierte arabische Schriftart, sodass die Engine jede Zeile umordnet und formt und die Zellen anschließend an der rechten Kante ausrichtet.
<?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";Sonderfälle & Fallstricke
Abschnitt betitelt „Sonderfälle & Fallstricke“- Registrieren Sie die Schriftart, bevor Sie das Dokument erstellen.
Document::createStandalone()erstellt ein eigenes Register und kann einen andernorts registrierten Schriftschnitt nicht sehen. Verwenden SieDocumentFactory, damit der Writer Ihr Register liest, wie in beiden Beispielen. - Achten Sie darauf, dass die CSS-
font-familydem Registeralias entspricht. Der Name, den Sie anregister(..., alias: 'ArabicFont')übergeben, ist der Name, auf den Sie in CSS verweisen. - Verwenden Sie CSS
direction, nicht das HTML-Attributdir. Nur die CSS-Eigenschaft schaltet das Layout um. - Eine Zahl nach arabischem Text bleibt von links nach rechts. Das folgt aus UAX #9: Eine europäische Zahl nach einem arabischen Buchstaben wird zu einer arabischen Zahl aufgelöst und behält ihre Ziffernreihenfolge, sodass
380.00nicht umgekehrt wird.
RTL — aktuelle Einschränkungen
Abschnitt betitelt „RTL — aktuelle Einschränkungen“Die aktuelle Implementierung ordnet RTL-Text um, formt ihn und richtet Tabellenzellen aus. Die folgenden Grenzen bestehen weiterhin. Für jede davon ist künftig eine zeilenweise Inline-Formatting-Linienbox erforderlich:
- Block- und Inline-Ausrichtung außerhalb von Tabellen. Text auf Blockebene und Inline-Text außerhalb von Tabellenzellen wird umgeordnet und geformt, jedoch von der Anfangskante (links) aus gerendert. Rechtsbündige oder zentrierte Ausrichtung von Text außerhalb von Tabellen sowie die Verteilung mit
text-align: justifywerden noch nicht angewendet. Tabellenzellen werden ausgerichtet. - Das HTML-Attribut
dirwird nicht aufdirectionabgebildet. Setzen Sie die Laufrichtung mit der CSS-Eigenschaftdirection. - Die bidirektionale Auflösung erfolgt pro Textlauf. Neutrale Zeichen werden nicht über zwei Inline-Elemente hinweg aufgelöst, zum Beispiel bei einem
<span>neben einem<b>in derselben Zeile. - Schmale arabische Spalten werden am logischen Text gemessen. Zeilenumbrüche werden vor der Formung anhand des logischen Texts berechnet, sodass eine sehr schmale arabische Spalte eine Zeile geringfügig zu früh oder zu spät umbrechen kann.
- Geformtes Arabisch benötigt Abdeckung durch Presentation Forms-B. Der Schriftschnitt muss den Block Arabic Presentation Forms-B abdecken. Unterstützung für Schriftarten, die sich nur auf OpenType-GSUB-Substitution stützen, und für den HarfBuzz-Formungspfad ist künftige Arbeit. Eine nichtarabische Schriftart kann Arabisch nicht darstellen.
Leistung
Abschnitt betitelt „Leistung“Das Rendering skaliert linear mit der Anzahl der Glyphen. Bidirektionale Umordnung und kontextabhängige Formung laufen pro Zeile und verursachen gegenüber LTR-Text einen kleinen konstanten Zusatzaufwand. Das Budget dieses Rezepts ist wall_ms: 1500, peak_mb: 64.
Sicherheitshinweise
Abschnitt betitelt „Sicherheitshinweise“Validieren Sie die Länge von Benutzern gelieferter Zeichenketten, um die Ausgabegröße zu begrenzen. Die Engine rendert Text, interpretiert ihn nicht und führt kein Skript aus. Wenn Sie eine Schriftart über eine entfernte @font-face-Quelle laden, steuert die Richtlinie für sichere externe Ressourcen den Abruf; bevorzugen Sie für vorhersehbare Ausgaben eine lokale Schriftdatei.
Konformität
Abschnitt betitelt „Konformität“| Aussage | Spezifikation | Klausel | reference_id |
|---|---|---|---|
| Die visuelle Reihenfolge entsteht, indem Zeichenläufe von der höchsten Ebene bis zur niedrigsten ungeraden Ebene umgekehrt werden. | Unicode UAX #9 | §3.3.6 Rule L2 (uax9#3.3.6.p13) | 814977a77019d728dc562a612098a82dc260f6844f5998eca5fe7a3baf3394af |
| Eine europäische Zahl nach einem arabischen Buchstaben wird zu einer arabischen Zahl aufgelöst, sodass ihre Ziffern die Reihenfolge von links nach rechts behalten. | Unicode UAX #9 | §3.3.4 Rule W2 (uax9#3.3.4.p9) | 5747405357772797d62b3f4ba79328557fa0c4273a1dd5ffa8d996f24c78e120 |
Die kontextabhängige arabische Formung (Anfangs-, Mittel-, End- und isolierte Formen sowie die Lam-Alef-Ligatur) ist eine verifizierte Engine-Fähigkeit, die von der Testsuite abgedeckt wird, und keine separate Konformitätsaussage. Sie erfordert eine Schriftart, deren Zeichentabelle den Block Arabic Presentation Forms-B abdeckt.
Kommerzieller Kontext
Abschnitt betitelt „Kommerzieller Kontext“Nicht zutreffend.
Siehe auch
Abschnitt betitelt „Siehe auch“- HTML: HTML+CSS-zu-PDF-Rendering-Subsystem — die
writeHtml()-Engine und ihre RTL-Unterstützung. - Typografie: Schriftartenregister, Subsetting, CMap, Kodierung, BiDi — die bidirektionale Engine, die UAX #9 auflöst.
- Matrix zur Schriftarten- und Schriftsystemunterstützung — welche Schriftsysteme jede Schriftartenklasse rendern kann.
- HTML in eine PDF-Seite rendern — der linksläufige Ausgangspunkt.