Pro sürüm
Webview
Bir bakışta
“Bir bakışta” başlıklı bölümWebview, bir linearized (Fast Web View) PDF’yi HTTP üzerinden sunar; böylece bir istemci, dosyanın geri kalanı hâlâ yoldayken küçük bir öncü önekten sayfa 1’i oluşturmaya başlayabilir. Ham baytları bir LinearizedDocument olarak sarar, Range isteklerini bir PSR-7 ByteRangeResponder aracılığıyla RFC 9110 kısmi içerik yanıtlarıyla yanıtlar ve ilk sayfanın önek içinde kendi kendine yeterli olduğunu (FirstPageProber aracılığıyla) kanıtlayabilir.
Kullanılabilirlik ve lisanslama
“Kullanılabilirlik ve lisanslama” başlıklı bölümBu yetenek NextPDF Pro (nextpdf/pro) içinde gelir ve bir Pro katmanı lisans zarfıyla etkinleşir. Bu yetkiye sahip olmayan bir dağıtım, yeteneğin sınıflarını yüklemez. Sürümleri karşılaştırın ve bir lisans edinin.
Ayrı bir özellik başına lisans bayrağı yoktur. Yanıtlayıcı, çalışma zamanında kendi PSR-17 fabrikalarınıza bağlanır — bir ResponseFactoryInterface ve bir StreamFactoryInterface — ve medya türü, bir lisans anahtarı değil, bir yapıcı argümanı olarak varsayılan application/pdf’dir.
Yükleme
“Yükleme” başlıklı bölümcomposer require nextpdf/proKod, NextPDF\Pro\Webview ad alanı altında yer alır.
Kavramsal genel bakış
“Kavramsal genel bakış” başlıklı bölümBir linearized PDF, belgenin ilk sayfası — linearization parametre sözlüğü, birincil ipucu akışı ve sayfa 1’in nesneleri — /E kaymasında biten bir öncü bölümde duracak şekilde yerleştirilir. Webview, bu yerleşimi aşamalı teslime dönüştürür.
LinearizedDocument::fromBytes(), baytları Core’un okuma tarafı LinearizationView’i aracılığıyla ayrıştırır (Pro, linearization ayrıştırmayı asla yeniden uygulamaz) ve kullanılabilir bir linearized belge olmayan her şeyi reddeder: hiç linearized olmayan, gerçek bayt uzunluğuyla eşleşmeyen bildirilen bir /L uzunluğu veya dosyanın içinde pozitif bir kayma olmayan bir /E ilk-sayfa-sonu kayması. Bu nedenle yapım toplamdır — bir LinearizedDocument tuttuğunuz anda, açığa çıkardığı her kayma güvenilirdir.
ByteRangeResponder ardından bir HTTP isteğini yanıtlar. Yalnızca PSR-7 / PSR-17’ye karşı uygulanmıştır, hiçbir çerçeve bağlantısı yoktur. Her zaman Accept-Ranges: bytes ve güçlü, deterministik bir SHA-256 ETag ilan eder, istemcinin Range başlığını RFC 9110 §14 uyarınca ayrıştırır ve şunlardan birini döndürür: tam bir 200 OK, bir 206 Partial Content tek aralığı, birkaç aralık için bir 206 multipart/byteranges yanıtı veya bir 416 Range Not Satisfiable.
FirstPageProber, yapısal kanıt tarafıdır: ilk-sayfa önekini, bu önekin tüm dosyanın temsil ettiği kesri ve birincil ipucu akışının tamamen içinde olup olmadığını niceler — bir okuyucunun sayfa-1 nesnelerini yalnızca önekten bulmasına olanak tanıyan özellik.
Neden bu şekilde çalışır
“Neden bu şekilde çalışır” başlıklı bölümWebview, linearization’ı asla kendisi yeniden ayrıştırmaz. Core’un okuma tarafı LinearizationView’ini ödünç alır; böylece teslim katmanı, ikinci, kayan bir kopya yerine denetlenmiş tek bir ayrıştırıcıyı devralır. Yapım kasıtlı olarak toplamdır. LinearizedDocument::fromBytes(), hatalı biçimlendirilmiş bir yerleşimi önden reddeder; böylece bir Range yanıtının güvendiği her kayma önce doğrulanmıştır. Yanıtlayıcı yalnızca PSR-7 ve PSR-17 konuşur; böylece aynı kod, herhangi bir HTTP yığınından bir linearized PDF sunar. Aşamalı aralık teslimini güvenilmez istemcilere yüksek hacimde açmayı güvenli kılan şey, bu disiplindir.
Tasarım arka planı: Yüksek hacimli belge üretimi.
Aşamalı bayt aralığı sunumu nasıl çalışır
“Aşamalı bayt aralığı sunumu nasıl çalışır” başlıklı bölüm- Oluşturulan PDF baytlarından bir
LinearizedDocumentoluşturun. Geçersiz girdi, önden birUnsupportedDocumentExceptionoluşturur. - Belgeyi ve gelen PSR-7
ServerRequestInterface’iByteRangeResponder::respond()’a verin. Yanıtlayıcı,Range(ve isteğe bağlıIf-Rangeön koşulu) okur ve doğru PSR-7ResponseInterface’i üretir. - İstemci, önce öncü öneki ister (veya siz onu
firstPageResponse()ile gönderirsiniz), sayfa 1’i oluşturur, ardından kullanıcı kaydırdıkça kalan aralıkları ister.
Bayt aralığı modeli, RFC 9110 §14.1.2 uyarınca kapsayıcı kaymalar kullanır: bir ByteRange, contentLength boyutunda bir temsil üzerinde firstByte–lastByte’tır ve Content-Range alanı bytes first-last/length’tir.
Davranış sözleşmesi
“Davranış sözleşmesi” başlıklı bölümLinearizedDocument::fromBytes()toplamdır: linearized olmayan bir belge, bir/Luyumsuzluğu veya pozitif olmayan / dosya dışı bir/Ekaymasının her biri, güvensiz bir belge üretmek yerine birUnsupportedDocumentExceptionoluşturur.ETag, tam baytlar üzerinde güçlü bir SHA-256 varlık etiketidir ve yapımda bir kez belleğe alınır. Aynı oluşturma girdisi, aynı baytları ve dolayısıyla aynıETag’i verir; böylece önbellekler veIf-Rangeöngörülebilir davranır.- Uygulanabilir bir
Rangeolmayan bir istek, tam gövdeyle200 OKdöndürür. Geçerli güçlüETagile eşleşmeyen birIf-Range,Range’in yok sayılmasına ve tam bir200’ün döndürülmesine neden olur (RFC 9110 §13.1.5).If-Range’in yalnızca güçlü varlık etiketi biçimi onurlandırılır; bir HTTP-tarihliIf-Range, bir uyumsuzluk olarak değerlendirilir. - Tanınmayan bir aralık birimi veya söz dizimsel olarak geçersiz bir
Rangeyok sayılır ve tam bir200döndürülür (RFC 9110 §14.2). - Karşılanabilir bir aralık,
Content-Rangeile206 Partial Contentdöndürür; birden çok karşılanabilir aralık,206multipart/byterangesdöndürür. Hiçbiri karşılanamayan geçerli bayt aralıkları,Content-Range: bytes */lengthile416döndürür (RFC 9110 §15.3.7). firstPageResponse(), tam olarak ilk sayfanın bayt aralığı[0, /E - 1]’i taşıyan bir206yayar — “tam indirmeden önce ilk sayfa”nın sunucu-iletme biçimi.
Kod örneği — Hızlı başlangıç
“Kod örneği — Hızlı başlangıç” başlıklı bölümAşağıdaki, belgelenmiş genel API’yi yansıtır. Depo, bu modül için çalıştırılabilir bir örnek sunmaz.
use NextPDF\Pro\Webview\LinearizedDocument;use NextPDF\Pro\Webview\ByteRangeResponder;
$document = LinearizedDocument::fromBytes($pdfBytes);$responder = new ByteRangeResponder($responseFactory, $streamFactory);
$response = $responder->respond($document, $request);Kod örneği — İlk sayfa iletme ve sondalama
“Kod örneği — İlk sayfa iletme ve sondalama” başlıklı bölümuse NextPDF\Pro\Webview\LinearizedDocument;use NextPDF\Pro\Webview\ByteRangeResponder;use NextPDF\Pro\Webview\FirstPageProber;use NextPDF\Pro\Webview\Exception\UnsupportedDocumentException;
try { $document = LinearizedDocument::fromBytes($pdfBytes);} catch (UnsupportedDocumentException $e) { // Not a usable linearized document — fall back to plain full delivery. // ... return;}
$prober = new FirstPageProber($document);if ($prober->isFirstPageSelfContained()) { // Push exactly the first page's bytes for an instant render. $response = (new ByteRangeResponder($responseFactory, $streamFactory)) ->firstPageResponse($document);}Uç durumlar ve dikkat edilecekler
“Uç durumlar ve dikkat edilecekler” başlıklı bölüm- Webview, gerçekten linearized bir PDF gerektirir. Oluşturulan belge linearized değilse, oluşturma zamanında linearization’ı etkinleştirin veya onu düz tam teslimle sunun — yalnızca aralık desteğine ihtiyacınız olduğunda, ilk-sayfa anlam bilgisine değil,
respondToBytes()yine de keyfi (linearized olmayan) baytlar üzerinde aralıklara hizmet edebilir. - Artımlı güncellemeler önemlidir: bildirilen
/L’sinin ötesine eklenen bir belge, bir uzunluk uyumsuzluğu olarak reddedilir, çünkü bayt aralığı kaymaları artık güvenilir olmazdı. - Yanıtlayıcı, istek başına onurlandırdığı farklı aralık sayısını sınırlar. Üst sınırdan daha fazla birleştirilmiş aralık veya tüm temsilden daha fazla toplam bayt isteyen bir isteğin
Range’i yok sayılır ve ona tam bir200sunulur.
Performans
“Performans” başlıklı bölümİlk-sayfa öneki, dosya uzunluğuna sıkıştırılmış /E ilk-sayfa-sonu kaymasıdır; böylece FirstPageProber::prefixFraction(), ilk getirmenin tüm dosyaya göre ne kadar küçük olduğunu bildirir — çok sayfalı bir belge için bu, Fast Web View’in tüm amacıdır. Yanıt oluşturma, bellek-içi bayt dizesini dilimler; maliyet, seçilen baytlarla orantılıdır. ETag, belge başına bir kez hesaplanır. Temsili belgelerle ölçün.
Güvenlik notları
“Güvenlik notları” başlıklı bölümGirdiyi güvenilmez olarak değerlendirin. LinearizedDocument::fromBytes(), herhangi bir kayma kullanılmadan önce linearization değişmezlerini doğrular. Yanıtlayıcı; başlık enjeksiyonunu önlemek için denetim karakterleri içeren bir contentType’ı reddeder, gövdenin içinde oluşmayacağı garanti edilen bir multipart sınırı türetir ve hizmet reddi saldırısının multipart aralık-yükseltme sınıfına karşı savunmak için örtüşen aralıkları birleştirir ve sayılarını ve toplam boyutlarını sınırlar (Apache HTTPD CVE-2011-3192). Bu modül hiçbir belge içeriğini günlüğe kaydetmez.
Uygunluk
“Uygunluk” başlıklı bölümBayt aralığı teslimi, RFC 9110’u (HTTP Semantics) izler — aralık istekleri için §14, If-Range için §13.1.5 ve 416 için §15.3.7. Linearized belge modeli, ISO 32000-2 Annex F tarafından açıklanan Fast Web View yerleşimidir. Modül, testleri tarafından doğrulanan davranışın ötesinde başka hiçbir harici kural tanımlayıcısı öne sürmez.
Enterprise sınır notu
“Enterprise sınır notu” başlıklı bölümEnterprise, Webview davranışını değiştirmez. Enterprise, ayrı olarak belgelenen daha üst katman uyumluluk ve arşivleme özellikleri ekler; bunlar bir linearized PDF’yi bayt aralıkları üzerinden sunmak için gerekli değildir.
Yayımlama sınırı
“Yayımlama sınırı” başlıklı bölümBu sayfa, yalnızca dışarıdan gözlemlenebilir davranışı ve desteklenen genel API yüzeyini belgeler. İç ad alanı yolları, yardımcı sınıflar, mekanizma tabloları, runbook dosya adları ve bilet önekleri kapsam dışıdır.