บทความเทคนิค

แปลง PDF ให้อยู่ในคอลัรสเปซเดียวใน Delphi

RecolorDocument ย้าย PDF ทั้งไฟล์เข้าสู่คอลัรสเปซเดียว และ RecolorPage ทำเช่นเดียวกันกับเพียงหน้าเดียว ทั้งสองรับค่า 1 สำหรับเกรย์, 2 สำหรับ RGB และ 3 สำหรับ CMYK และคืนจำนวนสีที่แปลง เรขาคณิต ข้อความ และรูปภาพยังอยู่ที่เดิมพอดี เปลี่ยนเพียงสีเท่านั้น

นี่คือการดำเนินการที่คุณต้องการก่อนส่งงานไปยังแท่นพิมพ์ที่คาดหวังสเปซเดียว หรือเมื่อเอกสารสีต้องกลายเป็นเอกสารเกรย์โดยไม่ต้องสร้างใหม่ ทางเลือกอื่น — สร้างเอกสารใหม่จากข้อมูลต้นทางในสเปซเป้าหมาย — ทำได้ก็ต่อเมื่อยังมีข้อมูลต้นทางอยู่ ซึ่งสำหรับสิ่งที่รับเข้ามาจากภายนอกคุณไม่มี

อะไรบ้างที่ถูกแปลง และในลำดับใด

colour operator ก่อน คือ fill และ stroke ที่หน้ากำหนดขณะวาด สีที่อยู่ในสเปซเป้าหมายแล้วถูกปล่อยไว้ ดังนั้นหน้าที่สีไม่ต้องเปลี่ยนจะยังคงไบต์เดิมไว้แทนที่จะถูกเขียนใหม่เป็นค่าเดียวกัน คุณสมบัตินี้สำคัญกว่าที่เสียงมันฟังดูบนเอกสารขนาดใหญ่ เพราะออบเจกต์ที่ไม่ถูกแตะก็จะไม่ถูกแตะในไฟล์

รูปภาพมาถัดไป และมันคือส่วนที่ครั้งหนึ่งเคยขาดหายไป เอกสารที่เปลี่ยนเป็นเกรย์โดยแปลงเพียง operator ยังคงแสดงรูปสีบนหน้าเกรย์ ซึ่งแย่ไปกว่าทั้งสองสุดโต่ง รูปภาพจะถูกแปลงเมื่อมันพกแปดบิตต่อคอมโพเนนต์, device colour space และไม่มีการบีบอัดหรือมีเพียง Flate ธรรมดา

รูป indexed แปลงผ่าน colour table ของมัน คือ palette ถูกแปลงและทุกแซมเปิลยังคง index ที่มันถืออยู่เดิม นี่ครอบคลุมรูปแบบ palette ที่ 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 หรือรูปแฟกซ์ยังคงไบต์ของตัวเองไว้ การถอดรหัส แปลง และบีบอัดใหม่จะเปลี่ยนข้อมูลรูปเอง แนะนำสัญญาณรบกวน lossy รุ่นที่สอง และเปลี่ยนขนาดไฟล์ในทางที่ผู้เรียกไม่ได้ขอ

soft mask และ stencil mask ถูกปล่อยไว้ด้วยเหตุผลอื่น ทั้งสองถูกอ่านเป็นความครอบคลุมไม่ใช่สี และการแปลงมันจะทำให้หน้าแสดง mask เป็นรูปภาพ — transparency mask ที่ถูกเรนเดอร์เป็นงานศิลปะเกรย์ทับบนเนื้อหาที่มันควรจะหล่อหลอม การปล่อยมันไว้ไม่ใช่ข้อจำกัดที่ต้องหาทางเลี่ยง มันคือผลลัพธ์ที่ถูกต้อง

สีที่กำหนดผ่านสเปซ ICCBased, Separation, Indexed หรือ Pattern ยังคงถูกปล่อยไว้เช่นเดิมที่ระดับ operator การแปลงเหล่านั้นโดยไม่อ่านโปรไฟล์จะเปลี่ยนว่าหน้าดูอย่างไรแทนที่จะรักษามัน และการผ่านการรีคัลเลอร์ที่สัญญาเรื่องการรักษาไว้ทั้งหมดจะเริ่มเดาโปรไฟล์ไม่ได้

เกรเดียนต์แปลงพร้อมกับ stop เบื้องหลัง

เกรเดียนต์คือ colour space รวมกับฟังก์ชันที่ผลิตสีในนั้น และการแปลงอันหนึ่งโดยปล่อยอีกอันไว้จะให้ผลลัพธ์ไร้สาระ — เกรเดียนต์ที่แปลงแต่ stop ถูกทิ้งไว้อ่านเป็นช่องที่ถูกเข้าใจผิดเป็นระดับเกรย์ ซึ่งบนหน้าดูเหมือนแถบสีที่ผิดทั้งแถบ colour space ของเกรเดียนต์และ stop เบื้องหลังเคลื่อนไปด้วยกัน

เกรเดียนต์ถูกค้นหาในทุกที่ที่มันอยู่ ไม่ว่าจะเป็นออบเจกต์ของตัวเอง เขียนไว้ในแพตเทิร์นที่วาดมัน หรืออยู่ใน shading resource ของหน้า ความครอบคลุมนี้สำคัญเพราะเครื่องมือออกแบบกระจายมันต่างกัน และตัวแปลงที่จัดการเพียงตำแหน่งเดียวจะทิ้งเอกสารให้แปลงได้ครึ่งเดียวโดยไม่มีรูปแบบที่ชัดเจนในความล้มเหลว

สองชนิดถูกตั้งใจปล่อยไว้เช่นเดิม เกรเดียนต์ที่สร้างจากฟังก์ชันแบบ sampled หรือ PostScript ยังคงนิยามของตัวเองไว้ เช่นเดียวกับชนิด mesh ที่พกสีใน stream แทนที่จะเป็นในฟังก์ชัน การเขียนทั้งสองใหม่เป็นการดำเนินการอื่นที่ต่างจากการแปลงสี และการทำมันอย่างเงียบ ๆ ภายในการผ่านรีคัลเลอร์จะเป็นเรื่องที่ไม่คาดคิด

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

จุดที่รีคัลเลอร์สอดสนิทก่อนส่งไปแท่นพิมพ์

ใช้มันเป็นขั้นตอนทำให้เป็นมาตรฐาน ไม่ใช่การจัดการสี การรีคัลเลอร์แปลงค่าระหว่าง device space มันไม่ได้ปรับใช้โปรไฟล์ ICC ไม่เคารพ rendering intent และไม่จำลองสภาพแท่นพิมพ์ สำหรับงานที่ต้องเข้าเกณฑ์ contract proof เวิร์กโฟลว์ที่ขับเคลื่อนด้วยโปรไฟล์คือคำตอบ และรีคัลเลอร์เป็นเพียงขั้นตอนที่นำทุกอย่างเข้าสเปซเดียวก่อนเท่านั้น

จุดที่มันคุ้มค่าอยู่ในปัญหาการผลิตทั่วไป การส่งที่ต้องเป็นเกรย์แต่มาพร้อมโลโก้ RGB เอกสารภายในที่ห้ามพิมพ์เป็นสี ชุดไฟล์ที่ต้องเป็นสเปซเดียวก่อนที่ขั้นตอน preflight จะรับ เพื่อคู่กับการตรวจสอบ — บันทึกของ PDF/A และ PDF/UA preflight และของ workbench การปฏิบัติตามมาตรฐานและการลงลายเซ็น ครอบคลุมการรันคำตัดสินเป็นส่วนหนึ่งของงานเดียวกัน

หากเอกสารยังต้องให้ตรวจสอบงานศิลปะเวกเตอร์แทนที่จะแปลง คู่มือ เวกเตอร์กราฟิก shader และเกรเดียนต์ ครอบคลุมว่าออบเจกต์เหล่านั้นถูกสร้างขึ้นอย่างไรตั้งแต่แรก ซึ่งเป็นบริบทที่เป็นประโยชน์ต่อการเข้าใจว่าการผ่านรีคัลเลอร์เข้าถึงอะไรได้และไม่ได้

PDFlibPas เป็นไลบรารี PDF แบบ Pascal พื้นเมืองสำหรับ Delphi, C++Builder และ Lazarus โดยไม่มีรันไทม์ภายนอก ขั้นตอนทำให้สีเป็นมาตรฐานจึงรันภายในบริการของคุณเองแทนที่จะเรียกตัวแปลงภายนอก — ดู หน้าผลิตภัณฑ์ PDFlibPas สำหรับ API การประมวลผลเอกสารฉบับสมบูรณ์