Articol tehnic

Conversia unui PDF la un singur spațiu de culoare în Delphi

RecolorDocument mută un întreg PDF într-un singur spațiu de culoare, iar RecolorPage face același lucru pentru o singură pagină. Ambele iau 1 pentru tonuri de gri, 2 pentru RGB și 3 pentru CMYK, și returnează câte culori au fost convertite. Geometria, textul și imaginile rămân exact unde erau; se schimbă doar culoarea

Aceasta este operațiunea pe care o doriți înainte de a trimite o lucrare la o tiparnie care așteaptă un singur spațiu, sau când un document color trebuie să devină unul în tonuri de gri fără a fi regenerat. Alternativa — reconstruirea documentului din datele sale sursă în spațiul țintă — este disponibilă doar când aveți încă datele sursă, ceea ce pentru orice primit din exterior nu se întâmplă

Ce se converteste și în ce ordine

Mai întâi operatorii de culoare: umplerile și contururile pe care o pagină le setează în timp ce desenează. O culoare deja în spațiul țintă este lăsată în pace, așa că o pagină ale cărei culori nu au nevoie de schimbare își păstrează octeții originali în loc să fie rescrisă la valori identice. Această proprietate contează mai mult decât sună pe un document mare, deoarece obiectele neatinse rămân neatinse în fișier

Urmează imaginile, iar ele sunt partea care obișnuia să lipsească. Un document transformat în tonuri de gri cu doar operatorii convertiți încă afișa poze color pe pagini în tonuri de gri, ceea ce este mai rău decât oricare dintre extreme. O imagine este convertită când poartă opt biți pe componentă, un spațiu de culoare device, și fie fără compresie, fie cu Flate simplu

Imaginile indexate se convertesc prin tabela lor de culoare: paleta este convertită, iar fiecare eșantion își păstrează indexul pe care îl avea deja. Asta acoperă imaginile cu paletă în care este de obicei salvată o captură de ecran sau un grafic, și le convertește indiferent cu ce sunt ambalate sau comprimate eșantioanele, deoarece eșantioanele nu se schimbă niciodată

var
  Lib: TPDFlib;
  Converted: Integer;
begin
  Lib := TPDFlib.Create;
  try
    Lib.LoadFromFile('brochure.pdf', '');
    Converted := Lib.RecolorDocument(1);       // 1 grey, 2 RGB, 3 CMYK
    Log(Format('%d colours converted', [Converted]));
    Lib.SaveToFile('brochure-grey.pdf');
  finally
    Lib.Free;
  end;
end;

De ce este lăsat un JPEG în pace?

Pentru că i se converti culorile ar însemna re-codarea lui, iar re-codarea este o operațiune diferită cu consecințe diferite. O imagine JPEG sau fax își păstrează propriii octeți: decodarea, conversia și recomprimarea ar schimba datele imaginii înseși, ar introduce o a doua generație de artefacte cu pierderi și ar schimba dimensiunea fișierului în moduri pe care apelantul nu le-a cerut

Măștile moi și măștile stencil sunt lăsate în pace dintr-un alt motiv. Ambele sunt citite ca acoperire, nu ca culoare, iar convertirea uneia ar lăsa pagina să afișeze masca ca pe o imagine — o mască de transparență randată ca o lucrare de artă în tonuri de gri peste conținutul pe care ar fi trebuit să îl modeleze. Lăsarea lor nu este o limitare de ocolit; este rezultatul corect

Culorile setate printr-un spațiu ICCBased, Separation, Indexed sau Pattern sunt de asemenea lăsate așa cum stau la nivel de operator. Convertirea lor fără citirea profilului ar schimba cum arată pagina în loc să o păstreze, iar o trecere de recolorare a cărei întreagă promisiune este păstrarea nu poate începe să ghicească profiluri

Gradienții se convertesc cu opririle din spatele lor

Un gradient este un spațiu de culoare plus o funcție care produce culori în el, iar convertirea unuia fără celălalt produce nonsens — un gradient convertit ale cărui opriri au fost lăsate în urmă se citește ca un canal confundat cu un nivel de gri, ceea ce pe o pagină arată ca o bandă de culoare complet greșită. Spațiul de culoare al gradientului și opririle din spatele lui se mută împreună

Gradienții sunt găsiți oriunde locuiesc: dați ca obiect propriu, scriși în interiorul modelului care îi pictează, sau așezați în resursele de shading ale unei pagini. Această acoperire contează deoarece uneltele de design îi distribuie diferit, iar un convertor care gestiona doar o singură plasare ar lăsa un document jumătate convertit, fără un tipar evident al eșecurilor

Două tipuri sunt lăsate intenționat așa cum stau. Un gradient construit dintr-o funcție eșantionată sau PostScript își păstrează propria definiție, la fel și tipurile mesh, care își poartă culorile într-un flux mai degrabă decât într-o funcție. Rescrierea oricăreia este o operațiune diferită de convertirea unei culori, iar executarea tăcută într-o trecere de recolorare ar fi o surpriză

// Convert a single page - useful when only the cover needs to change
Lib.SelectPage(1);
Lib.RecolorPage(3);          // this page to CMYK
Lib.SaveToFile('cover-cmyk.pdf');

Unde se încadrează recolorarea înainte de o trimitere la tipar

Folosiți-o ca pas de normalizare, nu ca management al culorii. Recolorarea converteste valori între spațiile device; nu aplică un profil ICC, nu onorează o intenție de randare și nu simulează o condiție de tipar. Pentru o lucrare care trebuie să atingă o probă contractuală, fluxul condus de profil este răspunsul, iar recolorarea este cel mult pasul care aduce totul într-un singur spaț mai întâi

Unde își câștigă locul este problema obișnuită de producție: o trimitere care trebuie să fie în tonuri de gri și sosește cu un logo RGB, un document intern care nu trebuie tipărit color, un lot de fișiere care trebuie să fie într-un singur spaț înainte ca un pas de preflight să le accepte. Asociați-o cu o verificare — notele despre preflight PDF/A și PDF/UA și despre banca de lucru de conformanță și semnare acoperă rularea verdictului ca parte din aceeași lucrare

Dacă documentul are nevoie și de examinarea lucrării vectoriale mai degrabă decât de conversie, prezentarea detaliată despre grafică vectorială, shadere și gradienți acoperă modul în care acele obiecte sunt construite în primul rând, context util pentru a înțelege ce poate și ce nu poate atinge o trecere de recolorare

PDFlibPas este o bibliotecă PDF nativă în Pascal pentru Delphi, C++Builder și Lazarus fără runtime extern, astfel încât un pas de normalizare a culorii rulează în interiorul propriului serviciu în loc să lanseze un convertor extern — vedeți pagina produsului PDFlibPas pentru API-ul complet de procesare a documentelor