İçeriğe geç
getnextpdf.com

Oluşturma ve G/Ç hataları

Bu girişler, HTML işlem hattı içeriği yerleştirirken, sayfalı-ortam çözümleyicisi sayfa geometrisi atarken, metin şekillendiricisi karmaşık betikleri işlerken, tipografi aşaması satırları keserken, yazıcı bir belgeyi serileştirirken, okuyucu mevcut bir PDF’i ayrıştırırken ve üst veri aşaması bir Genişletilebilir Üst Veri Platformu (XMP) paketini okurken fırlatılan oluşturma ve girdi/çıktı (G/Ç) istisnalarını kapsar.

Aşağıda iki temel hiyerarşi görünür ve bu fark, bir catch sonrasında hangi tanılama verisini okuyabileceğinizi belirler:

  • NextPdfException, ContextAwareExceptionInterface::getContext(): array yöntemini uygular. Temel uygulama boş bir dizi döndürür; bir alt sınıf, yalnızca getContext() yöntemini geçersiz kıldığında yapılandırılmış anahtarlar taşır. Onu geçersiz kılmayan alt sınıflar verilerini yine de public readonly özellikler üzerinden sunar.
  • Buradaki çeşitli sınıflar, doğrudan PHP’nin RuntimeException sınıfını genişletir. Bunlar bağlam farkında değildir ve bir getContext() yöntemleri yoktur; bunun yerine getMessage() çıktısını ve genel özelliklerini okuyun.

Her giriş, tam sınıfı, tetikleme koşulunu, taşıdığı bağlam anahtarlarını veya genel özellikleri ve kurtarma yolunu adlandırır.

  • Ne zaman fırlatılır. HTML yerleşim motoru, break-inside: avoid olarak işaretlenmiş içeriğin (kesme kısıtlaması Avoid olan bir tablo hücresi) ölçülen yüksekliği tek bir sayfanın kullanılabilir yüksekliğini aştığında bunu fırlatır. Motor, hem kesme-kaçınma kısıtlamasını hem de sayfa sınırını karşılayamaz; bu nedenle sessizce taşmak yerine başarısız olur.
  • Taşınan veri. NextPdfException sınıfını genişletir ancak getContext() yöntemini geçersiz kılmaz; bu nedenle getContext() boş bir dizi döndürür. Tanılama verisi public readonly özelliklerdedir: gridRow (int), gridCol (int), contentHeight (float, nokta) ve pageHeight (float, nokta). İleti, hücre koordinatlarını ve her iki yüksekliği adlandırır.
  • Çözüm. Hatalı hücredeki break-inside: avoid kısıtlamasını kaldırın, hücrenin içeriğini bir sayfaya sığacak şekilde azaltın ya da kullanılabilir yükseklik içeriği barındıracak şekilde sayfa boyutunu artırın veya kenar boşluklarını azaltın.
  • Ne zaman fırlatılır. Saklanan-kip yerleşim ilkelleri, mimari karar kaydı ADR-020’de tanımlanan dört kaynak-bütçesi katmanından biri aşıldığında ve çağıran, yumuşak yedek yerine sert bir başarısızlığı tercih ettiğinde bunu fırlatır. Varsayılan yol fırlatmaz: ContainerLayout::acceptChild() false döndürür, çağıran blok yerleşimine geri döner ve bir uyarı yayılır. İstisna, yapılandırma-zamanı doğrulaması ve tam ihlal demetini öne süren testler için ayrılmıştır. Katmanlar şunlardır: per-child (yakalanan bir alt akış üst sınırını aşar), per-container (Tier 1 düğüm-sayısı bütçesi), per-document (yerleşim-geçişi veya iç içe geçme-derinliği bütçesi) ve global (SDK geneli 256 MB tepe yerleşik-küme-boyutu tavanı).
  • Taşınan veri. getContext() yöntemini geçersiz kılar; bu, uygulama performansı izleme (APM) araçları tarafından tüketilen kararlı bir sekiz-anahtar biçimi döndürür: budgetTier, exceededValue, budgetLimit, containerType, phase, breachOrigin, captureSize ve processedItemCount. İlk dört anahtar özgün v1.0.0 alt kümesidir ve her zaman doldurulur; sonraki dördü, yapıcı bunlar olmadan çağrıldığında varsayılan olarak null ya da 0 olur. getCausalWarningCode(), (katman, konteyner-türü) demetini, yumuşak-yedek yolunun yayacağı WarningCode değerine eşler.
  • Çözüm. Bir yapılandırma ihlali için istenen değeri belgelenmiş zarfa geri düşürün (örneğin saklanan düğüm bütçesi, Config::withRetainedNodeBudget() aracılığıyla 5.000 ila 100.000 kabul eder). Bir içerik ihlali için konteyner iç içe geçmesini veya düğüm sayısını azaltın ya da sert-başarısızlık yüzeyini tercih etmek yerine blok yerleşimine varsayılan yumuşak-yedeğe güvenin.
  • Ne zaman fırlatılır. Sayfalı-ortam aşaması, bir belge adlandırılmış bir @page <ident> { … } kuralı bildirdiğinde (page: <ident> özelliği üzerinden içeriğe bağlı) bunu güvenli biçimde başarısız olarak fırlatır. CSS Paged Media Level 3 §3.4 ve Level 4 §3.2’den adlandırılmış sayfalar — :first, :left, :right ve :blank sözde sınıfları ile adlandırılmış size: ve rotate: geçersiz kılmaları dahil — ayrıştırılır ancak hiçbir üretim yerleşim yolu bunları tüketmez. Motor, kuralı atmanın üreteceği sessizce-yanlış varsayılan sayfalandırmayı yaymak yerine reddeder.
  • Taşınan veri. getContext() yöntemini geçersiz kılar; bu, page_names (hataya yol açan farklı kimlikler listesi, kaynak sırasına göre), has_size_override (boole), has_rotate_override (boole) ve has_pseudo_classes (boole) döndürür. Aynı değerler pageNames, hasSizeOverride, hasRotateOverride ve hasPseudoClasses genel özelliklerinde de sunulur.
  • Çözüm. Adlandırılmış @page <ident> kurallarını ve tüm page: <ident> bağlarını kaldırın ve amaçlanan geometriyi, desteklenen adsız @page { … } kuralı ve onun sözde sınıf biçimleri aracılığıyla ifade edin. Alternatif olarak, tam adlandırılmış-sayfa yerleşim desteğini getiren bir gelecek sürüme sabitleyin.
  • Ne zaman fırlatılır. Metin bölütlemesi, Unicode için Uluslararası Bileşenler (ICU) satır-kesme yineleyicisine ihtiyaç duyduğunda ancak ICU’yu zorunlu kılan ilke etkinken (NEXTPDF_REQUIRE_ICU=1) ve ext-intl uzantısı ile IntlBreakIterator kullanılamazken bunu fırlatır.
  • Taşınan veri. Doğrudan RuntimeException sınıfını genişletir; bu nedenle bağlam farkında değildir ve bir getContext() yöntemi yoktur. Aynı kod yolunun önceden fırlattığı genel istisnanın katı bir incelmesidir; bu nedenle mevcut catch (\RuntimeException) işleyicileri çalışmaya devam eder.
  • Çözüm. ICU kesme yineleyicisinin kullanılabilir olması için ext-intl yükleyip etkinleştirin ya da ICU’yu zorunlu kılan ilkenin zorunlu olmadığı yerde ICU olmayan bölütleyiciye geri dönmek için NEXTPDF_REQUIRE_ICU değerini kaldırın.
  • Ne zaman fırlatılır. Bu, betik-şekillendirme hizmet sağlayıcı arayüzü (SPI) için temel istisnadır. Bugün doğrudan fırlatılmaz; bunun yerine somut alt türler fırlatılır. Herhangi bir şekillendirme hatasını tek bir yerde işlemek için bu türü yakalayın.
  • Taşınan veri. Doğrudan RuntimeException sınıfını genişletir; bağlam farkında değildir, getContext() yoktur.
  • Çözüm. Somut alt türe göre dallanın. Geçerli sürümde gönderilen tek alt tür için aşağıdaki NotYetImplementedException girişine bakın.
  • Ne zaman fırlatılır. Her yer tutucu betik-şekillendiricisi, somut şekillendirmesi ertelenmiş betikler (Moğolca ve Tibetçe) için shape() gövdesinden bunu fırlatır. Şekillendirme SPI bağlantısı mimari olarak hazırdır ancak gerçek şekillendirme, ana dili konuşan biri tarafından doğrulanmış bir sınama düzeneği beklemektedir. Sessiz bir işlem-yok yerine bir istisna fırlatmak, etiketli erişilebilirlik öne süren bir PDF’e şekillendirilmemiş metin yaymaktansa, kazara üretim bağlantısını çalışma zamanında yüzeye çıkarır.
  • Taşınan veri. ScriptShaperException (ve dolayısıyla RuntimeException) sınıfını genişletir; bu nedenle bağlam farkında değildir ve bir getContext() yöntemi yoktur. Tanılama verisi public readonly özelliklerindedir: bcp47LanguageTag (çalıştırmanın BCP-47 etiketi, örneğin mn-Mong veya bo-Tibt) ve missingCapability (uygulamanın eksik olduğu somut yetenek). İleti her ikisini de içerir.
  • Çözüm. Uygulanmamış betiklerdeki çalıştırmaları üretimde şekillendiriciden geçirmeyin. Dil etiketini yukarı akışta algılayın ve ya farklı bir oluşturma yoluna geri dönün ya da etkilenen betik için şekillendirmeyi getiren bir gelecek sürüme sabitleyin.
  • Ne zaman fırlatılır. Yazıcı, bir belge, daha sonraki PDF sürümlerinde getirilen yapıları yasaklayan PDF 1.4 çıktı profili (ISO 19005-1:2005 / PDF/A-1) altında yasak bir özellik içerdiğinde bunu fırlatır.
  • Taşınan veri. NextPdfException sınıfını genişletir ancak getContext() yöntemini geçersiz kılmaz; bu nedenle getContext() boş bir dizi döndürür. Tanılama verisi public readonly özelliklerindedir: feature (reddedilen özellik adı), reason (neden yasak olduğu) ve isoClause (ISO hüküm başvurusu). İleti, üçünü de birleştirir.
  • Çözüm. Reddedilen özelliği kaldırın veya PDF 1.4 ile uyumlu bir eşdeğerle değiştirin ya da özelliğe izin veren daha yüksek bir çıktı profilini hedefleyin.
  • Ne zaman fırlatılır. Yazıcı, bir belge, katı PDF 2.0 çıktı profili altında yasak bir özellik içerdiğinde bunu fırlatır. ISO 32000-2:2020, PDF 1.7’nin hâlâ izin verdiği yapıları kullanımdan kaldırır — en başta, uyumlu bir PDF 2.0 belgesinde gömülmesi gereken Standart 14 Type 1 yazı tipleri (§9.6.2).
  • Taşınan veri. Pdf14FeatureRejectedException ile aynı biçim: NextPdfException sınıfını genişletir, getContext() yöntemini geçersiz kılmaz (boş bir dizi döndürür) ve feature, reason ile isoClause değerlerini public readonly özellikler olarak sunar.
  • Çözüm. Reddedilen özelliği düzeltin — örneğin base 14 yazı tiplerini gömün — ya da var olduğunda belgelenmiş çıkış kapısını kullanın (gömülü olmayan base 14 yazı tipleri için Document::allowNonEmbeddedBase14()).
  • Ne zaman fırlatılır. PdfWriter::build(), belgenin encryptionMode değeri pubkey (bir açık anahtar alıcı listesi) olduğunda, yazıcı tarafı açık-anahtar akış-gövdesi şifreleme yönlendirmesi bağlanmadan önce, giriş noktasında bunu fırlatır. Baştan reddetmek, çağıranın şifrelenmiş sandığı şifrelenmemiş bir PDF’i sessizce yaymayı önler.
  • Taşınan veri. Doğrudan RuntimeException sınıfını genişletir; bu nedenle bağlam farkında değildir ve bir getContext() yöntemi yoktur. Aynı sitenin önceden fırlattığı genel istisnanın katı bir incelmesidir; bu nedenle mevcut catch (\RuntimeException) işleyicileri çalışmaya devam eder.
  • Çözüm. Açık anahtar alıcı listesi yerine desteklenen bir şifreleme kipi (parola tabanlı şifreleme) kullanın ya da açık-anahtar şifreleme desteğini getiren bir sürüme sabitleyin. Bu fırlatıldığında çıktıyı şifrelenmiş olarak ele almayın.
  • Ne zaman fırlatılır. Nesne-grafiği okuyucusu, bir girdi PDF’i desteklenen zarfının dışına düştüğünde bunu güvenli biçimde başarısız olarak fırlatır. Okuyucu, klasik çapraz başvuru tablolarını (ISO 32000-2:2020 §7.5.4), çapraz başvuru akışlarını (§7.5.8), nesne-akışı-sıkıştırılmış nesneleri (§7.5.7), çok-revizyonlu /Prev zincirlerini (§7.5.6) ve /XRefStm aracılığıyla melez-başvuru dosyalarını (§7.5.8.4) destekler. Bu zarfın dışındaki herhangi bir şey, kısmi veya tahmin edilmiş bir ayrıştırma yerine bu istisnayı yüzeye çıkarır. Adlandırılmış yapıcılar, neden durumlarına eşlenir: encrypted(), damagedCrossReference(), cyclicReferenceChain(), nonConformantObjectStream(), irresolvableObjectCollision(), truncatedFile() ve crossReferenceOffsetOutOfBounds().
  • Taşınan veri. Doğrudan RuntimeException sınıfını genişletir; bu nedenle bağlam farkında değildir ve bir getContext() yöntemi yoktur. Çağıranların iletiyi ayrıştırmadan kesin kategoriye göre dallanması için UnsupportedPdfStructureReason türünde (bir enum) public readonly bir reason özelliği sunar; isteğe bağlı bir detail dizesi ve bir previous fırlatılabilir nesnesi sınırlı, hassas-olmayan bağlam ekleyebilir. Varsayılan ileti, nedenin sızdırmayan özetidir.
  • Çözüm. reason değerine göre dallanın. EncryptedDocument için, şifre çözme okuyucunun kapsamı dışında olduğundan, okumadan önce bir şifre çözme adımı çalıştırın. DamagedCrossReference, TruncatedFile ya da CrossReferenceOffsetOutOfBounds için dosyayı hatalı veya eksik olarak ele alın ve kaynağı yeniden edinin ya da onarın. CyclicReferenceChain, NonConformantObjectStream ya da IrresolvableObjectCollision için girdi, yapısal modeli ihlal eder ve olduğu gibi okunamaz.
  • Ne zaman fırlatılır. Akışlı XMP üst veri okuyucusu, gömülü bir XMP paketi yapılandırılmış bayt tavanını aştığında bunu fırlatır. Varlık-genişletme ve ikinci dereceden-patlama tarzı girdilere karşı savunmacı bir korumadır (gigabayt ölçeğindeki gömülü XMP’ye karşı 128 MB tepe tavanı).
  • Taşınan veri. NextPdfException sınıfını genişletir ancak getContext() yöntemini geçersiz kılmaz; bu nedenle getContext() boş bir dizi döndürür. Tanılama verisi public readonly özelliklerindedir: byteCount (gözlemlenen bayt sayısı) ve cap (bayt cinsinden yapılandırılmış üst sınır). İleti, her ikisini de bildirir.
  • Çözüm. Aşırı büyük üst veriyi kötü amaçlı veya hatalı olarak reddedin ya da atlayın. Meşru bir belge gerçekten daha büyük bir pakete ihtiyaç duyuyorsa, korumanın önlemek için var olduğu bellek-tükenmesi riskini tartarak yapılandırılmış üst sınırı bilerek yükseltin.