Başlığı Word veya Excel tarzı bir gradyan arka plan taşıyan bir PDF resme dönüştürüldüğünde, eskiden renk karışımının olması gereken yerde boş beyaz bir dikdörtgenle geri dönerdi. HotPDF'in sayfa işleyicisi artık Type 2 eksenel (axial) ve Type 3 radyal (radial) gradyanlar için PDF sh (gölgeleme) operatörünü onurlandırıyor: Gölgelemenin gradyan ekseni boyunca işlevini değerlendirir ve karışımı boyar; oysa önceki sürümler operatörü sessizce atlar ve bölgeyi kağıt beyazı bırakırdı. Neredeyse her ofis belgesi gradyanını kapsayan iki gölgeleme türü dahildir; ağ (mesh) türleri dahil değildir ve bu makale bu çizginin nereye düştüğü konusunda dürüsttür
Bir PDF gradyanı neden beyaz bir kutu olarak işlenir?
Bir PDF gradyanı, işleyicinin bit transferi (blit) yapabileceği bir bit eşlemi değil, vektörel bir yapıdır. Bir gölgeleme sözlüğü (ISO 32000-1 §8.7.4.5), geometriyi (Coords dizisindeki bir eksen veya bir çift daire) artı bir renk işlevini tanımlar ve sh operatörü bu gölgelemeyi geçerli kırpma bölgesi boyunca boyar; bu, bir sayfa tuvaline yollar ve dolgular çizdiğinizde HotPDF'in sunduğu grafik modelinin aynısıdır. HotPDF'in sayfa işleyicisi, içerik akışını operatör operatör yürütür ve kod yolu olmayan herhangi bir operatör atlanır, böylece sayfanın geri kalanı yine de işlenir. Sürüm 2.335.0'dan önce sh bu atlanan kümede yaşıyordu: Bir başlık veya tam sayfa gradyanı çıktıya hiçbir katkıda bulunmazdı, bu nedenle arka plan beyaz olarak görünürdü. Dosya hiçbir zaman bozuk değildi. İşleyicinin o tek operatör için bir işleyicisi yoktu ve beyaz bir kutu, eksik bir işleyicinin tam olarak neye benzediğidir
Gölgelemenin arkasındaki işlev değerlendirme zinciri
Bir gölgeleme, işlevi değerlendirilene kadar boyanamaz, bu nedenle o mekanizmanın önce gelmesi gerekiyordu. Type 2 eksenel ve Type 3 radyal gölgelemelerin her ikisi de, gradyan boyunca parametrik bir konumu bir renkle eşleyen bir /Function taşır (ISO 32000-1 §7.10) and HotPDF'in işlev değerlendiricisi FunctionType değerini çözümler ve ona göre dağıtır. Type 2 üstel enterpolasyon (§7.10.3), Domain ve Range sınırlaması ile C0 + t^N * (C1 - C0) hesaplar; Type 0 örneklenmiş işlevler (§7.10.2), 8, 16 veya 32 bitlik örneklerden oluşan bir ızgarayı okur ve Type 0 örneklenmiş renk aramaları incelememizde derinlemesine ele alınan Encode haritası aracılığıyla en yakınını seçer; Type 3 dikiş (stitching) işlevleri (§7.10.4), Bounds dizisine göre bir alt işlev seçer ve buna özyineleme yapar. Type 4 PostScript hesaplayıcı işlevleri (§7.10.5) değerlendirilmez; HotPDF'in işleme yolu boyunca benimsediği muhafazakar politikayla eşleşecek şekilde, yanlış bir renk yerine düzgün bir şekilde başarısız bir değerlendirmeye düşerler. Bu değerlendirici, operatörün kendisinden bir sürüm önce, sürüm 2.334.0'da gönderildi, çünkü gölgeleme boyayıcısı yalnızca altındaki işlev kadar iyidir
HotPDF sürekli bir gradyanı nasıl piksellere dönüştürür?
HotPDF, sürekli karışımı sonlu sayıda düz renk bandıyla yaklaşık olarak hesaplar. Gölgeleme boyayıcısı gradyan eksenini yürür, bunu 64 adede kadar banda böler (eksen cihaz piksellerinde kısa olduğunda daha az), işlevi her bandın parametrik konumunda değerlendirir ve düz bir fırça ile eksene dik bir dikdörtgeni doldurur. Buradaki denge, bant sayısının pürüzsüzlüğe karşı olmasıdır: Daha fazla bant karışımı daha yakından takip eder ancak daha fazla dolgu maliyeti getirir ve 64 kasıtlı olarak belirlenmiş tavan sınırdır. Sayı aynı zamanda cihaz piksellerindeki eksen uzunluğuyla da ölçeklendiğinden çözünürlük önemlidir. Aynı sayfayı daha yüksek bir DPI'da işlemek ekseni uzatır, bu nedenle kısa bir gradyan bant kazanır ve şeritleri tavana ulaşılana kadar yumuşar
// Gölgeleme ayrıştırıcısı, gradyan ekseni boyunca 64 adede kadar renk
// bandı kullanır, ancak hiçbir zaman eksenin cihaz piksellerindeki uzunluğundan fazla kullanmaz.
// Aynı sayfayı daha yüksek bir DPI'da işlemek o ekseni uzatır, bu nedenle kısa bir
// gradyan bant kazanır ve 64 bantlık tavan sınırına ulaşılana kadar bantlanma yumuşar.
Thumb := Pdf.RenderLoadedPageToBitmap(PageIndex, 96); // daha kaba bantlar
Proof := Pdf.RenderLoadedPageToBitmap(PageIndex, 300); // 64 banda kadar
Gölgelenmiş bir sayfayı bir bit eşlemine dönüştürme
Genel giriş noktası değişmedi: RenderLoadedPageToBitmap sıfır tabanlı bir sayfa dizini ve bir DPI değeri alır, çağıranın sahipliğinde 24 bitlik bir bit eşlemi döndürür ve hata durumunda istisna oluşturmak yerine nil döndürür, böylece gölgeleme desteği halihazırda sahip olduğunuz kod için şeffaftır. Eskiden gradyan başlığını boş olarak işleyen bir sayfa, artık karışım boyanmış olarak aynı bit eşlemini döndürür ve bunu elde etmek için hiçbir API değişikliği gerekmez. Unutulmaması gereken tek şey sahipliktir: Çağıran, döndürülen bit eşlemini serbest bırakır (free). İçerik akışı yorumlama, gömülü glifler ve sayfa önbelleğe alma dahil olmak üzere tam işleme süreç hattı, Delphi'de PDF sayfalarını bir bit eşlemine dönüştürme kılavuzunda ele alınmıştır
var
Pdf: THotPDF;
Bmp: TBitmap;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('quarterly-report.pdf') > 0 then
begin
// 150 DPI'da Sayfa 1 (sıfır tabanlı). Eskiden boş gelen gradyan dolgulu
// bir başlık artık renk karışımını taşıyor.
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
Bmp.SaveToFile('page1.bmp');
finally
Bmp.Free;
end;
end;
finally
Pdf.Free;
end;
end;
Aynı çağrıdan ucuz bir regresyon koruması ortaya çıkar. Sayfayı işleyin, gradyan bandının ait olduğu bir pikseli örnekleyin ve işleyicinin eskiden düştüğü kağıt beyazı olmadığını doğrulayın; bu, eski işlem yapılmayan (no-op) davranışa sessizce geri dönüşü yakalayan tek satırlık bir kontroldür
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
// sh operatörü boyandığında True; bölge beyaza düştüğünde False.
HeaderPainted := Bmp.Canvas.Pixels[Bmp.Width div 2, 8] <> clWhite;
finally
Bmp.Free;
end;
HotPDF'in boyamadığı şeyler: Ağ (mesh) gölgelemeleri ve kırpma kenarları
Dört ağ (mesh) gölgeleme türü kapsam dışıdır ve bir belgenin bunu önceden bilmesi gerekir. ISO 32000-1 §8.7.4.5.5 ila §8.7.4.5.8 arasında tanımlanan serbest biçimli Gouraud üçgen ağları (Type 4), kafes biçimli Gouraud ağları (Type 5), Coons yama ağları (Type 6) ve tensör çarpımlı yama ağları (Type 7) işlenmez; bunları kullanan bir sayfa yine de işlenir, sadece o bölge olduğu gibi bırakılır. İki sınırın daha açıkça belirtilmesi yararlıdır. Bant dikdörtgenleri, geçerli kırpma yoluna tam olarak kırpılmak yerine gölgelemenin şeridini kaplar, bu nedenle yuvarlak veya düzensiz bir şekle maskelenmiş bir gradyan, sonraki turlarda hassas bölge kırpma gelene kadar sınırlayıcı şeridi olarak boyanır. HotPDF ayrıca işlev çıktısının RGB veya gri tonlama olduğunu varsayar, bu nedenle CMYK veya egzotik bir renk alanında yazılmış bir gölgeleme renk yönetimi yapılmak yerine yaklaşılarak hesaplanır. Çoğu Delphi ve C++Builder ekibinin fiilen işlediği belgeler için (PDF'e aktarılan raporlar, faturalar, ekstreler ve slayt sunumları) eksenel ve radyal, karşılaşacağınız hemen hemen her gradyanı kapsar ve ağ ağırlıklı tasarım provaları, bir provadan ziyade önizleme olarak ele alınması gereken durumlardır
HotPDF'in sayfa işleyicisi, burada açıklanan sh operatör desteği ve altındaki Type 0/2/3 işlev değerlendiricisi, PDF oluşturma, düzenleme, metin çıkarma ve sayfa işlemeyi tek bir pakette kapsayan, harici DLL bağımlılığı olmayan yerel bir VCL kütüphanesi olan Delphi ve C++Builder için HotPDF Bileşeni'nin bir parçası olarak gönderilir