PDFXCompliance değeri 'X-1a' olarak ayarlandığında HotPDF, içerik rengini işin tam sonunda doğrular: EndDoc, THotPDF.EnsurePDFX1aContentColorSpaces çağrısını yapar; bu metot, herhangi bir sayfada herhangi bir yerdeki DeviceRGB, CalRGB ya da ICCBased RGB içeriğini reddeder ve suçlu kaynağı adlandıran bir istisna fırlatır. Dosya, matbaanın kabul etmeyeceği bir PDF/X-1a belgesi olarak hiçbir zaman yazılmaz
Son kısım zaten asıl mesele. Tek başına duran bir RGB logosu taşıyan bir PDF/X-1a dosyası ekranda kusursuz görünür, samimi bir incelemeyi geçer ve sonra, baskı slotundan iki gün önce matbaada preflight'ta kalır. Onu Delphi derlemenizde, hangi sayfayı ve hangi görüntüyü söylerken yakalamak, sinirli bir ön baskı operatöründen öğrenmekten çok daha ucuzdur
PDF/X-1a RGB içeriğini neden reddediyor?
PDF/X-1a RGB'yi reddeder, çünkü biçim, her rengin belirli bir CMYK baskı koşulu için çoktan nihai olacağının sözünü verir. ISO 15930-1:2001 §6.2.3, içerik rengini DeviceCMYK, DeviceGray ve spot renk vericileriyle sınırlar; yani alternatifi CMYK ya da Gray olan Separation ve DeviceN uzayları. Dosyanın içine gömülü GTS_PDFX OutputIntent o baskı koşulunu adlandırır, örneğin FOGRA39 coated offset; alıcı iş akışı, sayıları herhangi bir renk dönüşümü olmadan doğrudan kalıba gönderme hakkına sahiptir
RGB o sözü bozar. Bir RGB değeri, bir mürekkep tarifi değil, bir ekrana ya da çalışma uzayına göreli bir renk anlatır; bu yüzden aşağı akışta birinin onu nasıl ayıracağına karar vermesi gerekir ve X-1a tam da o kararı alıcıdan almak için vardır. ISO 32000-1 §8.6, PDF renk uzaylarını device, CIE tabanlı ve özel ailelere ayırır ve RGB üyeleri birden fazla ailede görünür: DeviceRGB bir device uzayıdır; üç bileşenli CalRGB ve ICCBased CIE tabanlıdır; bir Indexed ya da Separation uzayı ise altında bir RGB taban ya da alternatif saklayabilir. Yalnızca rg operatörüne bakan bir denetçi, bunların çoğunu ıskalar. Sonraki PDF/X-1a:2003 baskısı (ISO 15930-4) aynı renk kuralını korur; HotPDF'nin 'X-1a' değerinin XMP paketine PDF/X-1a:2001 kimliğini yazdığını not edin
İçeriğiniz gerçekten RGB ise ve öyle kalmalıysa, X-1a yanlış hedeftir. HotPDF bu kontrolü yalnızca 'X-1a' için uygular; ICC tabanlı ve kalibre renge izin veren 'X-3' ile 'X-4' etkilenmez
EnsurePDFX1aContentColorSpaces gerçekte neyi kontrol eder
EnsurePDFX1aContentColorSpaces, bir çizim anı bayrağını her sayfanın kaynaklarından geçen özyinelemeli bir gezintiyle birleştirir ve PDF/X kapısında en son çalışır. EndDoc önce genel PDF/X gereksinimlerini zorunlu kılar: Title tanımlı olmalı, Trapped değeri 'True', 'False' ya da 'Unknown' olmalı, bir GTS_PDFX OutputIntent bulunmalı (EnsurePDFXOutputIntent) ve her sayfanın TrimBox ya da ArtBox'u olmalı (EnsurePDFXPageBoxes). Renk kontrolü ancak bunlar geçtikten sonra çalışır
İlk yol, belge geneli bir bayraktır. HotPDF'nin RGB renk atayıcıları, bitmap görüntü gömme ve annotation renk girişleri, çizerken DeviceRGB kullanımını kaydeder; bu, kaynak sözlüğünde hiç görünmeyen inline rg ve RG operatörlerini kapsar. İkinci yol, her sayfanın /Resources değerini gezdirir ve şunları inceler:
/ColorSpaceiçindeki adlandırılmış renk uzayları; DeviceRGB'nin eş anlamlısı olarak inline görüntü kısaltmasıRGBdahil- Her Image XObject'in
/ColorSpacedeğeri - Form XObjectler ve tiling Patternlar; kendi iç içe
/Resourcesdeğerlerine özyinelemeyle inilerek - Shading Patternlar ve sayfa
/Shadingsözlüğündeki girişler; shading'in/ColorSpacedeğeri üzerinden - Indexed taban uzayları, Separation ve DeviceN alternatifleri ile Pattern taban uzayları; 8 derinliğe dek izlenerek
Üç şey reddedilir: DeviceRGB, CalRGB ve profil akışı N = 3 beyan eden ICCBased uzayları. Form XObjectler ile patternler arasında paylaşılan kaynak sözlükleri bir kez ziyaret edilir; böylece birbirine atıf yapan bir form kümesi gezintiyi döngüye sokmaz. Metot THotPDF üzerinde herkese açıktır ama normal kullanımda siz onu asla çağırmazsınız, çünkü EndDoc bunu sizin yerinize yapar
Kontrolü geçen bir X-1a sayfasını Delphi'de çizmek
Uygun bir HotPDF X-1a belgesi, bir CMYK OutputIntent, her sayfada bir TrimBox ve rengin yalnızca CMYK, Gray ve spot API'leriyle kurulmasını gerektirir. Aşağıdaki iskelet FOGRA39 profilini kullanıyor; AddPDFXOutputIntent, çıkış koşulu kimliğini, bir bilgi dizgesini, ICC profil akışını, bileşen sayısını ve alternatif uzayı alır
var
Pdf: THotPDF;
Profile: TFileStream;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'brochure-x1a.pdf';
Pdf.Title := 'Spring brochure, press edition';
Pdf.Trapped := 'False';
Pdf.PDFXCompliance := 'X-1a';
Pdf.BeginDoc;
Profile := TFileStream.Create('CoatedFOGRA39.icc', fmOpenRead or fmShareDenyWrite);
try
Pdf.AddPDFXOutputIntent('FOGRA39 (ISO 12647-2:2004)',
'Coated FOGRA39 offset', Profile, 4, 'DeviceCMYK');
finally
Profile.Free;
end;
Pdf.CurrentPage.SetTrimBox(0, 0, 612, 792); // her sayfada zorunlu
Pdf.CurrentPage.SetCMYKFillColor(0, 0.5, 0.8, 0.1);
Pdf.CurrentPage.Rectangle(72, 600, 468, 120);
Pdf.CurrentPage.Fill;
Pdf.CurrentPage.SetGrayFillColor(0.2); // DeviceGray metin
Pdf.CurrentPage.SetFont('Arial', [], 14);
Pdf.CurrentPage.TextOut(72, 560, 0, 'Spring catalog, press edition');
Pdf.EndDoc; // renk kontrolü burada çalışır
finally
Pdf.Free;
end;
end;
TColor tabanlı her çağrı, bu bağlamda bir tuzaktır. SetRGBFillColor, SetRGBStrokeColor ve SetRGBColor GDI rengi alır ve DeviceRGB yazar; yıllar önce ekran odaklı raporlar için yazılmış bir yardımcı yordam, yeniden kullanıldığı anda bir baskı işini lekeletir. 0 ile 1 aralığında bileşenlerle SetCMYKFillColor, SetCMYKStrokeColor ya da SetCMYKColor kullanın ya da Gray eşdeğerlerini
Spot renkler ve CMYK degradeler
Spot renk vericileri, alternatifi CMYK ya da Gray olduğu sürece X-1a'da serbesttir. RegisterSeparation Separation uzayını kurar ve kaynak adını döndürür; RegisterAxialGradient shading renk uzayını, geçtiğiniz bileşen sayısından seçer ve dört bileşen DeviceCMYK demektir
var
SpotCS, Ramp: AnsiString;
begin
// Alternate'i yaklaşık bir CMYK kurulumu olan spot mürekkep
SpotCS := Pdf.RegisterSeparation('Corporate Red', 'DeviceCMYK',
[0, 1, 0.8, 0.05]);
Pdf.CurrentPage.SetFillColorSpace(SpotCS);
Pdf.CurrentPage.SetFillColor([1.0]); // %100 tint
Pdf.CurrentPage.Rectangle(72, 420, 200, 80);
Pdf.CurrentPage.Fill;
// Durak başına 4 bileşen: shading DeviceCMYK, DeviceRGB değil
Ramp := Pdf.RegisterAxialGradient(72, 300, 540, 300,
[0, 0, 0, 0], [1, 0.6, 0, 0.2]);
Pdf.CurrentPage.SetFillPattern(Ramp);
Pdf.CurrentPage.Rectangle(72, 260, 468, 80);
Pdf.CurrentPage.Fill;
end;
Aynı gradient çağrısına üç bileşen geçirirseniz DeviceRGB bir shading alırsınız ve kaynak gezintisi onu shading patternin adıyla reddeder. Aynı şey, alternatifi 'DeviceRGB' olarak kaydedilmiş bir Separation için de geçerlidir: spot adı zararsız görünür ama gezinti alternatifi izler ve altında RGB bulur. Görüntüleyici ya da RIP alternate'e düştüğünde spot mürekkeplerin nasıl birleştirildiği, Delphi'de Separation ve DeviceN spot renklerini render etme yazısında ele alınıyor
Raster görüntüler aynı disipline ihtiyaç duyar. HotPDF, Flate ile sıkıştırılmış bitmapleri DeviceRGB'ye sabitler; icJpeg ile gömülen bir JPEG ise kendi bileşen sayısını korur, dolayısıyla dört bileşenli bir CMYK JPEG ya da gri tonlamalı bir JPEG sorun değildir, sıradan bir RGB JPEG değildir. Görseli PDF'e ulaşmadan önce görüntüleme hattınızda baskı profiline çevirin
/DefaultRGB neden bir PDF/X-1a dosyasını kurtarmıyor?
/DefaultRGB, X-1a'ya yardım etmez, çünkü kural, RGB'nin karakterize edilip edilmediğiyle değil, matbaanın ne aldığıyla ilgilidir. PDF/A için HotPDF, RegisterDefaultColorSpace('DefaultRGB', ...) çağrısının DeviceRGB kullanımını emzinesine izin verir: bir Default renk uzayı DeviceRGB'yi bir ICC profiline eşlediğinde içerik aygıttan bağımsız olur ve PDF/A tutarlılık kontrolü onu kabul eder. O iş akışından geçmiş geliştiriciler burada aynı çözümü denemeye eğilimlidir
EnsurePDFX1aContentColorSpaces o eşlemeyi bilinçli olarak yok sayar. Karakterize edilmiş bir RGB değeri hâlâ RGB'dir ve X-1a OutputIntent bir CMYK baskı koşuludur; yine biri onu dönüştürmek zorunda kalır. İki arşiv ve baskı profili arasındaki farkı tek cümleyle hatırlayacaksanız o şu olsun: PDF/A rengin belirsiz olup olmadığını sorar, PDF/X-1a rengin çoktan mürekkep olup olmadığını
Çizim sırası ve saymayan sayfa kurulumu
Kontrol, EndDoc anında çoktan yazılmış içerik üzerinden çalıştığı için kurulumu hangi sırada yaptığınız önemli değildir. PDFXCompliance atanmadan önce ya da OutputIntent kaydedilmeden önce çizilen RGB yine yakalanır. Sayfaları ortak yordamlarda kuran ve çıkış profiline geç karar veren kod için bu önemlidir; bazen belgenin yarısı varken kullanıcı ayarından gelen bir karara
Pdf.BeginDoc;
// ... OutputIntent ve TrimBox önceki gibi ...
Pdf.CurrentPage.SetRGBFillColor(clRed); // eski yardımcı, DeviceRGB yazar
Pdf.CurrentPage.Rectangle(72, 72, 200, 100);
Pdf.CurrentPage.Fill;
Pdf.PDFXCompliance := 'X-1a'; // çizimden sonra kararlaştırıldı
Pdf.EndDoc; // yine fırlatır: DeviceRGB kaydedilmiş
Çizim anı bayrağının, benzer bir kontrolü kendiniz kuracaksanız bilmeniz gereken bir tuzağı var. Her yeni sayfa, SetRGBColor(0) üzerinden siyah bir grafik durumuyla ilklendirilir; bu, bir 0 0 0 rg ile 0 0 0 RG çifti yazar ve o sayfa kurulum kalıbı DeviceRGB bayrağını kurmaya bırakılsaydı her belge, hem bu kontrol için hem PDF/A renk tutarlılık kontrolü için RGB lekeli görünürdü. HotPDF o ilkleme çevresinde bayrağı kaydeder ve geri yükler; yalnızca gerçekten çizdiğiniz renk sayılır
EndDoc fırlattığında RGB içeriği nasıl bulursunuz?
Konumu, istisna mesajının başından okuyun; sorunu iki yoldan hangisinin bulduğunu söyler. Mesaj, PDFXCompliance 'X-1a': <where> uses <what> biçimindedir; ardından ISO 15930-1 atfı ve CMYK ya da Gray'e dönme, X-3 ya da X-4'e geçme tavsiyesi gelir. Validator ilk ihlalde sade bir Exception fırlatır; metnin üzerine eşleşin, istisna sınıfına değil
document content uses DeviceRGB (rg/RG operators, RGB images or annotation colours recorded during drawing), çizim anı bayrağının tetiklendiği anlamına gelir. Sayfa numarası yoktur, çünkü bayrak belge genelidir ve gezintiden önce kontrol edilir. Çizim kodunuzdaSetRGB*çağrılarını, Flate ile sıkıştırılmış bitmapleri, RGB JPEG'leri veTColorannotation renklerini arayınpage 3 image XObject /Im2 uses DeviceRGB contentya dapage 1 shading Pattern /P1 uses DeviceRGB content, kaynak gezintisinden gelir ve tam bir kaynak anahtarına işaret ederColorSpace /...konumundan sonra gelenuses an ICCBased RGB colour space (N=3),RegisterICCProfileile kaydedilipSetFillColorSpaceüzerinden seçilen bir sRGB profilin tipik sonucudur; çizim anı bayrağının görmediği bir yoldur- İç içe konumlar birbirine eklenir, örneğin
page 2 Form XObject /Fm1 ColorSpace /CS1; böylece sayfadan RGB uzayını taşıyan kaynağa kadar yolu izleyebilirsiniz
try
Pdf.EndDoc;
except
on E: Exception do
begin
if Pos('X-1a', E.Message) > 0 then
LogPrepressFailure(Pdf.FileName, E.Message); // kendi günlükçünüz
raise;
end;
end;
Yalnızca ilk ihlal raporlandığı için, birkaç RGB kaynağı olan bir işi düzeltmek yinelemeli bir iştir: düzelt, yeniden derle, sonraki mesajı oku. Toplu işler için her dosyanın tam mesajını günlüğe yazmak ve bilinen suçluların kısa bir listesini tutmak işe yarar; örneğin logo bitmapini ya da hâlâ TColor alan bir grafik yardımcısını
RGB kapısı preflightınızda nereye oturuyor?
EnsurePDFX1aContentColorSpaces, derlemenizin içinde çalışan hedefli bir RGB kapısıdır ve tam bir PDF/X-1a preflight ile eşleşir, birini ikame etmez. RGB ailelerini kapsar; her sayfanın /Resources değerinden geçen kaynak gezintisiyle ve HotPDF renk atayıcılarının inline rg ile RG operatörleri için tuttuğu çizim anı bayrağıyla. İç içe renk uzayları, bozuk döngülere karşı bir güvence olarak 8 derinliğe dek izlenir ve ilk ihlal her EndDoc için raporlanır. Lab ya da CalGray gibi öteki renk aileleri tam preflightın işidir; o yüzden tam uyum kararını almak için bitmiş dosyayı derlemenizin bir parçası olarak harici bir validatörden geçirin. Uyum çıktısının daha geniş resmi HotPDF ile PDF/A, PDF/X ve PDF/UA çıktısı rehberinde, bir validatörü katılımsız bir hatta bağlamak ise Delphi'de PDF preflight kontrollerini otomatikleştirme yazısında
HotPDF; PDF/X, PDF/A ve PDF/UA çıktısı, CMYK ve spot renk API'leri ve ICC OutputIntent desteğiyle Delphi ve C++Builder için yerel bir VCL PDF bileşenidir. Ayrıntılar, lisans ve deneme indirmesi HotPDF Delphi PDF bileşeni ürün sayfasındadır