RecolorDocument는 PDF 전체를 하나의 색 공간으로 옮기고, RecolorPage는 단일 페이지에 대해 같은 일을 합니다. 둘 다 그레이는 1, RGB는 2, CMYK는 3을 받으며 변환된 색의 수를 반환합니다. 지오메트리, 텍스트, 이미지는 정확히 제자리에 있고 색만 바뀝니다
이 작업은 하나의 색 공간을 기대하는 인쇄기에 작업을 넘기기 전이나, 색 문서를 다시 생성하지 않고 그레이로 바꿔야 할 때 원하는 연산입니다. 대안인 대상 색 공간에서 원본 데이터로 문서를 다시 만드는 방식은 원본 데이터가 여전히 있을 때만 가능하며, 외부에서 받은 어떤 것에 대해서도 그렇지 않습니다
무엇이 변환되고 어떤 순서인가
색 연산자가 먼저입니다. 페이지가 그리는 동안 설정하는 채우기와 획입니다. 이미 대상 색 공간에 있는 색은 그대로 두어, 색 변경이 필요 없는 페이지는 동일한 값으로 다시 쓰이는 대신 원래 바이트를 유지합니다. 이 속성은 대형 문서에서 들리는 것보다 중요한데, 손대지 않은 객체는 파일에서 손대지 않은 채로 남기 때문입니다
이미지가 다음이며, 과거에 빠져 있던 부분입니다. 연산자만 변환되어 그레이로 바뀐 문서는 여전히 그레이 페이지 위에 색 그림을 보여주었으며, 이는 양 극단 어느 쪽보다도 못합니다. 이미지는 컴포넌트당 8비트, 디바이스 색 공간, 그리고 압축 없음 또는 단순 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 함수로 만들어진 그라데이션은 자기 정의를 유지하며, 메시 타입도 마찬가지입니다. 메시는 함수가 아니라 스트림 안에 색을 담습니다. 둘 중 어느 것을 다시 쓰는 것은 색을 변환하는 것과 다른 연산이며, 재채색 패스 안에서 조용히 실행하면 놀라움이 될 것입니다
// 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');
인쇄 제출 전 재채색이 들어맞는 곳
색 관리가 아니라 정규화 단계로 사용하십시오. 재채색은 디바이스 공간 사이의 값을 변환하며, ICC 프로필을 적용하거나 렌더링 인텐트를 존중하거나 인쇄 조건을 시뮬레이션하지 않습니다. 계약 교정 인쇄를 맞춰야 하는 작업에는 프로필 기반 워크플로가 답이며, 재채용은 기껏해야 모든 것을 먼저 하나의 공간으로 옮기는 단계입니다
이 연산이 자리를 차지하는 곳은 일상적인 생산 문제입니다. 그레이여야 하는 제출물이 RGB 로고와 함께 도착할 때, 색으로 인쇄되어서는 안 되는 내부 문서, 프리플라이트 단계가 받기 전에 하나의 색 공간이어야 하는 파일 묶음이 그것입니다. 검사와 짝을 이루어 사용하십시오. PDF/A와 PDF/UA 프리플라이트와 규정 준수와 서명 워크벤치에 관한 글이 동일한 작업의 일부로 판정을 실행하는 것을 다룹니다
문서가 변환보다 벡터 아트워크 검사를 필요로 한다면, 벡터 그래픽, 셰이더, 그라데이션 산책문이 그 객체들이 애초에 어떻게 만들어지는지 다루며, 이는 재채색 패스가 어디까지 미치고 어디서부터 미치지 못하는지 이해하는 데 유용한 맥락입니다
PDFlibPas는 외부 런타임 없이 Delphi, C++Builder, Lazarus를 위한 네이티브 Pascal PDF 라이브러리이므로 색 정규화 단계는 변환기에 셸 아웃하는 대신 여러분의 서비스 안에서 실행됩니다. 전체 문서 처리 API는 PDFlibPas 제품 페이지를 보십시오