Teknik Makale

Delphi'de Bir PDF'i Tek Bir Renk Uzayına Dönüştürme

RecolorDocument bütün bir PDF'i tek bir renk uzayına taşır ve RecolorPage tek bir sayfa için aynısını yapar. İkisi de gri için 1, RGB için 2 ve CMYK için 3 alır ve kaç rengin dönüştürüldüğünü döndürür. Geometri, metin ve görseller tam olarak oldukları yerde kalır; yalnızca renk değişir

Bu, tek bir uzay bekleyen bir baskı makinesine iş göndermeden önce veya renkli bir belgenin yeniden üretilmeden gri olması gerektiğinde istediğiniz işlemdir. Alternatifi olan belgeyi kaynak verisinden hedef uzayda yeniden inşa etmek, yalnızca kaynak veriye hâlâ sahip olduğunuzda kullanılabilir; dışarıdan alınan herhangi bir şey için bu mümkün değildir

Neyi dönüştürülür ve hangi sırada?

Önce renk işleçleri: bir sayfanın çizilirken ayarladığı dolgular ve konturlar. Hedef uzayda zaten olan bir renk olduğu gibi bırakılır, dolayısıyla renklerinin değişikliğe ihtiyacı olmayan bir sayfa, özdeş değerlere yeniden yazılmak yerine özgün baytlarını korur. Bu özellik büyük bir belgede kulağa geldiğinden daha fazla önem taşır, çünkü dokunulmamış nesneler dosyada dokunulmamış kalır

Sıradaki görsellerdir ve eskiden eksik olan bölüm budur. Yalnızca işleçleri dönüştürülmüş griye çevrilmiş bir belge, gri sayfalarda hâlâ renkli resimler gösteriyordu; iki uca göre de daha kötü. Bir görsel, her bileşen başına sekiz bit, bir aygıt renk uzayı ve ya hiç sıkıştırma ya da düz Flate taşıdığında dönüştürülür

İndeksli görseller, renk tabloları üzerinden dönüştürülür: palet dönüştürülür ve her örnek hâlâ sahip olduğu indeksi korur. Bu, bir ekran görüntüsünün veya grafiğin genellikle kaydedildiği palet görsellerini kapsar ve örnekleri ne ile paketlenmiş veya sıkıştırılmış olursa olsun dönüştürür, çünkü örnekler asla değişmez

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;

Bir JPEG neden olduğu gibi bırakılır?

Çünkü renklerini dönüştürmek onu yeniden kodlamak anlamına gelir ve yeniden kodlamak farklı sonuçları olan başka bir işlemdir. Bir JPEG veya faks görseli kendi baytlarını korur: kod çözme, dönüştürme ve yeniden sıkıştırma görsel verisinin kendisini değiştirir, ikinci bir nesil kayıplı yapı öğesi ekler ve dosya boyutunu çağıranın istemediği biçimlerde değiştirir

Yumuşak maskeler ve şablon maskeler başka bir nedenden dolayı olduğu gibi bırakılır. İkisi de renk olarak değil kapsam olarak okunur ve birini dönüştürmek sayfanın maskeyi resim olarak göstermesiyle sonuçlanırdı; şekillendirmesi gereken içeriğin üstünde gri sanat eseri olarak işlenen bir saydamlık maskesi. Onları bıraklamak aşılması gereken bir sınırlama değildir; doğru sonuçtur

ICCBased, Separation, Indexed veya Pattern uzayı üzerinden ayarlanan renkler de işlemci düzeyinde olduğu gibi bırakılır. Profilini okumadan bunları dönüştürmek sayfanın nasıl göründüğünü korumak yerine değiştirmek olur ve tüm vaadi korumak olan bir yeniden renklendirme geçişi, profilleri tahmin etmeye başlayamaz

Gradyanlar arkalarındaki duraklarla dönüşür

Bir gradyan, bir renk uzayı artı onun içinde renk üreten bir işlevdir ve birini diğerisiz dönüştürmek saçmalık üretir; durakları geride bırakılmış dönüştürülmüş bir gradyan, bir kanalın gri düzey olarak yanlış okunması gibi okunur ve sayfada tamamen yanlış renkte bir şerit olarak görünür. Gradyanın renk uzayı ve arkasındaki duraklar birlikte taşınır

Gradyanlar nerede yaşarlarsa yaşasınlar bulunur: kendilerine ait bir nesne olarak verildiğinde, onları boyayan dokununun içine yazıldığında veya bir sayfanın gölgelendirme kaynaklarında oturduğunda. Bu kapsama önemlidir çünkü tasarım araçları onları farklı dağıtır ve yalnızca bir yerleşimi ele alan bir dönüştürücü, başarısızların bariz bir örüntüsü olmadan bir belgeyi yarı dönüştürülmüş bırakırdı

İki tür kasıtlı olarak olduğu gibi bırakılır. Örneklenmiş veya PostScript işlevinden yapılmış bir gradyan kendi tanımını korur; renklerini bir işlevde değil bir akışta taşıyan ağ türleri de öyle. İkisini yeniden yazmak bir rengi dönüştürmekten farklı bir işlemdir ve sessizce bir yeniden renklendirme geçişinin içinde yapmak bir sürpriz olurdu

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

Yeniden renklendirmenin baskı gönderiminden önceki yeri

Onu renk yönetimi olarak değil, bir normalleştirme adımı olarak kullanın. Yeniden renklendirme değerleri aygıt uzayları arasında dönüştürür; bir ICC profili uygulamaz, bir işleme niyetine uyulmaz veya bir baskı koşulunu taklit etmez. Sözleşme proovunu tutturması gereken bir iş için profille çalışan akış yanıt ve yeniden renklendirme en fazla her şeyi önce tek uzaya sokan adımdır

Kendi yerini kazandığı yer sıradan üretim sorunudur: gri olması gereken ve bir RGB logo ile gelen bir gönderim, renkli basılmaması gereken bir iç belge, bir preflight adımının kabul etmesinden önce tek uzayda olması gereken bir dosya topluğu. Onu bir denetimle eşleştirin; PDF/A ve PDF/UA preflight ve uyumluluk ve imza çalışma tezgahı notları kararı aynı işin parçası olarak çalıştırmayı ele alır

Belgenin vektör çizimlerinin dönüştürülmeden incelenmesi de gerekiyorsa vektör grafikler, gölgelendiriciler ve gradyanlar yazısı bu nesnelerin ilk başta nasıl yapıldığını ele alır; bu da bir yeniden renklendirme geçişinin neye ulaşıp neye ulaşamayacağını anlamak için yararlı bir bağlamdır

PDFlibPas, Delphi, C++Builder ve Lazarus için harici bir çalışma zamanı olmaksızın yerel bir Pascal PDF kitaplığıdır, dolayısıyla bir renk normalleştirme adımı kendi hizmetiniz içinde çalışır; bir dönüştürücüye dışarıdan komut vermek yerine; tam belge işleme API'si için PDFlibPas ürün sayfasına bakın