Techninis straipsnis

PDF konvertavimas į vieną spalvų erdvę Delphi

RecolorDocument perkelia visą PDF į vieną spalvų erdvę, o RecolorPage tą patį daro vienam puslapiui. Abu priima 1 pilkai, 2 RGB ir 3 CMYK bei grąžina, kiek spalvų buvo konvertuota. Geometrija, tekstas ir paveikslai lieka tiksliai ten, kur buvo; keičiasi tik spalva

Tai yra operacija, kurios norite prieš siųsdami darbą į spausdinimo mašiną, kuri tikisi vienos erdvės, arba kai spalvotas dokumentas turi tapti pilku be pakartotinio generavimo. Alternatyva — dokumento atkūrimas iš jo šaltinio duomenų tikslinėje erdvėje — yra prieinama tik tada, kai vis dar turite šaltinio duomenis, kurių bet kam, gautam iš išorės, neturite

Kas konvertuojama ir kokia tvarka

Pirmiausia spalvų operatoriai: užpildymai ir brūkšniai, kuriuos puslapis nustato braižydamas. Spalva, jau esanti tikslinėje erdvėje, paliekama ramybėje, todėl puslapis, kurio spalvoms nereikia pakeitimo, išlaiko savo originalius baitus, užuot buvęs perrašytas į identiškas reikšmes. Ši savybė svarbesnė, nei skamba, dideliame dokumente, nes nepaliesti objektai lieka nepaliesti faile

Paveikslai eina po jų, ir tai yra dalis, kuri anksčiau trūko. Dokumentas, paverstas pilku konvertuojant tik operatorius, vis dar rodė spalvotus paveikslus pilkuose puslapiuose, kas yra blogiau nei bet kuris iš kraštutinumų. Paveikslas konvertuojamas, kai jis neša aštuonis bitus komponentui, įrenginio spalvų erdvę ir arba jokio glaudinimo, arba paprasto Flate

Indeksuoti paveikslai konvertuojami per jų spalvų lentelę: konvertuojama paletė, o kiekviam pavyzdžiui išlaiko indeksą, kurį jis jau turėjo. Tai padengia paletinius paveikslus, kuriais paprastai išsaugomas ekrano vaizdas ar diagrama, ir konvertuoja juos nepriklausomai nuo to, kuo jų pavyzdžiai supakuoti ar suglaudinti, nes pavyzdžiai niekada nesikeičia

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;

Kodėl JPEG paliekamas ramybėje?

Nes jo spalvų konvertavimas reikštų pakartotinį kodavimą, o pakartotinis kodavimas yra kitokia operacija su kitokiomis pasekmėmis. JPEG ar fakso paveikslas išlaiko savo baitus: dekodavimas, konvertavimas ir pakartotinis glaudinimas pakeistų paties paveikslo duomenis, įvestų antrą prarandančių artefaktų kartą ir pakeistų failo dydį taip, kaip kviesiantysis neprašė

Minkštosios kaukės ir trafaretinės kaukės paliekamos dėl kitos priežasties. Abi skaitomos kaip aprėptis, o ne kaip spalva, ir vienos konvertavimas leistų puslapiui rodyti kaukę kaip paveikslą — permatomumo kaukę, atvaizduotą kaip pilkas grafikas ant turinio, kurį ji turėjo formuoti. Jas palikti nėra apribojimas, kurį reikia apeiti; tai yra teisingas rezultatas

Spalvos, nustatytos per ICCBased, Separation, Indexed ar Pattern erdvę, taip pat paliekamos tokios, kokios yra operatoriaus lygyje. Jas konvertuojant neperskaičius jų profilio, būtų pakeista tai, kaip puslapis atrodo, o ne išsaugota, o pakartotinio dažymo perdavimas, kurio visas pažadas yra išsaugojimas, negali pradėti spėlioti profilių

Gradientai konvertuojami su jų užnugario sustojimo taškais

Gradientas yra spalvų erdvė ir funkcija, kuri gamina joje spalvas, ir vieno be kito konvertavimas gamina nesąmonę — konvertuotas gradientas, kurio sustojimo taškai liko, skaitomas kaip kanalas, supainiotas su pilko lygiu, kas puslapyje atrodo kaip visiškai netinkamos spalvos juosta. Gradiento spalvų erdvė ir jos užnugario sustojimo taškai juda kartu

Gradientai surandami ten, kur jie gyvena: turėdami savo objektą, užrašyti viduje šablono, kuris juos dažo, arba sėdėdami puslapio šešėliavimo ištekliaus. Ši aprėptis svarbi, nes projektavimo įrankiai paskirsto juos skirtingai, o konverteris, kuris apdorotų tik vieną išdėstymą, paliktų dokumentą per pusę konvertuotą be akivaizdžios trikčių schemos

Dvi rūšys sąmoningai paliekamos tokios, kokios yra. Gradientas, sukurtas iš atrinktos arba PostScript funkcijos, išlaiko savo apibrėžimą, kaip ir tinklo tipai, kurie neša savo spalvas sraute, o ne funkcijoje. Abu perrašyti yra kitokia operacija nei spalvos konvertavimas, ir tai padaryti tyliai pakartotinio dažymo perdavimo viduje būtų staigmena

// 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');

Kur pakartotinis dažymas tinka prieš pateikimą spausdinimui

Naudokite jį kaip normalizavimo žingsnį, o ne kaip spalvų valdymą. Pakartotinis dažymas konvertuoja reikšmes tarp įrenginio erdvių; jis netaiko ICC profilio, negerbia atvaizdavimo intencijos ir nesimuliuoja spaudinio sąlygų. Darbui, kuris turi pasiekti sutartinį įrodymą, profiliu grįstas darbo eigos būdas yra atsakymas, o pakartotinis dažymas yra daugiausia žingsnis, kuris viską pirmiausia perkelia į vieną erdvę

Kur jis uždirna savo vietą, tai įprasta gamybos problema: pateikimas, kuris turi būti pilkas ir atkeliauja su RGB logotipu, vidinis dokumentas, kuris neturi būti spausdinamas spalvotai, failų paketas, kuris turi būti vienoje erdvėje, kad skrydžio prieš tai žingsnis juos priimtų. Sujunkite jį su patikra — PDF/A ir PDF/UA skrydžio prieš tai ir atitikties ir pasirašymo darbo stalo pastabos padengia verdikto vykdymą kaip to paties darbo dalį

Jei dokumentui taip pat reikia ištirti jo vektorinę grafiką, o ne konvertuoti, vektorinės grafikos, šešėliuotojų ir gradientų aprašymas padengia, kaip tie objektai išvis yra statomi, kas yra naudingas kontekstas suprasti, ko pakartotinio dažymo perdavimas gali ir ko negali pasiekti

PDFlibPas yra natyvi Pascal PDF biblioteka, skirta Delphi, C++Builder ir Lazarus be išorinės vykdymo aplinkos, todėl spalvų normalizavimo žingsnis vyksta jūsų pačių paslaugoje, užuot iškvietus konverterį — žr. PDFlibPas produkto puslapį pilnam dokumentų apdorojimo API