Bài viết kỹ thuật

Chuyển đổi PDF sang một không gian màu trong Delphi

RecolorDocument đưa toàn bộ một PDF sang một không gian màu, còn RecolorPage làm điều tương ứng cho một trang đơn lẻ. Cả hai nhận 1 cho grey, 2 cho RGB và 3 cho CMYK, đồng thời trả về số màu đã được chuyển đổi. Hình học, văn bản và hình ảnh nằm nguyên tại vị trí; chỉ có màu thay đổi

Đây là thao tác bạn cần trước khi gửi tác phẩm tới một máy in kỳ vọng một không gian màu duy nhất, hoặc khi một tài liệu màu phải trở thành tài liệu đen trắng mà không cần tạo lại từ đầu. Phương án thay thế — xây lại tài liệu từ dữ liệu nguồn trong không gian mục tiêu — chỉ khả dụng khi bạn vẫn còn dữ liệu nguồn, điều mà với bất cứ thứ gì nhận từ bên ngoài bạn đều không có

Cái gì được chuyển, và theo thứ tự nào

Toán tử màu đi trước: các fill và stroke mà một trang đặt trong khi vẽ. Một màu đã ở trong không gian mục tiêu được giữ nguyên, nên một trang mà màu không cần thay đổi sẽ giữ các byte gốc thay vì bị ghi lại với giá trị y hệt. Tính chất đó quan trọng hơn vẻ bề ngoài trên một tài liệu lớn, vì các object không bị chạm tới vẫn cứ không bị chạm tới trong file

Hình ảnh đi tiếp theo, và chúng là phần từng bị thiếu. Một tài liệu chuyển sang grey với chỉ các toán tử được chuyển vẫn hiện hình màu trên các trang grey, điều tệ hơn cả hai trường hợp cực đoan. Một hình ảnh được chuyển khi nó mang tám bit mỗi component, một không gian màu thiết bị, và hoặc không nén hoặc chỉ nén Flate đơn thuần

Hình indexed chuyển đổi thông qua bảng màu của nó: bảng màu được chuyển và mỗi sample giữ nguyên chỉ mục mà nó đã có. Điều đó bao phủ các hình palette mà ảnh chụp màn hình hay biểu đồ thường được lưu thành, và chuyển đổi chúng bất chấp sample được đóng gói hay nén ra sao, vì các sample không bao giờ thay đổi

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;

Vì sao một JPEG lại được giữ nguyên?

Vì chuyển màu của nó sẽ đồng nghĩa với mã hóa lại, và mã hóa lại là một thao tác khác với những hệ quả khác. Một ảnh JPEG hoặc fax giữ nguyên các byte của riêng nó: giải mã, chuyển đổi rồi nén lại sẽ thay đổi chính dữ liệu ảnh, đưa vào một thế hệ thứ hai các artifact lossy, và thay đổi kích thước file theo những cách mà bên gọi không hề yêu cầu

Soft mask và stencil mask được giữ nguyên vì một lý do khác. Cả hai được đọc như độ phủ chứ không phải như màu, và chuyển một cái sẽ khiến trang hiển thị mask như một bức tranh — một mặt nạ trong suốt được render thành artwork grey nằm trên nội dung mà nó đáng lẽ phải định hình. Việc để chúng nguyên hiện trạng không phải là một hạn chế cần lách; đó là kết quả đúng

Các màu đặt qua một không gian ICCBased, Separation, Indexed hoặc Pattern cũng được giữ nguyên ở cấp toán tử. Chuyển những màu đó mà không đọc profile của chúng sẽ thay đổi việc trang hiển thị thay vì bảo toàn nó, và một lượt đổi màu mà cả lời hứa của nó là bảo toàn thì không thể bắt đầu đoán bừa về profile

Dải chuyển màu đi cùng các điểm dừng phía sau

Một dải chuyển màu là một không gian màu cộng với một hàm tạo ra màu trong đó, và chuyển một thứ mà không chuyển thứ kia sẽ tạo ra vô nghĩa — một dải đã chuyển mà các điểm dừng bị bỏ lại đọc lên như một kênh bị hiểu nhầm thành một cấp grey, và trên trang thì trông như một dải màu sai hoàn toàn. Không gian màu của dải và các điểm dừng phía sau nó di chuyển cùng nhau

Dải chuyển màu được tìm thấy ở bất cứ nơi nào chúng tồn tại: cho làm một object riêng, nằm trong pattern vẽ ra chúng, hoặc ngồi trong shading resource của một trang. Sự bao phủ đó quan trọng vì các công cụ thiết kế phân phối chúng khác nhau, và một bộ chuyển đổi chỉ xử lý một vị trí sẽ để lại một tài liệu chuyển đổi nửa chừng mà không có quy luật nào trong các điểm thất bại

Hai loại được cố tình giữ nguyên. Một dải xây từ hàm sampled hoặc PostScript giữ nguyên định nghĩa của nó, và các loại mesh cũng vậy, vốn mang màu trong một stream thay vì trong một hàm. Viết lại một trong hai là một thao tác khác với chuyển đổi màu, và làm điều đó âm thầm bên trong một lượt đổi màu sẽ là một sự bất ngờ

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

Nơi đổi màu phù hợp trước khi nộp cho xưởng in

Hãy dùng nó như một bước chuẩn hóa, chứ không phải như quản lý màu. Đổi màu chuyển giá trị giữa các không gian thiết bị; nó không áp dụng một profile ICC, không tôn trọng một rendering intent hay mô phỏng điều kiện in. Với một tác phẩm cần đạt một contract proof, pipeline hướng profile mới là câu trả lời, và đổi màu cùng lắm chỉ là bước đưa mọi thứ vào cùng một không gian trước

Nơi nó thực sự có giá trị là vấn đề sản xuất thông thường: một bản nộp phải là grey nhưng đến với một logo RGB, một tài liệu nội bộ tuyệt đối không được in màu, một lô tệp phải nằm trong cùng một không gian trước khi một bước preflight chấp nhận chúng. Hãy ghép nó với một phép kiểm tra — các ghi chú về PDF/A và PDF/UA preflight và về bàn làm việc tuân thủ và ký trình bày cách chạy phán quyết như một phần của cùng tác vụ

Nếu tài liệu cũng cần artwork vector được kiểm tra thay vì chuyển đổi, bài viết về vector graphics, shader và gradient trình bày cách các object đó được xây nên từ đầu, đây là ngữ cảnh hữu ích để hiểu một lượt đổi màu với có thể và không thể chạm tới cái gì

PDFlibPas là thư viện PDF Pascal bản địa cho Delphi, C++Builder và Lazarus không cần runtime bên ngoài, nên một bước chuẩn hóa màu chạy bên trong dịch vụ của chính bạn thay vì gọi ra một bộ chuyển đổi — xem trang sản phẩm PDFlibPas để biết API xử lý tài liệu đầy đủ