مقاله فنی

تبدیل PDF به یک فضای رنگ در Delphi

RecolorDocument یک PDF کامل را به یک فضای رنگ می‌برد، و RecolorPage همان کار را برای یک صفحه واحد انجام می‌دهد. هر دو 1 برای خاکستری، 2 برای RGB و 3 برای CMYK می‌گیرند، و برمی‌گردانند چند رنگ تبدیل شده. هندسه، متن و تصاویر دقیقاً سر جای خود می‌مانند؛ فقط رنگ تغییر می‌کند

این عملیاتی است که قبل از فرستادن کار به یک چاپخانه که یک فضای واحد انتظار دارد می‌خواهید، یا وقتی یک سند رنگی باید بدون تولید دوباره به خاکستری تبدیل شود. جایگزین — بازسازی سند از داده منبعش در فضای هدف — تنها زمانی در دسترس است که هنوز داده منبع را داشته باشید، که برای هر چیزی از بیرون دریافت کرده‌اید ندارید

چه چیزی تبدیل می‌شود، و به چه ترتیبی

اول عملگرهای رنگ: پرکننده‌ها و خطوطی که یک صفحه هنگام رسم تنظیم می‌کند. یک رنگ که از قبل در فضای هدف است دست‌نخورده باقی می‌ماند، پس صفحه‌ای که رنگ‌هایش نیازی به تغییر ندارند بایت‌های اصلی خود را نگه می‌دارد به‌جای بازنویسی به مقادیر یکسان. آن ویژگی در یک سند بزرگ بیشتر از آنچه به‌نظر می‌رسد اهمیت دارد، چون اشیاء دست‌نخورده در فایل دست‌نخورده باقی می‌مانند

تصاویر بعد می‌آیند، و بخشی هستند که قبلاً غایب بود. سندی که تنها با عملگرهای تبدیل‌شده خاکستری شده بود هنوز تصاویر رنگی را روی صفحه‌های خاکستری نشان می‌داد، که بدتر از هر دو حالت افراطی است. یک تصویر زمانی تبدیل می‌شود که هشت بیت در هر مؤلفه، یک فضای رنگ دستگاه، و یا هیچ فشرده‌سازی یا Flate ساده حمل کند

تصاویر نمایه‌شده از طریق جدول رنگشان تبدیل می‌شوند: پالت تبدیل می‌شود و هر نمونه اندیسی را که از قبل داشته نگه می‌دارد. این تصاویر پالت‌ای را که یک screenshot یا نمودار معمولاً به آن فرمت ذخیره می‌شود پوشش می‌دهد، و آن‌ها را فارغ از اینکه نمونه‌هایشان با چه چیزی بسته یا فشرده شده‌اند تبدیل می‌کند، چون نمونه‌ها هرگز تغییر نمی‌کنند

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 یا fax بایت‌های خودش را نگه می‌دارد: رمزگشایی، تبدیل و فشرده‌سازی دوباره داده تصویر را تغییر می‌داد، یک نسل دوم artifactهای با‌خسرانه معرفی می‌کرد، و اندازه فایل را به روش‌هایی تغییر می‌داد که فراخواننده درخواست نکرده بود

ماسک‌های نرم و ماسک‌های استنسیل به دلیل متفاوتی دست‌نخورده باقی می‌مانند. هر دو به‌عنوان پوشش به‌جای رنگ خوانده می‌شوند، و تبدیل یکی صفحه را به‌نمایش ماسک به‌عنوان تصویر وامی‌داشت — یک ماسک شفافیت به‌عنوان اثر هنری خاکستری روی محتوایی که قرار بود شکل دهد رندر می‌شد. دست‌نگذاشتن آن‌ها محدودیتی برای دور زدن نیست؛ نتیجه درست است

رنگ‌هایی که از طریق یک فضای ICCBased، Separation، Indexed یا Pattern تنظیم شده‌اند نیز در سطح عملگر همان‌طور که هستند باقی می‌مانند. تبدیل آن‌ها بدون خواندن پروفایلشان به‌جای حفظ نما، نحوه نما صفحه را تغییر می‌داد، و یک پاس recolor که کل قولش حفظ است نمی‌تواند به حدس درباره پروفایل‌ها شروع کند

گرادیان‌ها با توقف‌های پشتشان تبدیل می‌شوند

یک گرادیان یک فضای رنگ به‌اضافه تابعی است که در آن رنگ تولید می‌کند، و تبدیل یکی بدون دیگری بی‌معنا تولید می‌کند — یک گرادیان تبدیل‌شده که توقف‌هایش جا مانده به‌عنوان یک کانال اشتباه گرفته‌شده به‌عنوان یک سطح خاکستری خوانده می‌شود، که روی یک صفحه مانند یک نوار از رنگ کاملاً اشتباه به‌نظر می‌رسد. فضای رنگ گرادیان و توقف‌های پشت آن با هم حرکت می‌کنند

گرادیان‌ها هر جا که زندگی می‌کنند یافت می‌شوند: به‌عنوان شیء مستقل خودشان، نوشته‌شده درون الگویی که آن‌ها را رنگ می‌کند، یا نشسته در منابع سایه‌زنی یک صفحه. آن پوشش مهم است چون ابزارهای طراحی آن‌ها را متفاوت توزیع می‌کنند، و یک مبدل که فقط یک placement را مدیریت می‌کرد سندی را نیمه‌تبدیل با هیچ الگوی مشخصی در شکست‌ها به‌جا می‌گذاشت

دو نوع عمداً همان‌طور که هستند باقی می‌مانند. یک گرادیان ساخته‌شده از یک تابع نمونه‌برداری‌شده یا PostScript تعریف خودش را نگه می‌دارد، و همین‌طور انواع mesh، که رنگ‌هایشان را در یک stream به‌جای یک تابع حمل می‌کنند. بازنویسی هر یک عملیاتی متفاوت از تبدیل یک رنگ است، و انجام خاموش آن درون یک پاس recolor یک غافلگیری بود

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

recolor کجا قبل از ارسال به چاپخانه جای می‌گیرد

از آن به‌عنوان یک مرحله نرمال‌سازی استفاده کنید، نه مدیریت رنگ. recolor مقادیر را بین فضاهای دستگاه تبدیل می‌کند؛ یک پروفایل ICC اعمال نمی‌کند، یک rendering intent را رعایت نمی‌کند یا یک شرایط چاپخانه را شبیه‌سازی نمی‌کند. برای کاری که باید یک proof قراردادی را بزند، workflow مبتنی بر پروفایل پاسخ است و recolor نهایتاً مرحله‌ای است که همه‌چیز را ابتدا به یک فضای واحد می‌برد

جایی که جای خود را به‌دست می‌آورد مسئله تولید معمولی است: یک ارسال که باید خاکستری باشد و با یک لوگوی RGB می‌رسد، یک سند داخلی که نباید رنگی چاپ شود، یک دسته فایل که باید یک فضای واحد باشد قبل از اینکه یک مرحله preflight آن‌ها را بپذیرد. آن را با یک بررسی جفت کنید — یادداشت‌های preflight برای PDF/A و PDF/UA و workbench انطباق و امضا اجرای حکم به‌عنوان بخشی از همان کار را پوشش می‌دهند

اگر سند همچنین نیاز دارد اثر هنری برداری‌اش بررسی شود نه تبدیل، مرور گرافیک برداری، shaderها و گرادیان‌ها پوشش می‌دهد آن اشیاء اصلاً چگونه ساخته می‌شوند، که زمینه مفیدی برای فهم آن است یک پاس recolor به چه چیزی می‌رسد و به چه چیزی نمی‌رسد

PDFlibPas یک کتابخانه PDF بومی Pascal برای Delphi، C++Builder و Lazarus بدون هیچ runtime خارجی است، تا یک مرحله نرمال‌سازی رنگ درون سرویس خودتان اجرا می‌شود به‌جای فراخوانی یک مبدل خارجی — صفحه محصول PDFlibPas را برای API کامل پردازش سند ببینید