Articol tehnic

Probare CMYK cu overprint și dispozitive de randare în HotPDF

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ă