Tehnični članek

Upodabljanje prelivov PDF v Delphi: Osni in radialni

PDF, katerega glava vsebuje prelivno ozadje v slogu Worda ali Excela, se je pri upodabljanju v sliko pogosto vrnil s praznim belim pravokotnikom na mestu, kjer bi morala biti mešanica barv. Upodabljalnik strani HotPDF zdaj upošteva operator PDF sh (senčenje) za osna senčenja tipa 2 in radialna senčenja tipa 3: ovrednoti funkcijo senčenja vzdolž osi preliva in naslika mešanico, medtem ko so prejšnje različice tiho opustile ta operator in pustile območje belo kot papir. Vključena sta oba tipa senčenja, ki pokrivata skoraj vsak preliv pisarniških dokumentov; mrežni tipi niso vključeni, in ta članek pošteno opisuje, kje leži ta meja

Zakaj se preliv PDF upodobi kot belo polje?

Preliv PDF je vektorska konstrukcija in ne bitna slika, ki jo upodabljalnik lahko neposredno prekopira. Slovar senčenja (ISO 32000-1 §8.7.4.5) opisuje geometrijo — os ali par krogov v polju Coords — ter barvno funkcijo, operator sh pa naslika to senčenje čez trenutno območje izreza, kar je enak grafični model, kot ga HotPDF izpostavi, ko rišete poti in polnila na platno strani. Upodabljalnik strani HotPDF prehodi tok vsebine operator za operatorjem in kateri koli operator, za katerega nima poti v kodi, preskoči, tako da se preostanek strani še vedno upodobi. Pred različico v2.335.0 je sh živel v tem preskočenem naboru: preliv glave ali celotne strani ni prispeval ničesar k izhodu, zato je ozadje prosevalo kot belo. Datoteka ni bila nikoli poškodovana. Upodabljalnik preprosto ni imel rokovalnika za ta operator, in belo polje je natanko to, kako je videti manjkajoč rokovalnik

Veriga vrednotenja funkcij za senčenjem

Senčenja ni mogoče naslikati, dokler se ne ovrednoti njegova funkcija, zato je moralo to kolesje prispeti najprej. Osna senčenja tipa 2 in radialna senčenja tipa 3 nosita /Function, ki preslika parametrični položaj vzdolž preliva v barvo (ISO 32000-1 §7.10), HotPDF-jev vrednotilnik funkcij pa razreši FunctionType in ga odpremi. Eksponencialna interpolacija tipa 2 (§7.10.3) izračuna C0 + t^N * (C1 - C0) z vpenjanjem Domain in Range; vzorčne funkcije tipa 0 (§7.10.2) berejo mrežo 8-, 16- ali 32-bitnih vzorcev in izberejo najbližjega prek mape Encode, kar je podrobno obravnavano v našem pregledu vzorčenih iskanj barv tipa 0; šivane funkcije tipa 3 (§7.10.4) izberejo podfunkcijo s poljem Bounds in se rekurzivno spuščajo vanjo. Kalkulatorske funkcije PostScript tipa 4 (§7.10.5) se ne vrednotijo — dostojno se degradirajo v neuspelo vrednotenje in ne v napačno barvo, kar se ujema s konservativno politiko, ki jo HotPDF ubira čez pot upodabljanja. Ta vrednotilnik je bil izdan v različici v2.334.0, eno izdajo pred samim operatorjem, saj je slikar senčenja dober le toliko, kolikor je dobra funkcija pod njim

Kako HotPDF spremeni neprekinjen preliv v slikovne pike?

HotPDF približno oceni neprekinjeno mešanico s končnim zaporedjem pasov enotnih barv. Slikar senčenja prehodi os preliva, jo razdeli na do 64 pasov — manj, ko je os kratka v slikovnih pikah naprave —, ovrednoti funkcijo na parametričnem položaju vsakega pasu in napolni pravokotnik, pravokoten na os, z enotnim čopičem. Kompromis je število pasov nasproti gladkosti: več pasov natančneje sledi mešanici, vendar stane več polnjenj, in 64 je namerna zgornja meja. Ker se število spreminja tudi z dolžino osi v slikovnih pikah naprave, je ločljivost pomembna. Upodabljanje iste strani pri višji ločljivosti DPI podaljša os, zato kratek preliv pridobi pasove in se njegovi trakovi zmehčajo, dokler se ne doseže zgornja meja

Upodabljanje senčene strani v bitno sliko

Javna vstopna točka je nespremenjena: RenderLoadedPageToBitmap vzeme 0-indeksiran indeks strani in vrednost DPI, vrne 24-bitno bitno sliko v lasti klicatelja in ob neuspehu vrne nil, namesto da bi sprožil izjemo, tako da je podpora za senčenje pregledna za kodo, ki jo déjà imate. Stran, ki je včasih izrisala svojo prelivno glavo prazno, zdaj vrne enako bitno sliko z naslikano mešanico, za pridobitev tega pa ni potrebna nobena sprememba API. Ena stvar, ki jo je vredno zapomniti, je lastništvo: klicatelj sprosti vrnjeno bitno sliko. Celoten cevovod upodabljanja — tolmačenje toka vsebine, vgrajeni glifi in predpomnjenje strani — je zajet v vodniku za upodabljanje strani PDF v bitno sliko v Delphi

var
  Pdf: THotPDF;
  Bmp: TBitmap;
begin
  Pdf := THotPDF.Create(nil);
  try
    if Pdf.LoadFromFile('quarterly-report.pdf') > 0 then
    begin
      // Page 1 (zero-based) at 150 DPI. A gradient-filled header that
      // used to come back blank now carries its color blend.
      Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
      if Assigned(Bmp) then
      try
        Bmp.SaveToFile('page1.bmp');
      finally
        Bmp.Free;
      end;
    end;
  finally
    Pdf.Free;
  end;
end;

Poceni zaščita pred regresijo izhaja iz istega klica. Upodobite stran, vzorčite slikovno piko, kjer leži pas preliva, in potrdite, da to ni več bela barva papirja, na katero se je upodabljalnik včasih vrnil — enovrstično preverjanje, ki ujame tiho vrnitev k staremu no-op vedenju

Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
  // True when the sh operator painted; False if the region fell back to white.
  HeaderPainted := Bmp.Canvas.Pixels[Bmp.Width div 2, 8] <> clWhite;
finally
  Bmp.Free;
end;

Česar HotPDF ne slika: mrežna senčenja in robovi izreza

Štirje tipi mrežnega senčenja so izven obsega in razvijalec bi moral to vedeti že na začetku. Prostooblikovne trikotne mreže Gouraud (tip 4), mrežne oblike Gouraud (tip 5), krpe Coons (tip 6) in krpe tenzorskega produkta (tip 7), določene v ISO 32000-1 §8.7.4.5.5 do §8.7.4.5.8, se ne upodabljajo; stran, ki uporablja enega od njih, se še vedno izriše, le to območje ostane nespremenjeno. Dva nadaljnja robova je vredno odkrito zapisati. Pravokotniki pasov pokrivajo trak senčenja, namesto da bi bili izrezani natanko na trenutno pot izreza, zato se preliv, maskiran v zaobljeno ali nepravilno obliko, naslika kot njegov omejevalni trak, dokler natančen izrez območij ne prispe v poznejšem krogu. HotPDF prav tako predvideva, da je izhod funkcije RGB ali sivinski, zato se senčenje, ustvarjeno v CMYK ali eksotičnem barvnem prostoru, oceni približno in ne z barvnim upravljanjem. Za dokumente, ki jih večina ekip za Delphi in C++Builder dejansko obdeluje — poročila, račune, izpiske in predstavitve, izvožene v PDF —, osni in radialni prelivi pokrivajo skoraj vsak preliv, ki ga boste srečali, z mrežami bogate oblikovne dokaze pa je treba obravnavati kot predogled in ne kot dokaz

Upodabljalnik strani HotPDF, podpora za operator sh, opisana tukaj, in vrednotilnik funkcij tipa 0/2/3 pod njim so priloženi komponenti HotPDF Component za Delphi in C++Builder — domači knjižnici VCL brez zunanjih odvisnosti DLL, ki pokriva ustvarjanje PDF-jev, urejanje, ekstrakcijo besedila in upodabljanje strani v enem paketu