Bài viết kỹ thuật

Proof overprint CMYK và thiết bị render trong HotPDF

HotPDF render một trang PDF đã tải qua một điểm vào duy nhất, RenderLoadedPageToDevice, và thiết bị bạn trao cho nó quyết định kết quả là một bitmap, một bản vẽ trên một device context bên ngoài như canvas máy in, hay một enhanced metafile vector. Đặt RenderOverprintPreview thành True và cùng lệnh gọi đó mô phỏng overprint mực process CMYK, để người vận hành nhìn trên màn hình tương tác mực mà nếu không sẽ chỉ xuất hiện trên tờ in

Hai tính năng đó giải những vấn đề khác nhau tình cờ gặp nhau trong cùng đường dẫn mã. Trừu tượng thiết bị loại bỏ nhánh nơi xem trước, in và xuất mỗi thứ có một lệnh render riêng với độ trôi riêng. Overprint proofing loại bỏ lớp lỗi sản xuất nơi một tài liệu trông đúng trong mọi trình xem và ra khỏi máy in sai

Vì sao một trang in khác với khi xem trước?

Vì overprint là một chỉ thị tới thiết bị hình ảnh, không phải một thao tác vẽ. Khi một trang đặt /OP hoặc /op true trong graphics state, nó đang báo cho RIP đừng knock out các mực bên dưới — một đối tượng cyan vẽ trên yellow để nguyên yellow, và tờ in ra xanh lá. Một trình xem bỏ qua overprint thì knock out bình thường và ra cyan. Không cái nào sai trên phương diện riêng của nó, và đó chính xác là vấn đề: màn hình và xưởng in bất đồng, và không ai phát hiện ra cho đến khi proof quay lại

RenderOverprintPreview khiến HotPDF coi trọng chỉ thị đó cho các lớp sơn DeviceCMYK chịu chi phối bởi /OP, /op/OPM 1. Kết quả là xem trước proof thay vì xem trước trình xem: đen overprint lên một màu nhuốm vẫn giữ một lớp phủ giàu thay vì đấm một lỗ, còn overprint vô tình của nhà thiết kế trên văn bản trắng trở nên hiển thị như là văn bản biến mất mà nó sẽ thành

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;

Thiết lập này tham gia vào nhận diện của render-cache, trong bộ nhớ và trên đĩa, nên một xem trước bình thường và một xem trước proof không bao giờ chia sẻ cùng một bitmap. Việc bật tắt thuộc tính không bắt bạn phải invalidate gì bằng tay — một cache mà trả lại sai một trong hai thứ này thì tệ hơn không có cache nào cả

Ba thiết bị, một lệnh render

THPDFRenderDevice là một lớp trừu tượng với hai thành phần đáng quan tâm: Kind, báo cáo đích là rdkBitmap, rdkDeviceContext hoặc rdkEnhancedMetafile, và Execute, được thư viện gọi. Ba thiết bị cụ thể đi kèm HotPDF, mỗi thiết bị sở hữu đầu ra theo cách khác nhau

THPDFBitmapRenderDevice sở hữu một TBitmap cho đến khi TakeBitmap chuyển quyền sở hữu cho bạn. THPDFDeviceContextRenderDevice nhận một HDC sẵn có kèm chiều rộng và chiều cao rồi vẽ thẳng vào đó, đó là cách bạn render lên canvas máy in mà không cần một vòng bitmap. THPDFMetafileRenderDevice sở hữu một TMetafile cho đến khi TakeMetafile chuyển nó, điều giữ nội dung vector vẫn là vector cho các bên tiêu thụ cần điều đó

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;

Việc đọc Kind thay vì kiểm tra lớp runtime là có chủ đích. Mã ứng dụng mà phân phối theo loại thiết bị tiếp tục hoạt động khi một thiết bị được bọc, trang trí hay thay thế, còn mã kiểm tra is THPDFBitmapRenderDevice thì không

Việc chuyển giao quyền sở hữu nghĩa là gì trên thực tế

Trước TakeBitmap hoặc TakeMetafile, thiết bị sở hữu object và giải phóng nó trong destructor. Sau lệnh gọi, bạn sở hữu nó và thiết bị không còn. Cả hai mẫu đều hợp pháp: dùng thuộc tính Bitmap hoặc Metafile khi object chỉ cần sống lâu hơn lệnh render, và nhận quyền sở hữu khi object sống lâu hơn thiết bị

Quy luật thất bại là quy luật Delphi thông thường. Lấy bitmap, giải phóng thiết bị, quên giải phóng bitmap, và bạn có một rò rỉ lớn theo số trang — vô hình trên một bài kiểm tra năm trang và hiển nhiên trên một lô năm trăm trang. Hãy bọc cả hai object trong try/finally riêng của chúng thay vì dùng chung một cái, và câu hỏi quyền sở hữu tự trả lời lấy

Overprint proofing cùng độ trong suốt trên cùng một trang

Knockout của transparency-group vẫn hoạt động khi overprint preview bật, và cả hai được composite trong cùng đường dẫn paint snapshot có biên giới. Điều này quan trọng vì các file sẵn sàng in thực tế thường xuyên trộn hai thứ: một transparency-group chứa artwork nằm trên một nền mà đen của nó được đặt overprint, và mô phỏng một thứ mà không có thứ kia tạo ra một proof sai theo một cách mới thay vì đúng

Nhưng hãy giữ các giới hạn trong tầm nhìn. Overprint preview mô phỏng hành vi mực process cho các lớp sơn DeviceCMYK dưới các điều khiển overprint đã nêu trên. Đó là một proof của tương tác mực, không phải một contract proof được quản lý màu: nó không thay thế một pipeline ICC, và nó không cho bạn biết một xưởng in và giấy cụ thể sẽ ra sao. Hãy đối xử với nó như cách một người vận hành prepress đối xử với overprint preview trong một trình xem chuyên nghiệp — như phép kiểm tra bắt được các lỗi mà không ai bắt được khi nhìn vào xem trước bình thường

Đưa proof vào một bước preflight

Nơi hữu ích cho tính năng này là bên cạnh các phép kiểm tra bạn đã chạy. Một lượt preflight báo rằng văn bản đen được đặt overprint; một lượt render proof cho người vận hành thấy điều đó nghĩa là gì trên trang; và cả hai vào cùng báo cáo. Đối với spot colour, vốn thường đi kèm overprint trong công việc bao bì, bài viết về render spot colour Separation và DeviceN trình bày phía colorant của cùng trang, trong khi các ghi chú về render một trang PDF ra bitmap và về in một PDF đã tải qua TPrinter trình bày hai đích thiết bị ở dạng thuần, không proof

HotPDF render, proof và in các trang PDF đã tải từ mã VCL bản địa cho Delphi và C++Builder, không có DLL render bên ngoài cần triển khai cùng ứng dụng — trang thành phần HotPDF có danh sách tính năng render và một bản build dùng thử