HTML işlem hattı
Spec: CSS Cascade 5, §6.1 CSS Cascade 5 §6.1 Spec: CSS Display 3, §2 CSS Display 3 §2 Evidence: Code-backed
Bir bakışta
“Bir bakışta” başlıklı bölümNextPDF, HTML ve CSS içeriğini PHP sürecinizin içinde PDF’ye işler: varsayılan olarak tarayıcı ve alt süreç yoktur. Bu sayfa, dönüştürmenin geçtiği katmanlı aşamaları, CSS motorunun gerçekte neleri kapsadığını ve gerçek bir tarayıcı işleyicisine devretmenin ne zaman doğru seçim olduğunu açıklar.
Bunun neden önemli olduğu
“Bunun neden önemli olduğu” başlıklı bölüm“HTML’den PDF’ye” tek bir işlem gibi görünür. Oysa işin içinde basamaklama, kutu modeli, yerleşim geçişi ve boyama geçişi vardır. Her biri, kendine özgü hata biçimleri bulunan, iyi tanımlanmış bir problemdir. Bunları tek bir yordamda toplayan motor kırılgan olur. Renk ayrıştırmasındaki bir değişiklik bir kutuyu yerinden oynatabilir; bunu anlamanın tek yolu da çıktıyı işleyip bakmaktır.
Süreç içi modelin somut bir avantajı vardır: kurulacak tarayıcı, işletilecek sanal alan veya veri aktarılacak bir süreç sınırı yoktur. Ancak bu avantaj, dönüştürme her bir sorumluluğun ayrı ayrı sınanabileceği kadar temiz biçimde ayrıştırıldığında değer kazanır. “HTML’yi PHP içinde işlemeyi” yalnızca mümkün değil, aynı zamanda güvenilir kılan şey mimaridir.
Kısa özet
“Kısa özet” başlıklı bölüm- HTML/CSS dönüştürmesi süreç içinde,
writeHtml()aracılığıyla çalışır. Sonuç, bir sayfa görüntüsü değil, yerel PDF içeriğidir. - Bu, tek geçişli ve akışlıdır. Belirteçleyici sıralı bir belirteç listesi üretir. Ayrıştırıcı bu listeyi soldan sağa tüketir; tam bir DOM ağacı tutulmaz (ADR-001). Kesin üst sınırlar öğe sayısını ve iç içe geçme derinliğini sınırlar.
- Motor açık katmanlar olarak düzenlenmiştir: CSS ayrıştırma ve uygulayıcılar, biçem durumu, yerleşim ve biçimlendirme, boyama ve sayfalı ortam — her katmanın ne yapabileceğine ilişkin katı kurallarla (ADR-010).
- CSS motoru, basamaklamayı, kutu modelini ve yaygın yerleşim biçimlerini (blok, satır içi, tablolar, kayan öğeler ve daha fazlası) kapsar — kapsam kayda değerdir, ancak modern bir tarayıcının uyguladıklarının tanımlı bir alt kümesidir.
- Rastgele modern CSS için tam tarayıcı doğruluğuna ihtiyaç duyduğunuzda NextPDF, isteğe bağlı bir uzantı aracılığıyla başsız bir tarayıcı işleyicisine devredebilir — bu varsayılan yol değil, kasıtlı ve ağdan yalıtılmış bir ektir.
NextPDF buna nasıl yaklaşır
“NextPDF buna nasıl yaklaşır” başlıklı bölümDönüştürme, her biri bir önceki aşamanın türlenmiş çıktısını tüketen aşamalar dizisidir.
- Tokenize HTML becomes an ordered token list — no retained DOM tree.
- Resolve CSS Parse styles; the cascade and applicators compute typed values.
- Style state A push/pop style stack carries computed values per nesting level.
- Layout Block, inline, table, and float geometry computed; no paint here.
- Paint Borders, backgrounds, text, and decorations emit PDF operators.
- Paged media Page-break and @page rules applied as the cursor crosses page bounds.
İki mimari kural, bunu basit bir akıştan daha fazlasına dönüştürür.
Katmanların sözleşmeleri vardır. CSS metni yalnızca uygulayıcı sınıflarında okunur. Yerleşim kodu geometriyi hesaplar, ancak hiçbir boyama işleci yaymaz. Boyama kodu, değiştirilebilir yerleşim izleme durumunu değil, değişmez bir hesaplanmış biçem anlık görüntüsünü okur. Sayfalı ortam kodu bölmeleri tetikler, ancak sayfa süslemesini boyama katmanına devreder. Bu sınırlar zorunlu kılınır (ADR-010). Bu yüzden yeni bir CSS özelliği; ayrıştırıcı, yerleşim sevki ve boyayıcı boyunca aynı anda yayılan bir değişiklik değil, yeni bir uygulayıcıdır.
DOM yoktur. İşlem hattı tasarım gereği tek geçişli ve akışlıdır (ADR-001): her öğe için bir nesne yerine, her iç içe geçme düzeyi için en fazla bir biçem durumu ve etkin imleç tutulur. Birkaç işlem gerçekten ileri bakış gerektirir — tablo sütun boyutlandırması, :has(), :last-child. Bunlar, bir ağaç tutularak değil, düz belirteç listesi üzerinde sınırlı ön tarama dizin yapılarıyla ele alınır. Öğe sayısı ve iç içe geçme derinliği kesin sınırlarla kısıtlanmıştır; böylece patolojik bir girdi belleği tüketmek yerine hızla başarısız olur.
CSS motoru, CSS’e benzeyen bir şeyi değil, gerçek CSS anlambilimini çözümler. Çekişen bildirimler köken, önem, katman, özgüllük ve sıraya göre her özellik için tek bir değere indirgenir — gerçek basamaklama budur. Yerleşim, kutu modelini izler. Bir kutunun türü ve oluşturduğu biçimlendirme bağlamı, hem kendisinin hem de akış içindeki kardeşlerinin nasıl yerleştirileceğini belirler. Motorun kaynak kodu tam olarak bu sorumluluklar etrafında düzenlenmiştir (basamaklama, box/display, flex, kayan öğeler, tablolar, parçalama). Bu yüzden davranışını deneysel olarak keşfetmek yerine belirtimler üzerinden akıl yürütebilirsiniz.
Kanıtlar ne diyor
“Kanıtlar ne diyor” başlıklı bölümBu sayfa Evidence: Code-backed niteliğindedir. Aşamalar ve kurallar core deposundaki karşılıklarıyla izlenebilir:
- Süreç içi giriş noktası,
writeHtml(string $html): staticmetodudur; bu metotsrc/Core/Concerns/HasTextOutput.phpdosyasında yer alır. - Öğe ve iç içe geçme sınırlarına sahip, tek geçişli ve DOM tutmayan tasarımın karşılığı ADR-001 ve
src/Html/içindeki tokenizer/parser/style-stack kodudur. - Katmanlı motor sözleşmesi — CSS parsing/applicators, biçem durumu, yerleşim, boyama, sayfalı ortam — ADR-010’da tanımlıdır ve
src/Html/düzenine yansır (örneğinCascade/,Css/,Flex/,Float/,Fragmentation/ve uygulayıcı sınıfları). - Tarayıcı devretme eki, aynı dosyadaki
writeHtmlChrome()metodudur; isteğe bağlı işleyici uzantısı ile bir Chrome/Chromium ikili dosyası gerektirdiği belgelenmiştir.
Standartlar, kapsam iddiasına dürüst bir temel sağlar. Basamaklama, çekişen bildirimleri her özellik için tek bir değere indirger — köken, önem, katman, özgüllük ve sıra — şu kaynağa göre: Spec: CSS Cascade 5, §6.1 CSS Cascade 5 §6.1 , akış içi yerleştirme ise şu kaynağa göre kutu ve biçimlendirme bağlamı kurallarını izler: Spec: CSS Display 3, §2 CSS Display 3 §2 . Aynı ölçüde önemli olan sınır şudur: bir özellik sorgusunun varlığı, her işlemcinin her özelliği desteklemediğini gösterir; şu kaynağa göre: Spec: CSS Conditional 5, §2 CSS Conditional 5 §2 . NextPDF’in CSS motoru, tanımlı ve belirtime uyumlu bir alt kümedir; bunu açıkça belirtmek de sözleşmenin bir parçasıdır.
Uygulamalı örnek
“Uygulamalı örnek” başlıklı bölümSüreç içi işleme tek çağrıyla yapılır. Çıktı, taranmış bir sayfa değil, seçilebilir PDF metnidir:
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();$doc->setTitle('HTML Basic');$doc->addPage();
$html = <<<'HTML'<h1 style="color: #1E3A8A;">HTML Rendering in NextPDF</h1><p>NextPDF renders <strong>HTML and CSS</strong> directly into PDF pages,<em>in-process</em>.</p><ul> <li>Headings, paragraphs, bold and italic</li> <li>Lists, tables, inline styles</li></ul>HTML;
$doc->writeHtml($html);$doc->save(__DIR__ . '/html-basic.pdf');Aynı belge tam tarayıcı doğruluğunda rastgele modern CSS gerektirseydi, çağrı bunun yerine writeHtmlChrome($html) olurdu — aynı belge, farklı işleme yolu ve isteğe bağlı tarayıcı işleyicisine kasıtlı bir bağımlılık.
Yaygın yanlış kanı
“Yaygın yanlış kanı” başlıklı bölümTekrarlayan yanlış kanı, HTML’den PDF’ye dönüştürme motorunun “temelde bir tarayıcı” olduğudur. Değildir ve öyle olduğunu da iddia etmez. Bir tarayıcı, tüm web platformunun geniş kapsamlı ve sürekli güncellenen bir uygulamasıdır. NextPDF’in süreç içi motoru, belge yerleşimine odaklanan, belirtime uyumlu bir alt kümedir. Dürüst zihinsel model “PHP içinde Chrome” değil, “yetkin bir baskı belgesi CSS motoru”dur. Gerçekten tüm platforma ihtiyaç duyduğunuzda, writeHtmlChrome() bunun içindir. Sessiz bir geri dönüş değil, kendi işletimsel ayak izine sahip, ayrı ve isteğe bağlı bir yoldur.
İkinci yanlış kanı, tarayıcı yolunun yalnızca “sayfayı ağ üzerinden işle” anlamına geldiğini varsaymaktır. Tasarım gereği bunun tam tersidir. Devretme eki her zaman alt kaynaklara ağ erişimi engellenmiş olarak işler — uzak görüntü, yazı tipi, biçem sayfası veya çerçeve yoktur — bu nedenle giden istek vektörü hâline gelemez. Piksel doğruluğu, evet; açık ağ çıkışı, hayır.
Sınırlamalar ve sınırlar
“Sınırlamalar ve sınırlar” başlıklı bölümBu sayfa, işlem hattının yapısını ve süreç içi / tarayıcı seçimini açıklar. Bir CSS destek matrisi değildir. Süreç içi motorun hangi özellikleri, modülleri ve seçicileri tam olarak kapsadığı, bu genel bakışla değil, kodun kendisi ve uyumluluk testleriyle tanımlanır. Bu kapsam zamanla gelişir. Tarayıcı devretme yolu, isteğe bağlı bir uzantı ve bir Chrome/Chromium ikili dosyası gerektirir. Uzantının kurulumu, işletimsel özellikleri ve iç düzeni burada kapsam dışıdır; ilgili paketle birlikte belgelenir. “Süreç içi”, varsayılan writeHtml() yolunu tanımlar. Bu, her işleme yolunun bir alt süreçten kaçındığı iddiası değildir. Mimari iddialar, bu sayfanın gözden geçirme tarihi itibarıyla doğrudur. Yetkili kaynaklar core deposundaki src/Html/, ADR-001 ve ADR-010’dur.
Süreç içi CSS motoru bir Core yeteneğidir. Tarayıcı devretme eki, burada yalnızca yetenek düzeyinde belirtilen isteğe bağlı bir uzantıdır:
| Edition | Availability |
|---|---|
| Core | Core, süreç içi HTML/CSS motorunu (writeHtml) sağlar. |
| Pro | Tarayıcı devretme yolu, sürüm katmanından bağımsız, isteğe bağlı bir eklenti uzantısıdır. |
| Enterprise | Tarayıcı devretme yolu, sürüm katmanından bağımsız, isteğe bağlı bir eklenti uzantısıdır. |
İlgili belgeler
“İlgili belgeler” başlıklı bölüm- İşlem hattı modeli — HTML içerik yolunun genel belge akışındaki yerini açıklar.
- NextPDF ne zaman kullanılmamalı — tarayıcı yolunun veya başka bir aracın uygun olduğu durumlar dâhil, dürüst sınırları açıklar.
- Bütünleştirme karar kılavuzu — kendi durumunuz için süreç içi motor ile bir işleyici arasında seçim yapmanıza yardımcı olur.
Sözlük
“Sözlük” başlıklı bölüm- Süreç içi işleme — HTML/CSS içeriğini PHP süreci içinde, tarayıcı veya varsayılan alt süreç olmadan PDF’ye dönüştürme (
writeHtml()). - Tek geçişli / akışlı — tam bir DOM ağacı tutmadan bir belirteç akışını soldan sağa tüketme (ADR-001).
- Basamaklama — çekişen bildirimleri köken, önem, katman, özgüllük ve sıraya göre her özellik için tek bir değere indirgeyen CSS süreci.
- Biçimlendirme bağlamı — bir kutunun oluşturduğu ve akış içindeki içeriklerinin nasıl yerleştirileceğini yöneten yerleşim ortamı.
- Motor katman sözleşmesi — ayrıştırma, biçem, yerleşim, boyama ve sayfalı ortam katmanlarının her birinin ne yapabileceğini tanımlayan ve zorunlu kılan kural kümesi (ADR-010).
- Tarayıcı devretme eki — alt kaynaklara ağ erişimi engellenmiş bir başsız tarayıcı aracılığıyla işleyen, isteğe bağlı
writeHtmlChrome()yolu.