HotPDF randează o pagină PDF încărcată printr-un singur punct de intrare, RenderLoadedPageToDevice, iar dispozitivul pe care i-l dați decide dacă rezultatul este un bitmap, un desen pe un context de dispozitiv extern precum o canavă de imprimantă, sau un metafișier vectorial îmbogățit. Setați RenderOverprintPreview la True iar același apel simulează overprint CMYK cu cerneluri de proces, astfel încât un operator vede pe ecran interacțiunea cernelurilor care altfel ar apărea doar pe foaia de tipar
Aceste două funcționalități rezolvă probleme diferite care se întâmplă să se întâlnească în aceeași cale de cod. Abstractizarea de dispozitiv elimină ramura în care previzualizarea, tipărirea și exportul aveau fiecare propriul apel de randare cu propria derive. Probarea overprint elimină clasa de erori de producție în care un document arată corect în orice vizualizator și iese de pe tipar greșit
De ce se tipărește o pagină diferit de cum se previzualizează?
Pentru că overprint este o instrucțiune către dispozitivul de imagistică, nu o operațiune de pictură. Când o pagină setează /OP sau /op true în starea grafică, îi spune RIP-ului să nu decupeze cernelurile de dedesubt — un obiect cyan desenat peste galben lasă galbenul la locul său, iar foaia arată verde. Un vizualizator care ignoră overprint decupează normal și arată cyan. Niciunul nu este greșit în proprii termeni, iar asta este exact problema: ecranul și tiparul nu sunt de acord, iar nimeni nu află până când probele nu se întorc
RenderOverprintPreview face HotPDF să ia în serios instrucțiunea pentru vopselurile DeviceCMYK guvernate de /OP, /op și /OPM 1. Rezultatul este o previzualizare de probă, nu una de vizualizator: negrul care face overprint peste o nuanță rămâne o suprapunere bogată în loc să spargă o gaură, iar overprint-ul accidental al unui designer pe text alb devine vizibil ca textul dispărut care va deveni
var
Pdf: THotPDF;
Device: THPDFBitmapRenderDevice;
Proof: TBitmap;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.LoadFromFile('cover-cmyk.pdf');
Pdf.RenderOverprintPreview := True; // proof, not plain preview
Device := THPDFBitmapRenderDevice.Create;
try
if Pdf.RenderLoadedPageToDevice(0, 150, Device) then
begin
Proof := Device.TakeBitmap; // ownership moves to the caller
try
Image1.Picture.Assign(Proof);
finally
Proof.Free;
end;
end;
finally
Device.Free;
end;
finally
Pdf.Free;
end;
end;
Setarea participă la identitatea cache-ului de randare, în memorie și pe disc, astfel încât o previzualizare normală și una de probă nu partajează niciodată un bitmap. Comutarea proprietății nu vă cere să invalidați nimic manual — un cache care ar returna-o pe cea greșită dintre cele două ar fi mai rău decât niciun cache
Trei dispozitive, un singur apel de randare
THPDFRenderDevice este o clasă abstractă cu doi membri care contează: Kind, care raportează ținta ca rdkBitmap, rdkDeviceContext sau rdkEnhancedMetafile, și Execute, pe care îl apelează biblioteca. Trei dispozitive concrete sunt livrate cu HotPDF, iar fiecare își deține ieșirea diferit
THPDFBitmapRenderDevice deține un TBitmap până când TakeBitmap transferă proprietatea către dumneavoastră. THPDFDeviceContextRenderDevice ia un HDC existent plus lățime și înălțime și desenează direct în el, modul în care randați pe o canavă de imprimantă fără un drum dus-întors printr-un bitmap. THPDFMetafileRenderDevice deține un TMetafile până când TakeMetafile îl transferă, ceea ce păstrează conținutul vectorial ca vectori pentru consumatorii care au nevoie de asta
var
Device: THPDFDeviceContextRenderDevice;
begin
Printer.BeginDoc;
try
Device := THPDFDeviceContextRenderDevice.Create(
Printer.Canvas.Handle, Printer.PageWidth, Printer.PageHeight);
try
Pdf.RenderLoadedPageToDevice(PageIndex, 300, Device);
finally
Device.Free;
end;
finally
Printer.EndDoc;
end;
end;
Citirea Kind în loc de testarea clasei runtime este intenționată. Codul de aplicație care dispatch-uiește după tipul de dispozitiv continuă să funcționeze când un dispozitiv este împachetat, decorat sau înlocuit, iar codul care testează is THPDFBitmapRenderDevice nu
Ce înseamnă transferul de proprietate în practică
Înainte de TakeBitmap sau TakeMetafile, dispozitivul deține obiectul și îl eliberează în destructor. După apel, îl dețineți dumneavoastră, iar dispozitivul nu mai face asta. Ambele tipare sunt legitime: folosiți proprietatea Bitmap sau Metafile când obiectul trebuie doar să supraviețuiască apelului de randare, iar preluați proprietatea când obiectul supraviețuiește dispozitivului
Modul de eșec este cel obișnuit al Delphi. Luați bitmapul, eliberați dispozitivul, uitați să eliberați bitmapul, iar ce aveți este o scurgere care crește cu numărul de pagini — invizibilă pe un test de cinci pagini și evidentă pe un lot de cinci sute. Împachetați ambele obiecte în propriul try/finally în loc să partajați unul singur, iar întrebarea de proprietate se răspunde singură
Probarea overprint și transparența în aceeași pagină
Knockout-ul grupului de transparență rămâne activ când previzualizarea overprint este pornită, iar ambele sunt compuse în aceeași cale de instantaneu de pictură mărginită. Asta contează deoarece fișierele reale gata de tipar le amestecă constant: un grup de transparență care ține o lucrare stă pe un fundal al cărui negru este setat la overprint, iar simularea uneia fără cealaltă produce o probă greșită într-un mod nou, nu corectă
Mentinați însă limitele în vedere. Previzualizarea overprint simulează comportamentul cernelurilor de proces pentru vopselurile DeviceCMYK sub comenzile de overprint numite mai sus. Este o probă a interacțiunii cernelurilor, nu o probă contractuală gestionată ca culoare: nu înlocuiește un flux ICC și nu vă spune ce va produce o anumită tiparnie și un anumit suport. Tratați-o așa cum tratează un operator de prepress o previzualizare overprint într-un vizualizator profesionist — ca verificarea care prinde erorile pe care nimeni nu le prive uitându-se la o previzualizare normală
Încadrarea probării într-un pas de preflight
Locul util pentru asta este lângă verificările pe care le rulați deja. O trecere de preflight raportează că textul negru este setat la overprint; o randare de probă îi arată unui operator ce înseamnă asta pe pagină; iar ambele intră în același raport. Pentru culorile spot, care însoțesc frecvent overprint-ul în munca de ambalaje, prezentarea detaliată despre randarea culorilor spot Separation și DeviceN acoperă partea de colorant a aceleiași pagini, în timp ce notele despre randarea unei pagini PDF într-un bitmap și despre tipărirea unui PDF încărcat prin TPrinter acoperă cele două ținte de dispozitiv în forma lor simplă, fără probare
HotPDF randează, probează și tipărește pagini PDF încărcate din cod VCL nativ pentru Delphi și C++Builder, fără niciun DLL de randare extern de implementat alături de aplicație — pagina componentei HotPDF are lista de funcții de randare și o construcție de probă