Tekninen artikkeli

PDF:n muuntaminen yhteen väriavaruuteen Delphissä

RecolorDocument siirtää kokonaisen PDF:n yhteen väriavaruuteen, ja RecolorPage tekee saman yksittäiselle sivulle. molemmat ottavat 1 harmaasävylle, 2 RGB:lle ja 3 CMYK:lle, ja palauttavat kuinka monta väriä muutettiin. Geometria, teksti ja kuvat pysyvät tismalleen siinä missä olivat; vain väri muuttuu

Tämä on operaatio jota haluat ennen työn lähettämistä painokoneelle joka odottaa yhtä tilaa, tai kun väriasiakirja on muutettava harmaaksi ilman että se tuotetaan uudelleen. Vaihtoehto — asiakirjan uudelleenrakentaminen sen lähdedatasta kohdetilassa — on käytettävissä vain kun lähdedata on yhä olemassa, mitä ulkoa saapuville ei ole

Mitä muutetaan ja missä järjestyksessä

Värioperaattorit ensin: ne täytöt ja vedot jotka sivu asettaa piirtäessään. Väri joka on jo kohdetilassa jätetään rauhaan, joten sivu jonka värit eivät vaadi muutoksia pitää alkuperäiset tavunsa sen sijaan että se kirjoitettaisiin uudelleen identtisiksi arvoiksi. Tämä ominaisuus merkitsee enemmän kuin miltä kuulostaa suuressa asiakirjassa, koska koskemattomat objektit pysyvät tiedostossa koskemattomina

Kuvat tulevat seuraavaksi, ja ne ovat se osa joka aiemmin puuttui. Asiakirja joka käännettiin harmaaksi pelkkien operaattorien muuntamisella näytti yhä värikuvia harmailla sivuilla, mikä on pahempaa kuin kumpikaan ääripää. Kuva muunnetaan kun se kantaa kahdeksan bittiä komponenttia, laitteen väriavaruuden ja joko ei pakkausta tai pelkkä Flate

Indeksoidut kuvat muunnetaan niiden väritaulun läpi: paletti muunnetaan ja jokainen näyte pitää indeksin jonka se jo kantoi. Tämä kattaa ne palettikuvat joiksi kuvakaappaus tai kaavio yleensä tallennetaan, ja se muuntaa ne riippumatta siitä miten niiden näytteet on pakattu tai pakattu, koska näytteet eivät koskaan muutu

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;

Miksi JPEG jätetään rauhaan?

Koska sen värien muuntaminen tarkoittaisi sen uudelleenkoodausta, ja uudelleenkoodaus on eri operaatio jolla on eri seuraukset. JPEG- tai faksi-kuva pitää omat tavunsa: dekoodaus, muuntaminen ja uudelleenpakkaus muuttaisivat kuvadatan itseään, toisi toisen sukupolven häviöllisiä artefakteja ja muuttaisi tiedostokokoa tavoilla joita kutsuja ei pyytänyt

Pehmeät maskit ja sapluunamaskit jätetään rauhaan toisesta syystä. molempia luetaan kattavuutena eikä värinä, ja toisen muuntaminen jättäisi sivun näyttämään maskia kuvana — läpinäkyvyysmaski renderöityneenä harmaana grafiikkana sen sisällön päälle jonka muotoilua se oli tarkoitus olla. Niiden jättäminen ei ole rajoitus jota kiertää; se on oikea tulos

Värit jotka on asetettu ICCBased-, Separation-, Indexed- tai Pattern-tilan läpi jätetään myös ennalleen operaattoritasolla. Niiden muuntaminen ilman profiilin lukemista muuttaisi sitä miltä sivu näyttää sen sijaan että säilyttäisi sen, ja uudelleenväritysläpäisy jonka koko lupaus on säilyttäminen ei voi alkaa arvailla profiileja

Liukuvärit muunnetaan niiden takana olevien pysäytysten kanssa

Liukuväri on väriavaruus plus funktio joka tuottaa värejä siinä, ja toisen muuntaminen ilman toista tuottaa roskaa — muunnettu liukuväri jonka pysäytykset jätettiin taakse luetaan kanavaksi joka sekoitettiin harmaatasoksi, mikä sivulla näyttää yhtäkki väärän värin nauhalta. Liukuvärin väriavaruus ja sen takana olevat pysäytykset liikkuvat yhdessä

Liukuvärit löydetään sieltä missä ne asuvat: annettuna oman objektinansa, kirjoitettuna sisään sen kuvion sisään joka maalaa ne, tai sijoitettuna sivun sävytysresursseihin. Tämä kattavuus merkitsee koska suunnittelutyökalut jakavat ne eri tavalla, ja muunnin joka käsittele vain yhden sijoituksen jättäisi asiakirjan puoliksi muunnetuksi ilman ilmeistä kaavaa epäonnistumisissa

Kaksi lajia jätetään tahallaan ennalleen. Näytteistetystä tai PostScript-funktiosta rakennettu liukuväri pitää oman määrittelynsä, samoin verkko-tyypit jotka kantavat värinsä virrassa eivät funktiossa. molempien uudelleenkirjoittaminen on eri operaatio kuin värin muuntaminen, ja sen tekeminen hiljaa uudelleenväritysläpäisyn sisällä olisi yllätys

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

Mihin uudelleenväritys sopii ennen painotyön lähettämistä

Käytä sitä normalisointiaskelena, ei värihallintana. Uudelleenväritys muuntaa arvoja laitteen väriavaruuksien välillä; se ei sokele ICC-profiilia, kunnioita renderöintitarkoitusta tai simuloi painokonetilaa. Työlle joka on osuttava sopimuskoevedokseen, profiilivetoinen työnkulku on vastaus ja uudelleenväritys on korkeintaan se askel joka saa kaiken ensin yhteen tilaan

Mistä se ansaitsee paikkansa on tavallinen tuotanto-ongelma: lähetys joka pitää olla harmaa ja saapuu RGB-logon kanssa, sisäinen asiakirja jota ei saa tulostaa värillisenä, erä tiedostoja jotka pitää olla yksi tila ennen kuin eskelennusaskel hyväksyy ne. Parittaa se tarkistuksen kanssa — artikkelit PDF/A- ja PDF/UA-eskelennus ja vaatimustenvastaisuus- ja allekirjoitustyöpöytä käsittelevät tuomion ajamista osana samaa työtä

Jos asiakirja tarvitsee myös vektorigrafiikkansa tutkittavaksi eikä muunnettavaksi, artikkeli vektorigrafiikka, sävyttimet ja liukuvärit käsittelee miten nuo objektit rakennetaan alun perin, mikä on hyödyllistä kontekstia ymmärtämään mitä uudelleenväritysläpäisy voi ja mitä se ei voi tavoittaa

PDFlibPas on natiivi Pascal-PDF-kirjasto Delphille, C++Builderille ja Lazarukselle ilman ulkoista ajonaikaa, joten värin normalisointiaskel pyörii oman palvelusi sisällä sen sijaan että kuorisi ulkoista muunninta — katso PDFlibPas-tuotesivulta koko asiakirjan käsittelyn API