Műszaki cikk

CMYK rányomtatási proof és megjelenítő eszközök HotPDF-ben

A HotPDF egyetlen belépési ponton, a RenderLoadedPageToDevice-on keresztül renderel egy betöltött PDF-oldalt, és a általunk átadott eszköz dönti el, hogy az eredmény bitmap, egy külső eszközkontextuson — például nyomtatóvásznon — való rajz, vagy egy vektoros enhanced metafájl-e. Állítsuk a RenderOverprintPreview-t True-ra, és ugyanaz a hívás szimulálja a CMYK processz-tinta rányomást, így egy operátor a képernyőn látja azt a tintainterakciót, amely egyébként csak a nyomdai lapon jelenne meg

Ez a két funkció különböző problémákat old meg, amelyek véletlenül ugyanabban a kódrészben találkoznak. Az eszközabsztrakció eltávolítja azt az elágazást, ahol a preview, a nyomtatás és az export mind a saját renderelő hívásával és a saját eltérésével rendelkezett. A rányomtatási proof eltávolítja azt a termelési hibaosztályt, ahol egy dokumentum minden megjelenítőben helyesnek tűnik, és hibásan kerül le a nyomdáról

Miért nyomtat máshogy egy oldal, mint ahogy megjeleníti?

Mert a rányomtatás egy utasítás a képalkotó eszköznek, nem egy festési művelet. Amikor egy oldal /OP vagy /op true értéket állít be a grafikai állapotban, a RIP-et arra utasítja, hogy ne üsse ki az alatta lévő tintákat — egy cián objektum, amelyet sárgára rajzoltak, a sárgát a helyén hagyja, és a lap zöld lesz. Egy olyan megjelenítő, amely figyelmen kívül hagyja a rányomást, normálisan kiveri és ciánt mutat. Egyik sem saját szempontjából hibás, és pontosan ez a probléma: a képernyő és a nyomda nem ért egyet, és senki nem tudja meg, amíg a proofok vissza nem érkeznek

A RenderOverprintPreview arra kényszeríti a HotPDF-t, hogy komolyan vegye az utasítást a /OP, /op és /OPM 1 által vezérelt DeviceCMYK festékekre. Az eredmény proof-preview, nem megjelenítő-preview: egy árnyalatot rányomtató fekete gazdag átfedés marad ahelyett, hogy lyukat ütne, és egy tervező véletlen rányomása fehér szövegen láthatóvá válik az eltűnő szövegként, amivé válni fog

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;

A beállítás részt vesz a render-gyorsítótár-identitásban, memóriában és lemezen, így egy normál preview és egy proof-preview sosem oszt egy bitmapot. A tulajdonság váltogatása nem igényel semmi kézi érvénytelenítést — egy olyan gyorsítótár, amely visszaadta ezen kettő közül a rosszat, rosszabb lenne, mint egyáltalán semmilyen gyorsítótár

Három eszköz, egyetlen renderhívás

A THPDFRenderDevice egy absztrakt osztály két fontos taggal: Kind, amely a célt rdkBitmap, rdkDeviceContext vagy rdkEnhancedMetafile értékként jelenti, és Execute, amelyet a könyvtár hív. Három konkrét eszköz érkezik a HotPDF-fel, és mindegyik máshogy birtokolja a kimenetet

A THPDFBitmapRenderDevice egy TBitmap-et birtokol, amíg a TakeBitmap át nem adja a tulajdont. A THPDFDeviceContextRenderDevice egy meglévő HDC-t vesz át szélességgel és magassággal, és egyenesen bele rajzol, ami úgy renderelünk egy nyomtatóvászonra, hogy nincs bitmap oda-vissza út. A THPDFMetafileRenderDevice egy TMetafile-t birtokol, amíg a TakeMetafile át nem adja, ami vektoros tartalmat vektorként tart azoknak a fogyasztóknak, amelyeknek szükségük van rá

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;

A Kind olvasása a futásidejű osztály tesztelése helyett szándékos. Az alkalmazáskód, amely az eszköztípusra diszpécse, tovább működik, amikor egy eszközt becsomagolnak, dekorálnak vagy lecserélnek, a is THPDFBitmapRenderDevice tesztelő kód pedig nem

Mit jelent a tulajdonátruházás a gyakorlatban

A TakeBitmap vagy TakeMetafile előtt az eszköz birtokolja az objektumot, és a destruktorában felszabadítja. A hívás után mi birtokoljuk, és az eszköz már nem. Mindkét minta jogszerű: használjuk a Bitmap vagy Metafile tulajdonságot, amikor az objektumnak csak a renderhívást kell túlélnie, és vegyük át a tulajdont, amikor az objektum túléli az eszközt

A hibaüzemmód a mindennapi Delphi. Vegyük el a bitmapot, szabadítsuk fel az eszközt, felejtsük el felszabadítani a bitmapot, és egy olyan szivárgásunk van, amely az oldalszámmal nő — láthatatlan egy ötoldalas teszten, nyilvánvaló egy ötszázoldalas kötegen. Csomagoljuk mindkét objektumot a saját try/finally-jébe, ahelyett hogy megosztanánk egyet, és a tulajdonkérdés magától megválaszolódik

Rányomtatási proof és átlátszóság ugyanazon az oldalon

A transzparenciacsoport-knockout aktív marad, amikor a rányomtatási preview be van kapcsolva, és mindkettő ugyanabban a korlátozott festési pillanatkép-úton kompozitálódik. Ez azért számít, mert a valódi nyomdakész fájlok folyamatosan keverik a kettőt: egy művészetet tartalmazó transzparenciacsoport olyan háttéren ül, amelynek feketéje rányomtatásra van állítva, és az egyik szimulálása a másik nélkül egy olyan proofot eredményez, amely új módon hibás, nem helyes

A korlátokat tartsuk szem előtt. A rányomtatási preview a processz-tinta viselkedést szimulálja a fent nevezett rányomtatás-vezérlők alatti DeviceCMYK festékekre. Ez a tintainterakció proofja, nem színkezelt szerződéses proof: nem helyettesíti az ICC-workflow-t, és nem mondja meg, mit fog eredményezni egy adott nyomda és papír. Úgy kezeljük, ahogy egy prepress-operátor kezeli a rányomtatási preview-t egy professzionális megjelenítőben — mint azt az ellenőrzést, amely elkapja azokat a hibákat, amelyeket senki nem kap el egy normál preview megnézésével

A proof beillesztése egy preflight lépésbe

Ennek hasznos helye a már futtatott ellenőrzések mellett van. Egy preflight-menet arról jelent, hogy a fekete szöveg rányomtatásra van állítva; egy proof-render megmutatja egy operátornak, mit jelent ez az oldalon; és mindkettő ugyanabba a jelentésbe kerül. A spot színekhez, amelyek gyakran kísérik a rányomást a csomagolási munkában, a Separation és DeviceN spot szín renderelés átjárása ugyanannak az oldalnak a színező oldalát tárgyalja, míg a PDF-oldal bitmapra renderelése és a betöltött PDF nyomtatása TPrinteren keresztül jegyzetei a két eszközcélt sima, nem-proof formájukban tárgyalják

A HotPDF natív VCL kódból renderel, proofol és nyomtat betöltött PDF-oldalakat Delphihez és C++Builderhez, külső renderelő DLL nélkül, amelyet az alkalmazás mellé telepíteni kellene — a HotPDF komponens oldal tartalmazza a render-funkciólistát és egy próbaverziót