İçeriğe geç

Yazı tipleri: zor olan kısım

Evidence: Mixed evidence

Yazı 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.

PDF 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:

  1. 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.
  2. 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.
  3. 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.

  • 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 /ToUnicode CMap’idir — ve bu, gliflerin doğru görünüp görünmemesinden bağımsızdır.
  • Doğru görünen ancak /ToUnicode bulunmayan (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 /ToUnicode CMap’i yayar — ve PDF 2.0 gömme kuralını yalnızca uyarmak yerine zorunlu kılabilir.

Alt 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.

KonuNeyi garanti ederGaranti etmediği şeyYanlışsa sessiz başarısızlık
GömmeYazı tipi yüklü olmasa da aynı işlemeMetnin aranabilir olduğunuYerine kullanılan yazı tipi; başka bir makinede yanlış metrikler
Alt küme oluşturmaDaha küçük dosya; yalnızca kullanılan gliflerKodlamayla ilgili herhangi bir şeyEksik bileşik bileşenler → bozuk aksanlı glifler
Kodlama (/ToUnicode)Aranabilir, kopyalanabilir ve erişilebilir metinGliflerin doğru işlendiğiniKusursuz 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.

Alt küme adlandırma kuralı normatif ve nettir. Spec: 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 /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 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.

Strict PDF 2.0 font-embedding enforcement — edition availability
Edition Availability
Core

Kullanılabilir. Alt küme oluşturma, /ToUnicode yayımı ve açık Strict / AllowBase14 gömme politikası, çekirdek motor davranışıdır.

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.

Doğ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 dictionary
20 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 searchable
endobj
% 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 >>
endobj

Nesne 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.

Açı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.

NextPDF’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.

Neden 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.

  • 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.
  • 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.