İçeriğe geç

Artisan geliştirici kılavuzu

Artisan paketinin birbirine bağlı iki sorumluluğu vardır: Köprü Metni İşaretleme Dili (HTML) belgesini Chrome aracılığıyla işlemek ve ortaya çıkan Taşınabilir Belge Biçimi (PDF) sayfasını bir NextPDF belgesine içe aktarmak. Sorun giderirken Chrome, ayrıştırıcı ve içe aktarıcı sınırlarını ayrı tutun.

İşleyici tümleştirmeleri, uzun ömürlü çalışanlar, ayrıştırıcı tanılaması veya nextpdf/artisan için testler yazarken bu kılavuzu kullanın.

KatmanSahibiSorumlulukBuraya koymayın
UygulamaUygulamaHTML üretimini yetkilendirin ve işleyici yapılandırmasını seçin.Tarayıcı süreci yönetimi.
HTML ilkesiUygulama ve paketGüvensiz veya aşırı büyük HTML belgesini işlenmeden önce reddedin.Kiracı yetkilendirmesi veya iş kararları.
Chrome işleyicisinextpdf/artisanHTML belgesini Chrome tarafından üretilen bağımsız bir PDF olarak işleyin.Genel PDF onarımı veya rastgele PDF düzenleme.
Ayrıştırıcı/içe aktarıcınextpdf/artisanİşlenen PDF’yi ayrıştırın ve bir sayfayı form XObject olarak içe aktarın.Tam PDF uygunluğu doğrulaması.
Çekirdek motornextpdf/nextpdfİçe aktarılan form nesnelerini yerleştirin ve son belgeyi yazın.Chrome DevTools Protocol (CDP) yaşam döngüsü.
AşamaDavranışGeliştirici eylemi
Yapılandırma oluşturmaChromeRendererConfig ikili dosyayı, zaman aşımını, Basamaklı Stil Sayfaları (CSS) davranışını, giriş boyutunu ve korumalı alan davranışını tanımlar.Sabit kodlanmış çalışma zamanı tahminleri yerine ortama özgü yapılandırma kullanın.
İşleyici oluşturmaChromeHtmlRenderer bir BrowserPool nesnesini barındırır.İşleyiciyi bir çalışan içinde yeniden kullanın, ardından kapatma sırasında kapatın.
HTML doğrulamasıGüvenlik ilkesi boyutu denetler ve belgeyi varsayılan CSS ile sarmalar.Bu aşamadan önce çağıranın yetkilendirmesini doğrulayın.
Chrome yazdırmaCDP bağımsız bir PDF oluşturur.İncelenmiş bir ilke izin vermediği sürece dış kaynakları engellenmiş tutun.
PDF ayrıştırmaPdfReader::parse() xref verilerini, sayfaları, nesneleri, kaynakları ve düzeltmeleri okur.Hedefli tanılama yapmıyorsanız ayrıştırıcı hatalarını işleme hatası olarak değerlendirin.
Sayfa içe aktarmaPageImporter::import() sayfa içeriğini, ortam kutusunu, kaynakları ve gömülü nesneleri ayıklar.İş akışı bilinçli olarak başka bir sayfa seçmediği sürece 0 numaralı sayfayı içe aktarın.
YolAmaç
app/Pdf/Renderers/*Şu sınıf etrafındaki uygulama sarmalayıcısı: ChromeHtmlRenderer.
app/Pdf/Templates/*HTML şablonu işleme ve veri aktarım nesnesinden (DTO) görünüme eşleme.
app/Pdf/Policies/*HTML boyutu, kaynak ve kiracı işleme ilkesi.
tests/Pdf/Renderer/*Küçük HTML eşlemelerini kullanan işleyici duman testleri.
tests/Pdf/Parser/*İçe aktarılan Chrome çıktısı için ayrıştırıcı eşlemeleri.

Şablon işlemeyi tarayıcıda işlemeden ayrı tutun. İşleyiciye nihai HTML belgesini ve bilinen bir sayfa genişliğini geçirin.

<?php
use NextPDF\Artisan\ChromeHtmlRenderer;
use NextPDF\Artisan\ChromeRendererConfig;
use NextPDF\Artisan\PageImporter;
use NextPDF\Parser\PdfReader;
$renderer = new ChromeHtmlRenderer(new ChromeRendererConfig(
renderTimeout: 30,
maxHtmlSize: 1_000_000,
));
$result = $renderer->render($html, widthPt: 595.28);
$reader = new PdfReader($result->getPdfData());
$reader->parse();
$form = (new PageImporter())->import($reader);

Her çalışan süreci veya her istek kapsamı için bir işleyici oluşturun. Yinelenen Chrome başlatma maliyetinden kaçınmak için işleyiciyi yeniden kullanın. Çalışan kapatılırken süreç sızıntılarını önlemek için işleyiciyi açıkça kapatın.

<?php
final class InvoiceChromeRenderer
{
public function __construct(
private readonly ChromeHtmlRenderer $renderer,
) {}
public function renderInvoice(string $html): string
{
return $this->renderer
->render($html, widthPt: 595.28)
->getPdfData();
}
public function close(): void
{
$this->renderer->close();
}
}

Chrome çıktısı içe aktarılamadığında ayrıştırıcı uygulama programlama arabirimlerini (API’ler) kullanın. Tanılamayı salt okunur tutun ve başarılı bir içe aktarmadan sonra ayrıştırıcı durumunu değiştirmekten kaçının.

Tanılama sorusuKullanılacak APIBeklenen sinyal
Dosya ayrıştırılabiliyor mu?PdfReader::parse()Geçersiz PDF yapısında bir özel durum oluşturur.
Sayfa 0 var mı?PdfReader::getPage(0)Bir PdfObject döndürür.
İçerik var mı?PdfReader::getPageContentStream($page)Boş olmayan içerik akışı.
Kaynaklar mevcut mu?PdfReader::getPageResources($page)Kaynak sözlüğü dizisi.
Artımlı düzeltmeler var mı?PdfReader::getRevisionCount()Birden büyük bir sayı.
Hangi nesne başarısız oldu?PdfTokenizer::getOffset() ve ayrıştırıcı özel durum bağlamı.Eşlemeyi küçültmek için bayt uzaklığı.
Genişletme noktasıŞunun için kullanınKısıtlama
ChromeRendererConfig::fromArray()Çerçeve yapılandırması eşlemesi.Bilinmeyen veya yanlış türde isteğe bağlı değerler varsayılanlara geri döner.
HtmlSecurityPolicyInterfaceAyrıştırma katmanı için HTML ilkesi.Aktarım, süreç veya yetkilendirme denetimlerinin yerini almaz.
LoggerInterfaceİşleme ve tarayıcı tanılaması.HTML içeriğini varsayılan olarak günlüğe kaydetmeyin.
BrowserPoolUzun ömürlü Chrome sürecinin yeniden kullanımı.Çalışan kapatılırken kapatılmalıdır.
PageImporterAyrıştırılmış bir dış sayfayı gömme.Okuyucu önce ayrıştırılmalıdır.
Ayrıştırıcı sınıflarıTanılama ve içe aktarılan Chrome çıktısı.Genel amaçlı bir PDF onarım araç takımı değildir.
  1. HTML parçasını en küçük işleme testinde yeniden üretin.
  2. Doğrulayın: maxHtmlSize, varsayılan CSS ve Chrome ikili dosya yolu.
  3. Nokta cinsinden sabit bir genişlikle işleyin.
  4. Döndürülen PDF baytlarını PdfReader::parse() ile ayrıştırın.
  5. İş akışı bilinçli olarak başka bir sayfa seçmediği sürece 0 numaralı sayfayı içe aktarın.
  6. Her hatayı yeniden üreten en küçük HTML için eşleme testleri ekleyin.
  7. İşleyiciyi çalışan kapatma kancalarında kapatın.
HataNerede işlenmelidirÖnerilen yanıt
Chrome ikili dosyası eksikDağıtım denetimi ve işleyici oluşturma yolu.İşleme trafiğini kabul etmeden önce hazırlık denetimini başarısız sayın.
Aşırı büyük HTMLHTML ilkesi.Chrome’u başlatmadan önce reddedin.
Tarayıcı zaman aşımıİşleyici sınırı.İşlemeyi başarısız sayın; şablon adını, boyutunu, genişliğini ve zaman aşımını kaydedin.
Ayrıştırıcı hatasıİçe aktarma sınırı.İlke izin verdiğinde hata ayıklama için küçük, temizlenmiş bir eşleme depolayın.
Tarayıcı süreci sızıntısıÇalışan yaşam döngüsü.Kapatma sırasında kapatın ve denetimli işleme sayılarından sonra yeniden başlatın.
KonuVarsayılanNe zaman geçersiz kılınmalı
İşleme zaman aşımı30 saniye.Yalnızca ölçülmüş, sınırlı belgeler için artırın.
Maksimum HTML boyutu5,000,000 bayt.Genel uç noktalar için düşürün.
Korumalı alanEtkin.Yalnızca kapsayıcı kısıtlamaları gerektirdiğinde ve ana makine yalıtılmışken devre dışı bırakın.
YükseklikŞu koşulda otomatik: heightPt <= 0.Katı yerleşim sözleşmeleri için sabit yükseklik kullanın.
Dış kaynaklarİşleyici ilkesi tarafından engellendi.Yalnızca incelenmiş bir kaynak ilkesi aracılığıyla izin verin.
  • İşleme testleri temsili HTML ve CSS’yi kapsar.
  • Güvenlik testleri aşırı büyük HTML belgesini ve engellenen kaynak girişimlerini kapsar.
  • İçe aktarma testleri, döndürülen form nesnesinin içeriğe, ortam kutusuna ve kaynaklara sahip olduğunu doğrular.
  • Ayrıştırıcı testleri çapraz başvuru (xref) tablosu, xref akışı, nesne akışı ve hatalı biçimlendirilmiş eşleme durumlarını kapsar.
  • Çalışan testleri close() çağırır ve hiçbir tarayıcı sürecinin kalmadığını doğrular.
  • Performans testleri işleme süresini şablona ve içerik boyutuna göre kaydeder.