Yazı tipleri: zor olan kısım
ISO 32000-2 §9 Evidence: Mixed evidence
Genel bakış
“Genel bakış” başlıklı bölümYazı tipleri, bir PDF’nin tümüyle doğru görünüp yine de sessizce bozuk olabildiği katmandır. Bir sayfa doğru glifleri işleyebilir; ama aynı anda içinde arama yapılamayabilir, metin olarak kopyalanamayabilir ve bir arşivleme profiline uygun olmayabilir. Bunların hepsi aynı anda gerçekleşebilir ve sizi uyaracak görünür hiçbir şey olmayabilir. Bu sayfa, doğru yapılması gereken üç konuya — gömme, alt küme oluşturma, kodlama — ve NextPDF’in bunların her biri için ne yaptığına odaklanır.
Bu neden önemli
“Bu neden önemli” başlıklı bölümPDF işlerinde en tehlikeli cümle “İyi görünüyor”dur ve yazı tipleri bu cümlenin en çok zarar verdiği yerdir. Birbirinden bağımsız üç koşulun sağlanması gerekir:
- Gömme — yazı tipi programı dosyanın içinde taşınır; böylece belge, yazı tipi yüklü olmayan bir makinede de aynı şekilde işlenir.
- Alt küme oluşturma — yalnızca gerçekten kullanılan glifler taşınır; böylece 20 MB’lık bir CJK yazı tipi her belgeyi şişirmez.
- Kodlama — sayfadaki karakter kodlarından Unicode’a doğru bir eşleme vardır; böylece metin aranabilir, kopyalanabilir, dizinlenebilir ve yardımcı teknolojilerle okunabilir.
Görsel işleme yalnızca birincisini kısmen kanıtlar. Bir belge kusursuz glifler gösterebilir ama yine de üçüncüsünde tamamen başarısız olabilir — metin sözcüklerin kendisi değil, yalnızca bir resmidir. Bu, her “iyi görünüyor” incelemesinden geçen, sonra bir uyumluluk denetiminde ya da keşif talebinde sorun çıkaran başarısızlık türüdür.
Kısa özet
“Kısa özet” başlıklı bölüm- Bir PDF’deki yazı tipi bir sözlüktür; genellikle yanında bir gömülü yazı tipi programı akışı bulunur.
- Alt küme oluşturma, bu programı yalnızca kullanılan glifleri içerecek şekilde yeniden yazar. Bir alt küme yazı tipinin adına altı büyük harften oluşan bir etiket ve bir
+eklenir; böylece okuyucular onu ayrı bir yazı tipi olarak ele alır. - Kodlama, karakter kodlarını Unicode’a eşleme konusunda ayrı bir sorundur. Metni aranabilir ve kopyalanabilir kılan, bir
/ToUnicodeCMap’idir — ve bu, gliflerin doğru görünüp görünmemesinden bağımsızdır. - Doğru görünen ancak
/ToUnicodebulunmayan (ya da yanlış olan) metin, klasik sessiz başarısızlıktır: ekranda kusursuzdur, uygulamada aranamaz. - NextPDF, TrueType yazı tiplerinin alt kümesini oluşturur, doğru işleme için glif kimliğini korur ve çıkarma işleminin çalışması için bir
/ToUnicodeCMap’i yayar — ve PDF 2.0 gömme kuralını yalnızca uyarmak yerine zorunlu kılabilir.
NextPDF buna nasıl yaklaşır
“NextPDF buna nasıl yaklaşır” başlıklı bölümAlt küme oluşturma. FontSubsetter (src/Typography/FontSubsetter.php), özgün TrueType tablo dizinini ayrıştırır ve Unicode kod noktalarını glif kimliklerine eşlemek için cmap’i okur. Hem BMP biçim 4’ü hem de CJK için gereken tam Unicode biçim 12’yi işler. Ardından, yüzeysel alt küme oluşturucuların atladığı adımı uygular: bileşik glif bağımlılıklarını geçişli kapanışla çözer. Bir taban harf ile bir birleştirici işaretten oluşturulan aksanlı bir glif, bileşen olarak başka gliflere başvurur. Bu bileşenler atılırsa glif yanlış işlenir. Alt küme oluşturucu, hiçbir yeni bileşen kalmayana kadar bu çizgeyi dolaşır; hatalı biçimli bir yazı tipinin sonsuza kadar döngüye girememesi için döngü koruması vardır.
Bu dosyadaki iki mühendislik tercihini vurgulamaya değer. İlki, glif kimlikleri yeniden eşlenmez, korunur — kullanılmayan yuvalar glyf/loca içinde sıfırlarla doldurulur; böylece içerik akışının özgün glif dizinleri CIDToGIDMap /Identity altında geçerli kalır. Yeniden eşleme daha küçük olurdu ama her glif başvurusunun yeniden yazılmasını gerektirirdi. Kimliği korumak, tasarım gereği doğru seçimdir. İkincisi, dolaşma sıralıdır (gid’e göre artan); böylece alt küme bayt düzeyinde deterministiktir — aynı yazı tipi ve aynı kullanılan glifler aynı alt küme baytlarını üretir; bu da yeniden üretilebilir derlemelerin gerektirdiği şeydir. Alt küme oluşturma dosyada ~%10’dan az kazanç sağlayacaksa özgün dosya değiştirilmeden döndürülür. Ek yük, bu kadar sınırlı bir kazanca değmez.
Gömme. Bir yazı tipi programının taşınıp taşınmayacağını açık bir politika belirler — bu asla tahmine bırakılmaz. Pdf20FontEmbeddingPolicy (src/Writer/Pdf20FontEmbeddingPolicy.php) iki kipe sahiptir. PDF 2.0 profili altında Strict, gömülü olmayan standart bir Type 1 (“Base14”) başvurusunu türlenmiş bir özel durumla reddeder — uyumluluk açısından doğru davranış budur. AllowBase14, tarihsel danışma yolunu korur. Geçiş sürecinde, standardın hâlâ gerektirdiği en az yazı tipi tanımlayıcısını yayar ve hata fırlatmak yerine uyarı gönderir. Seçim, belge üzerinde bunu açıkça çağıran kod tarafından yapılır; asla yazı tipinden çıkarımlanmaz.
Kodlama. Bileşik (Type 0) yazı tipleri için EmbeddedTtfFontDictBuilder (src/Writer/EmbeddedTtfFontDictBuilder.php), CIDFontType2 alt öğesini, Type0 üst öğesini ve karakter kodlarının Unicode’a geri çözümlenmesi için bir /ToUnicode CMap akışını yayar. /ToUnicode akışı yalnızca tek bir durumda meşru biçimde bulunmayabilir: kendini tanımlayan, önceden tanımlı bir CJK CMap, okuyucuya karakterden Unicode’a eşlemeyi zaten verdiğinde. Orada CMap zaten kodlamadır; bu nedenle düz profil, bayt tasarrufu için gereksiz bir /ToUnicode akışını çıkarır. Bu durumun dışında, metni gerçekten metin olarak tutan şey /ToUnicode akışıdır.
| Konu | Neyi garanti eder | Garanti etmediği şey | Yanlışsa sessiz başarısızlık |
|---|---|---|---|
| Gömme | Yazı tipi yüklü olmasa da aynı işleme | Metnin aranabilir olduğunu | Yerine kullanılan yazı tipi; başka bir makinede yanlış metrikler |
| Alt küme oluşturma | Daha küçük dosya; yalnızca kullanılan glifler | Kodlamayla ilgili herhangi bir şey | Eksik bileşik bileşenler → bozuk aksanlı glifler |
Kodlama (/ToUnicode) | Aranabilir, kopyalanabilir ve erişilebilir metin | Gliflerin doğru işlendiğini | Kusursuz görünen sayfa, kopyalamada aranamaz / bozuk |
Yazı tipine ilişkin üç konu birbirinden bağımsızdır. Gömme ve alt küme oluşturma görünüm ve boyut hakkındadır; kodlama ise anlam hakkındadır. Bir sayfa ilk ikisinden geçip üçüncüsünde başarısız olabilir ve bunu gösterecek görünür hiçbir şey olmaz.
Kanıtlar ne diyor
“Kanıtlar ne diyor” başlıklı bölümAlt küme adlandırma kuralı normatif ve nettir.
Spec: ISO 32000-2, §9.9.2 ISO 32000-2 §9.9.2 bir yazı tipi
alt kümesinin PostScript adının — BaseFont ve tanımlayıcının FontName’inin —
tam olarak altı büyük harften oluşan bir etiketle, ardından bir artı işaretiyle,
ardından özgün yazı tipinin PostScript adıyla başlamasını gerektirir. Ayrıca, tek bir dosyadaki aynı yazı tipinin farklı
alt kümelerinin farklı etiketler kullanmasını da gerektirir. Bu kural,
bir okuyucunun iki alt kümeyi birbirinden ayırt etmesine ve belgeleri doğru biçimde birleştirmesine olanak tanır. Evidence: Standard-backed
Kodlama, işlemeden ayrı bir konudur.
Spec: ISO 32000-2, §9.10.3 ISO 32000-2 §9.10.3 /ToUnicode’u
karakter kodlarını Unicode değerlerine eşleyen bir CMap içeren bir akış olarak tanımlar
ve şu maddedeki metin çıkarma yordamı —
Spec: ISO 32000-2, §9.10.2 ISO 32000-2 §9.10.2 arama ve dizinleme için
karakter kodlarını Unicode’a dönüştürmek üzere bu CMap’i kullanır. Glif boyama
düzeneğindeki hiçbir şey /ToUnicode’a dokunmaz — metnin doğru görünüp
yanlış çıkarılabilmesinin nedeni tam olarak budur.
Gömme konusunda standart, çoğu yazı tipi sözlüğünün, gömülü yazı tipi dosyası akışı isteğe bağlı ama kesinlikle önerilen bir yazı tipi tanımlayıcısı taşıdığını belirtir. PDF 2.0, bunu özellikle on dört standart Type 1 yazı tipi için sıkılaştırır. NextPDF’in Strict politikası, bu sıkılaştırmanın uyumluluk açısından doğru okumasıdır. AllowBase14, açık ve isteğe bağlı geriye dönük uyumluluk çıkış yoludur — motor asla sessizce daha gevşek davranmaz.
| Edition | Availability |
|---|---|
| Core | Kullanılabilir. Alt küme oluşturma, |
| Pro | Yazı tipi gömme çevresinde profil düzeyinde daha derin uyumluluk zorlaması ve raporlama ekler. |
| Enterprise | Aynı uyumluluk zorlamasını kurumsal işletim yüzeyi altında ekler. |
Uygulamalı örnek
“Uygulamalı örnek” başlıklı bölümDoğru biçimde gömülmüş, alt kümesi oluşturulmuş, aranabilir bir bileşik yazı tipinin iki parçası aşağıdadır. Alt küme etiketi, standardın altı harf kuralına uyar; /ToUnicode başvurusu metni çıkarılabilir tutar.
% The Type 0 (composite) font dictionary20 0 obj<< /Type /Font /Subtype /Type0 /BaseFont /ABCDEF+NotoSans % six-letter subset tag + '+' /Encoding /Identity-H /DescendantFonts [21 0 R] /ToUnicode 23 0 R >> % the map that makes text searchableendobj
% The descendant CIDFontType2 (carries the subsetted program)21 0 obj<< /Type /Font /Subtype /CIDFontType2 /BaseFont /ABCDEF+NotoSans /CIDToGIDMap /Identity % glyph IDs preserved, not remapped /FontDescriptor 22 0 R >>endobjNesne 20’nin /ToUnicode 23 0 R’i, aranabilir bir belge ile onun görüntüsü arasındaki farktır. Onu (önceden tanımlı CMap durumu dışında) kaldırın; her glif yine kusursuz boyanır ama sayfadaki herhangi bir sözcük için yapılan arama hiçbir şey bulamaz.
Yaygın yanlış anlama
“Yaygın yanlış anlama” başlıklı bölümAçıkça ifade etmek gerekirse tuzak şudur: gliflerin doğru işlenmesi, metnin gerçekten metin olup olmadığı hakkında hiçbir şey söylemez. İşleme, kodlamadan glife giden yolu izler. Arama ve kopyalama, koddan Unicode’a giden yolu (/ToUnicode) izler. Bunlar, yazı tipi sözlüğünün farklı kısımlarını okuyan farklı düzeneklerdir. Bu nedenle bir belge, kusursuz görsel çıktıya ve bulunmayan ya da yanlış bir /ToUnicode’a sahip olabilir. Sonuç, yetkin görünen ama işlevsel olarak aranamaz olan bir sayfadır — her görsel incelemeden sağ çıkan bir başarısızlık, çünkü tanımı gereği görülecek hiçbir şey yoktur.
İlgili bir tuzak da “yazı tipi gömülü, dolayısıyla arşivleme için sorun yok” diye varsaymaktır. Gömme gereklidir ama yeterli değildir. PDF/A gibi bir profil ayrıca altı harf kuralına göre adlandırılmış alt kümeler ve doğru kodlama da bekler. Gömülü ama aranamaz olan metin yine de başarısız olur.
Sınırlar ve kapsam
“Sınırlar ve kapsam” başlıklı bölümNextPDF’in alt küme oluşturucusu özellikle bir TrueType alt küme oluşturucusudur. Temel TrueType tablolarını gerektirir ve bunlar eksik olduğunda ya da kazanç ~%10 eşiğinin altında kaldığında özgün yazı tipini değiştirmeden döndürür. Alt küme oluşturma ve bir /ToUnicode CMap’i metni çıkarılabilir kılar ama bir glifi anlamlı bir karaktere geri eşlemek için gereken bilgiden yoksun olan bir kaynak yazı tipini kurtaramaz. Hiçbir Unicode değerinin belirlenemediği yerde, hiçbir CMap yayımı değer uyduramaz.
Bu sayfanın konusu, NextPDF’in yazdığı belgelerde doğru yazı tipi yapısı üretmektir. Bu, gelişigüzel gelen PDF’ler için bir yazı tipi onarım aracı değildir. Uyumlu bir alt küme ile kodlama yaymak da tek başına bir belgeyi tam bir arşivleme profiline göre belgelendirmez — bu, ayrı ve daha geniş bir denetimdir.
Mini SSS
“Mini SSS” başlıklı bölümNeden altı harfli etiket — neden yazı tipi adı değil? Bir okuyucunun aynı yazı tipinin iki farklı alt kümesini birbirinden ayırt edebilmesi ve glif kümelerini çakıştırmadan belgeleri birleştirebilmesi için. Kural gereği farklı alt kümeler, farklı etiketler kullanır.
Hangi durumda /ToUnicode bulunmaması kabul edilebilir? Kendini tanımlayan, önceden tanımlı bir CJK CMap, karakterden Unicode’a eşlemeyi zaten sağladığında. Orada CMap, kodlamanın kendisidir. Ayrı bir /ToUnicode gereksiz olurdu. Bunun dışında, yokluğu bir kusurdur.
Alt küme oluşturma hiç zarar verir mi? Yalnızca yanlış yapılırsa. Bileşik glif bileşenlerini atmak aksanlı glifleri bozar. Glif kimliklerini başvuruları yeniden yazmadan yeniden eşlemek işlemeyi bozar. NextPDF, bileşen kapanışını çözerek ve glif kimliğini koruyarak iki durumdan da kaçınır.
İlgili belgeler
“İlgili belgeler” başlıklı bölüm- Akışlar ve süzgeçler — gömülü yazı tipi programları, kendi çözme sözleşmesine sahip süzülmüş akış nesneleri olarak taşınır.
- Bir PDF aslında nedir — yazı tipi sözlüklerinin ve program akışlarının içinde yaşadığı nesne modeli.
- PDF 2.0: neler değişti — 2.0 temel sürümünün sıkılaştırılmış yazı tipi gömme beklentileri dahil.
Sözlük
“Sözlük” başlıklı bölüm- Gömülü yazı tipi programı — PDF’nin içinde bir akış olarak taşınan gerçek yazı tipi dosyası (TrueType/CFF/Type 1); böylece işleme, okuyucunun yüklü yazı tiplerine bağlı olmaz.
- Alt küme oluşturma — boyutu küçültmek için bir yazı tipi programını yalnızca belgenin kullandığı glifleri içerecek şekilde yeniden yazma.
- Alt küme etiketi — bir alt küme yazı tipinin adındaki zorunlu, altı büyük harften oluşan ön ek artı
+(örneğin,ABCDEF+NotoSans). /ToUnicode— karakter kodlarını Unicode değerlerine eşleyen bir CMap akışı; PDF metnini aranabilir, kopyalanabilir ve erişilebilir kılan şey.- Bileşik glif — başka gliflere bileşen olarak başvurarak oluşturulan bir glif; alt küme oluşturulurken bileşenleri korunmalıdır.
CIDToGIDMap /Identity— içerik akışı glif dizinlerinin, yazı tipinin kendi glif kimlikleri olarak değiştirilmeden kullanıldığı kip; NextPDF, bunu geçerli tutmak için glif kimliğini korur.- Base14 — on dört standart Type 1 yazı tipi; PDF 2.0, yazı tiplerine ada göre başvurulması yerine bunların gömülmesini bekler.