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

CMYK overprint корекция и рендер устройства в HotPDF

HotPDF рендерира заредена PDF страница през една входна точка, RenderLoadedPageToDevice, а устройството, което му подадете, решава дали резултатът е битмап, чертеж върху външен контекст на устройство като принтерно платно, или векторен разширен метафайл. Задайте RenderOverprintPreview на True и същото извикване симулира CMYK overprint на процесни мастила, така че операторът вижда на екрана взаимодействието на мастилата, което иначе би се появило само върху печатния лист

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

Защо страницата се печати различно от прегледа си?

Защото overprint е инструкция към устройството за визуализация, а не операция за оцветяване. Когато страницата зададе /OP или /op true в графичното състояние, тя казва на RIP да не избива мастилата отдолу — циан обект, начертан върху жълто, оставя жълтото на място, а листът показва зелено. Четец, който игнорира overprint, избива нормално и показва циан. Нито едното не е грешно в собствените си термини, и точно това е проблемът: екранът и печатницата не са съгласни, и никой не разбира, докато не се върнат коректурите

RenderOverprintPreview кара HotPDF да вземе инструкцията насериозно за оцветявания DeviceCMYK, управлявани от /OP, /op и /OPM 1. Резултатът е корекционен преглед, а не преглед на четец: черно, преотпечатващо нюанс, остава богат наслагване вместо да пробива дупка, а случайно преотпечатване на дизайнер върху бял текст става видимо като изчезващия текст, който ще бъде

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;

Настройката участва в идентичността на рендер кеша — в памет и на диск — така че обикновен преглед и корекционен преглед никога не споделят битмап. Превключването на свойството не изисква да инвалидирате каквото и да е ръчно — кеш, който би върнал грешния от тези две, би бил по-лош и от никакъв кеш

Три устройства, едно извикване за рендериране

THPDFRenderDevice е абстрактен клас с два члена, които имат значение: Kind, който отчита целта като rdkBitmap, rdkDeviceContext или rdkEnhancedMetafile, и Execute, който библиотеката извиква. Три конкретни устройства се доставят с HotPDF и всяко притежава изхода си различно

THPDFBitmapRenderDevice притежава TBitmap, докато TakeBitmap не прехвърли собствеността на вас. THPDFDeviceContextRenderDevice приема съществуващ HDC плюс ширина и височина и чертае направо в него, което е начинът да рендерирате върху принтерно платно без обход през битмап. THPDFMetafileRenderDevice притежава TMetafile, докато TakeMetafile не го прехвърли, което запазва векторно съдържание като вектори за консуматорите, които се нуждаят от него

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;

Четенето на Kind вместо тестване на runtime класа е умишлено. Кодът на приложението, който се диспечира по вид устройство, продължава да работи, когато устройството е обвито, декорирано или заменено, а кодът, който тества is THPDFBitmapRenderDevice — не

Какво означава прехвърлянето на собственост на практика

Преди TakeBitmap или TakeMetafile устройството притежава обекта и го освобождава в деструктора си. След извикването вие го притежавате, а устройството — вече не. И двата модела са легитимни: използвайте свойството Bitmap или Metafile, когато обектът трябва да надживее само извикването за рендериране, и поемете собственост, когато обектът надживява устройството

Режимът на отказ е обикновеният Delphi. Вземете битмапа, освободете устройството, забравете да освободите битмапа и имате изтичане, което расте с броя страници — невидимо при петстраничен тест и очевидно при партида от петстотин страници. Обвийте и двата обекта в техен собствена try/finally, вместо да споделяте една, и въпросът за собствеността отговаря на себе си сам

Корекция на overprint и прозрачност на една и съща страница

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

Дръжте обаче лимитите пред очите си. Прегледът на overprint симулира поведение на процесни мастила за оцветявания DeviceCMYK под контролните overprint, назовани по-горе. Това е корекция на взаимодействие на мастила, а не цветово управлявана договорна коректура: той не замества ICC работен процес и не ви казва какво ще даде конкретна печатна машина и материал. Отнасяйте се към него така, както препрес оператор се отнася към преглед на overprint в професионален четец — като към проверката, която хваща грешките, които никой не хваща, гледайки обикновен преглед

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

Полезното място за това е до проверките, които вече пускате. Предполетно преминаване отчита, че черен текст е настроен да преотпечатва; корекционен рендер показва на оператор какво означава това на страницата; и двете отиват в същия отчет. За пън цветове, които често съпътстват overprint в опаковъчна работа, ръководството за рендериране на Separation и DeviceN пън цветове разглежда страната на оцветителите на същата страница, докато записките за рендериране на PDF страница към битмап и за печат на зареден PDF през TPrinter разглеждат двете цели на устройства в тяхната обикновена, некорекционна форма

HotPDF рендерира, коригира и печата заредени PDF страници от нативен VCL код за Delphi и C++Builder, без външна рендерираща DLL, която да се разгръща до приложението — страницата на HotPDF компонент има списъка с функции за рендериране и пробна версия