PDF Library for Delphi, bir web projesinin zaten gönderdiği yazı tiplerini kabul eder. WOFF2 konteynerlerini içe aktarır, değişken bir yazı tipinin tasarım eksenlerini JSON olarak numaralandırır ve seçilen bir eksen koordinatları kümesini, varyasyonlar hakkında hiçbir şey bilmeden sıradan gömme, alt kümeleme ve çıkarma yollarının ele aldığı statik bir yazı tipine dönüştürür. Hem TrueType hem de CFF2 anahatları kapsanır
Bunun ele aldığı durum yaygın ve can sıkıcıdır. Bir markanın tipografisi bir tasarım sisteminde tanımlanır, tasarım sistemi değişken WOFF2 dosyaları gönderir ve PDF üretici ne konteyneri ne de varyasyon verisini okuyabilir. Olağan geçici çözüm — dökümhaneden gerçekte kullanılan her ağırlığın statik TTF örneklerini istemek — haftalar sürer ve kimsenin senkron tutmadığı dosyalar üretir
WOFF2 Neden Sadece Sıkıştırılmış Bir Yazı Tipi Değildir?
WOFF2'yi bir Brotli sarmalayıcısı olarak ele alıp sıkıştırmasını açmak, size geçerli bir sfnt olmayan baytlar verir. Biçim ayrıca dönüştürülmüş ve yeniden sıralanmış tablolara da izin verir: glyf, loca ve hmtx, yazı tipi ayrıştırılabilir olmadan önce tersine çevrilmesi gereken yeniden düzenlenmiş bir biçimde saklanabilir. Genel amaçlı bir sıkıştırma açıcı bunu yapamaz
Windows'ta platform, Windows 10 sürüm 1703'ten beri konteyner analizi ve açma sağlamıştır, bu yüzden kitaplık başka bir kod çözücü göndermek yerine sistem uygulamasını kullanır. Bu karar, dağıtımı ekstra bir DLL'den arındırır ve dönüşüm tersine çevirmesinin işletim sisteminin kendi metin yığınının kullandığı aynı kod tarafından ele alınması anlamına gelir. Diğer platformlarda WOFF1 hâlâ saf bir Pascal yolundan gider ve WOFF2 açıkça desteklenmediğini bildirir; bu, sessizce bozulmuş bir yazı tipi yerine dürüst bir yanıttır
İçe aktarma yolu, kod çözmeden önce ve sonra doğrulama yapar: 48 baytlık başlık, konteyner uzunluğu, ayrılmış alanlar, bildirilen sfnt boyutu ve 512 MiB üst sınırının hepsi önce kontrol edilir ve kod çözülmüş akış boyutu daha sonra bildirimle karşılaştırılır. Bir web yazı tipi indirilen içeriktir ve engellenmeye değer iki başarısızlık modu bir boyut uyuşmazlığı ve bir sıkıştırma bombasıdır
uses
PDFlibrary;
var
Lib: TPDFlib;
FontID, InstanceID: Integer;
AxesJSON: WideString;
begin
Lib := TPDFlib.Create;
try
Lib.NewDocument;
Lib.SetPageSize('A4');
Lib.NewPage;
// WOFF2, WOFF1, TTF, OTF ve TTC hepsi aynı çağrıdan girer
FontID := Lib.AddOpenTypeFontFromFile('Inter.woff2', 0);
if FontID <= 0 then
raise Exception.Create('font could not be imported');
// Bu yazı tipi gerçekte ne yapabilir?
if Lib.GetFontVariationAxes(FontID, AxesJSON) = 1 then
Log(AxesJSON); // eksen başına etiketler, minimum, varsayılan, maksimum
// Bir tasarım konumunu statik bir yazı tipine göm
InstanceID := Lib.CreateOpenTypeFontVariation(FontID,
'wght=620,wdth=87.5');
Lib.DrawOpenTypeText(56, 760, InstanceID, 24, 'Quarterly results', 0);
Lib.SaveToFile('report.pdf');
finally
Lib.Free;
end;
end;
Örnekleme Neyi Yeniden Oluşturmalı ve Neyi Kaldırır
Değişken bir yazı tipi, glif başına bir varsayılan anahat artı tasarım uzayındaki konuma göre indekslenmiş deltaları saklar. Statik bir örnek üretmek, bu deltaları istenen koordinatlarda enterpolasyon yapmak, noktaları taşımak ve ardından onlardan türetilen her şeyi yeniden hesaplamak anlamına gelir
TrueType anahatları için bu, fvar, avar, gvar, HVAR ve MVAR'ı ayrıştırmak, paylaşılan ve özel nokta numaralandırmasıyla demet deltalarını uygulamak ve açık bir delta taşımayan noktaları enterpolasyon yapmak anlamına gelir. HVAR ile birlikte yatay hayalet noktalar, ilerleme genişliğini ve sol yan payını belirler. Bileşik glifler önce bileşen bağımlılıklarının ve nokta eşlemelerinin çözülmesine, ardından öteleme, ölçek, matris ve ek ofsetlerin uygulanmasına ihtiyaç duyar — derinlik sınırları ve döngü tespitiyle birlikte, çünkü kötü niyetli bir bileşen grafiği aksi halde sonsuza kadar özyinelenirdi
Meta veri de hareket eder ve bu, çoğu uygulamanın atladığı kısımdır. MVAR, hhea, OS/2 ve post'taki global ölçütleri günceller, bu yüzden satır aralığı, alt çizgi konumu ve italik açısı varsayılan yerine örnekle eşleşir. wght, wdth, ital ve slnt eksenleri ek olarak ağırlık sınıfını, genişlik sınıfını, seçim bayraklarını, macStyle'ı ve italik açısını günceller, bu yüzden statik yazı tipini inceleyen bir araç istediğiniz stili raporlar. Geometrisi kalın olan ve meta verisi normal diyen bir yazı tipi, sonrasında her yerde yanlış etiketlenir
Çıktı ardından bileşik anahatları düzleştirir ve artık geçerli olmayan tabloları kaldırır: varyasyon tabloları, ipuçları, aygıt tabloları ve herhangi bir imza. Glif sınırları, hhea özet ölçütleri, maxp ipucu üst sınırları, tablo başına sağlama toplamları ve tüm yazı tipinin sağlama toplamı hepsi yeniden hesaplanır
CFF2 Aynı Yere Farklı Bir Yol İzler
CFF2, doğrudan bir PDF yazı tipi programı olarak gömülemez: karakter dizeleri genişlik taşımaz ve glif sırası ve ölçütler için çevreleyen OpenType tablolarına dayanır. Bu yüzden bir CFF2 yazı tipini örneklemek, bunun yerine mevcut çizim, gömme ve alt kümeleme yollarının zaten ele aldığı CID anahtarlı bir CFF OpenType yazı tipi üretir
Bir CFF2 yazı tipini yüklemek, geçerli belge için hemen varsayılan koordinatlı statik bir örnek üretirken, özgün CFF2 sfnt yazı tipi nesnesinde tutulur, böylece eksen numaralandırması ve sonraki örnekleme yine de tam tasarım uzayını görür. Her glif, örnekleme sırasında ayrı ayrı alt yordamdan çıkarılır; bu, varyasyon aritmetiğini tamamen kaldırır ve mevcut alt kümeleyicinin değişmeden çalışmasını sağlar. Ödünleşim, statik bir örneğin paylaşılan alt yordamları koruyan bir örnekten biraz daha büyük olabilmesidir — ikinci bir alt kümeleme uygulamasına ihtiyaç duymamak için makul bir bedel
Güvenmeden Önce Bir Örneği Doğrulamak
Örnekleme, hiçbir istisnanın bildirmeyeceği şekillerde ince biçimde yanlış olabilecek türde bir özelliktir. Üç kontrol neredeyse her şeyi yakalar
Örneği dışa aktarın ve bir yazı tipi aracında açın. SaveFontToFile, tutulan yazı tipi programını yazar, bu yüzden bellek içi bir örnek önce bir PDF üretmeden dökülebilir. Dışa aktarılan dosya temiz bir şekilde ayrıştırılmalı, hiçbir varyasyon tablosu içermemeli ve istediğiniz stil meta verisini raporlamalıdır
Varsayılan olmayan bir konumda ilerlemeleri karşılaştırın. Boru hattınız aynı örneği başka bir yolla üretebiliyorsa ilerleme genişliklerini ve eğri sınırlarını glif glif karşılaştırın; buradaki referans uygulama, 313 glifli, iki eksenli bir yazı tipinin bağımsız bir örneklemesini her glifte sıfır maksimum farkla eşleştirdi
Ve üretilen PDF'den metni geri çıkarın. Gömülen ama çıkarılabilir metin üretmeyen bir örnek, görsel kontrol geçtikten çok sonra arama ve erişilebilirlik için önemli olan ToUnicode eşlemesini kaybetmiştir. Daha geniş çıkarma yolu, metin, görüntü ve yazı tipi çıkarma başlığında ele alınmıştır
// İnceleme veya yeniden kullanım için üretilen bir örneği dök
Lib.SaveFontToFile('Inter-620-87.ttf');
// Bildirilen aralığın dışındaki koordinatları isteyin, bunlar kısıtlanır,
// bu yüzden bir yazı tipinin sınırlarını varsaymak yerine eksen JSON'unu okuyun
// {"axes":[{"tag":"wght","min":100,"default":400,"max":900}, ...]}
Bir Marka Yazı Tipi Boru Hattı İçin Pratik Notlar
Örnekleri koordinat kümesine göre önbelleğe alın. Her farklı koordinat kümesi farklı bir yazı tipi programıdır, bu yüzden 400 ağırlığını ve 620 ağırlığını karıştıran bir belge, tek bir paylaşılan yüz yerine iki alt küme gömer. Aynı örneği tekrar tekrar üretmek boşa harcanan iştir; birbirine neredeyse özdeş onlarca ağırlık üretmek boşa harcanan dosya boyutudur
Çizeceğiniz örnekle ölçün. Sıkışık bir örnek, varsayılandan daha dar ilerlemelere sahiptir, bu yüzden örneklemeden önce ölçen herhangi bir düzen yanlış genişlikleri ölçmüştür. Bu, metnin yalnızca üretimde kutusundan taşmasının tek en yaygın nedenidir
Marka yazı tipinizin eksik olduğu glifler için bir yedek yol tutun. Değişken bir marka yazı tipi tipik olarak Latin'i ve pek az başka şeyi kapsar ve bir Kiril müşteri adı içeren bir rapor aksi halde eksik glifler gösterir; otomatik yedek mekanizması, eksik glifler için otomatik yazı tipi yedeği başlığında anlatılmıştır. Ve amaç belirli bir ağırlık değil daha küçük bir dosya olduğunda, alt kümeleme örneklemeden daha fazla iş yapar; PDF dosya boyutu optimizasyonu ve yazı tipi alt kümeleme başlığında ele alındığı gibi
Web yazı tipi içe aktarma, değişken örnekleme, alt kümeleme ve yedekleme, Delphi, C++Builder ve Free Pascal için aynı yazı tipi boru hattının parçasıdır; eksiksiz özellik listesi PDF Library for Delphi sayfasında bulunur