Техническа статия

Преобразуване на PDF в един цветови пространство в Delphi

RecolorDocument премества цял PDF в един цветови пространство, а RecolorPage прави същото за една страница. И двете приемат 1 за сиво, 2 за RGB и 3 за CMYK, и връщат колко цвята са били преобразувани. Геометрията, текстът и изображенията остават точно там, където са били; само цветът се променя

Това е операцията, която искате преди да изпратите работа към печатница, която очаква едно пространство, или когато цветен документ трябва да стане сив без да бъде регенериран. Алтернативата — прездравяване на документа от неговите изходни данни в целевото пространство — е достъпна само когато все още имате изходните данни, което за всичко получено отвън не е така

Какво се преобразува и в какъв ред

Първо цветовите оператори: запълванията и щрихите, които една страница задава докато се чертае. Цвят, който вече е в целевото пространство, се оставя на мира, така че страница, чиито цветове не се нуждаят от промяна, запазва оригиналните си байтове вместо да бъде презаписвана с идентични стойности. Това свойство има повече значение, отколкото звучи, при голям документ, защото недокоснатите обекти остават недокоснати във файла

След тях идват изображенията и те са частта, която по-рано липсваше. Документ, превърнат в сив само с преобразувани оператори, все още показваше цветни картини върху сиви страници, което е по-лошо и от двете крайности. Изображение се преобразува, когато носи осем бита на компонент, цветови пространство от тип device и няма компресия или е с обикновен Flate

Индексираните изображения се преобразуват през тяхната цветова таблица: палитрата се преобразува и всяка извадка запазва индекса, който вече е държала. Това покрива палитровите изображения, в които обикновено се запазват екранна снимка или графика, и ги преобразува независимо с какво са пакети или компресирани техните извадки, защото извадките никога не се променят

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;

Защо JPEG се оставя на мира?

Защото преобразуването на цветовете му би означавало повторно кодиране, а повторното кодиране е различна операция с различни последствия. JPEG изображение или факс изображение запазва собствените си байтове: декодиране, преобразуване и рекомпресиране би променило самите данни на изображението, би внесло второ поколение загуби от компресия и би променило размера на файла по начини, които извикващият не е поискал

Меките маски и шаблонните маски се оставят на мира по друга причина. И двете се четат като покритие, а не като цвят, и преобразуването на едната би оставило страницата да показва маската като картина — маска за прозрачност, рендерирана като сива графика върху съдържанието, което е трябвало да оформя. Оставянето им не е ограничение, за което да се заобикаля; то е правилният резултат

Цветове, зададени през пространство ICCBased, Separation, Indexed или Pattern, също се оставят както си стоят на ниво оператор. Преобразуването им без прочитане на профила им би променило изгледа на страницата вместо да я запази, а прецветяващо преминаване, чието цяло обещание е запазване, не може да започне да отгатва профили

Градиентите се преобразуват заедно със спирките зад тях

Градиент е цветови пространство плюс функция, която произвежда цветове в него, и преобразуването на едното без другото дава безсмислица — преобразуван градиент, чиито спирки са останали назад, се чете като канал, сбъркан със сиво ниво, което на страница изглежда като лента от напълно грешен цвят. Цветовото пространство на градиента и спирките зад него се местят заедно

Градиентите се намират там, където и да живеят: дадени като самостоятелен обект, записани вътре в шаблона, който ги рисува, или седящи в ресурсите за сенки на страница. Това покритие има значение, защото дизайн инструментите ги разпределят различно, а конвертор, който обработваше само едно разположение, би оставил документ наполовина преобразуван без очевидна закономерност в провалите

Два вида умишлено се оставят както стоят. Градиент, построен от семплирана или PostScript функция, запазва собствената си дефиниция, както и типовете mesh, които носят цветовете си в поток, а не във функция. Презаписването и на двете е различна операция от преобразуване на цвят, и мълчаливото му вмъкване в прецветващо преминаване би било изненада

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

Къде се вписва прецветяването преди подаване към печатница

Използвайте го като стъпка за нормализация, не като цветово управление. Прецветяването преобразува стойности между device пространства; то не прилага ICC профил, не зачита rendering intent и не симулира печатно условие. За работа, която трябва да улучи договорен коректор, профилно управляваният работен процес е отговорът, а прецветяването е най-много стъпката, която първо въвежда всичко в едно пространство

Там, където то печели мястото си, е обикновен производствен проблем: подаване, което трябва да е сиво и пристига с RGB лого, вътрешен документ, който не трябва да се печата в цвят, партида файлове, които трябва да са в едно пространство, преди предполетна стъпка да ги приеме. Комбинирайте го с проверка — записките за PDF/A и PDF/UA предполетна проверка и за работния плот за съответствие и подписване разглеждат пускането на присъдата като част от същата задача

Ако документът се нуждае и от преглед на векторната графика, а не от преобразуване, ръководството за векторна графика, сенки и градиенти разглежда как тези обекти се изграждат най-напред, което е полезен контекст за разбирането на това какво прецветващо преминаване може и какво не може да достигне

PDFlibPas е нативна Pascal PDF библиотека за Delphi, C++Builder и Lazarus без външен runtime, така че стъпката за цветови нормализация се изпълнява вътре във вашата собствена услуга, вместо да се извиква външен конвертор — вижте страницата на продукта PDFlibPas за пълния API за обработка на документи