TrueType yazı tipini gömme ve alt kümeleme
Bir bakışta
“Bir bakışta” başlıklı bölümBir TrueType yazı tipini kaydedin, bu yazı tipiyle metin işleyin ve yazıcının yalnızca gerekli alt kümeyi gömmesini sağlayın. Bu tarif, kayıtlı bir TrueType (.ttf) yazı tipi ekleyerek examples/04-text-and-fonts.php ile aynı içerik akışını izler.
Kurulum
“Kurulum” başlıklı bölümcomposer require nextpdf/core:^3Bu kısıtlama nextpdf/core paketini kurar. Örnek PHP 8.4 üzerinde çalışır; birlikte gelen LiberationSans-Regular.ttf test düzeneği, tarifin kendi içinde bağımsız kalmasını sağlar.
Kavramsal genel bakış
“Kavramsal genel bakış” başlıklı bölümBir yazı tipi yüzünü FontRegistry::register($path, $alias) ile kaydedin. Kayıt defteri dosyayı ayrıştırır ve bir FontInfo döndürür; TrueTypeParser ise .ttf ve .otf dosyaları için kullanılır. Yüzü etkinleştirmek için takma adını setFont($alias, ...) ile seçin. Bu çağrı, kullanılan kod noktalarını da kaydeder.
Alt kümeleme save() sırasında otomatik olarak devreye girer. PDF yazı tipi yazıcısı kullanılan kod noktalarını toplar ve FontSubsetter::subset() çağrısını yapar; Compact Font Format (CFF) veya OpenType yüzleri için ise CffSubsetter çağrılır. Yazıcı, alt küme tam programdan küçük olduğunda alt kümeyi gömer. Ayrıca BaseFont ve FontName değerlerini, altı büyük harften oluşan ve artı işaretiyle birleştirilmiş bir alt küme etiketiyle yeniden yazar. Bu, ISO 32000-2 standardının bir yazı tipi alt kümesi için gerektirdiği ABCDEF+FontName biçimidir. Yazıcı, gömülü TrueType programını yazı tipi tanımlayıcısında FontFile2 olarak saklar (ISO 32000-2).
Alt küme öneki PostScript adından deterministik olarak üretilir; bu nedenle deterministik bir derleme kararlı bir etiket oluşturur. Bu tarifin yeniden üretilebilirlik profilinin structural olmasının nedeni budur. Yapısal profil, alt küme öneki ile fragman /ID değerini bayt bayt doğrulamak yerine normalleştirir.
API yüzeyi
“API yüzeyi” başlıklı bölümFontRegistry::register(string $fontFile, string $alias = '', int $fontIndex = 0): FontInfo—NextPDF\Typography\FontRegistry.setFont(string $family, string $style = '', float $size = 12.0): static—NextPDF\Core\Concerns\HasTypography; kayıtlı takma adı$familyparametresi olarak geçirin.- Alt kümeleme yazıcıya dahilidir (
NextPDF\Writer\PdfFontWriter->NextPDF\Typography\FontSubsetter). Genel bir açıp kapatma anahtarı yoktur: kod noktaları bilindiğinde ve alt küme daha küçük olduğunda yazıcı her zaman alt kümeleme yapar.
Tam PHPDoc tablosu kaynak koddan üretilir.
Kod örneği — hızlı başlangıç
“Kod örneği — hızlı başlangıç” başlıklı bölüm<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Typography\FontRegistry;
$registry = new FontRegistry();$registry->register(__DIR__ . '/MyFont-Regular.ttf', alias: 'MyFont');
$doc = Document::createStandalone();$doc->addPage();$doc->setFont('MyFont', '', 14);$doc->cell(0, 10, 'Rendered with an embedded, subset TrueType face.', newLine: true);
$doc->save(__DIR__ . '/out.pdf');Document::createStandalone() kendi kayıt defterini oluşturur. Kendi doldurduğunuz bir kayıt defterini kullanmak için belgeyi, üretim örneğinde gösterildiği gibi, DocumentFactory üzerinden oluşturun. Fabrika, yazıcının kayıtlı yüzünüzü okuyabilmesini sağlar.
Kod örneği — üretim
“Kod örneği — üretim” başlıklı bölümBu örnek kendi içinde bağımsızdır ve test düzeneğinde çalıştırılabilir. Birlikte gelen LiberationSans-Regular.ttf dosyasını kaydeder ve belgeyi DocumentFactory üzerinden oluşturur; böylece kullanılan kayıt defteri, doldurulmuş olan kayıt defteridir. Kaydetme sırasında otomatik alt kümelemeye dayanır.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;use NextPDF\Typography\FontRegistry;
// A bundled TrueType test fixture keeps this recipe self-contained.// Replace with a font you have the right to embed.$fontPath = __DIR__ . '/../../fonts/test-fixtures/LiberationSans/LiberationSans-Regular.ttf';if (!is_file($fontPath)) { // Fall back to the repository-relative fixture location. $fontPath = dirname(__DIR__, 2) . '/fonts/test-fixtures/LiberationSans/LiberationSans-Regular.ttf';}
$fontRegistry = new FontRegistry();$fontRegistry->register($fontPath, alias: 'LiberationSans');
$imageRegistry = new ImageRegistry(maxCacheBytes: 0);$documentFactory = new DocumentFactory($fontRegistry, $imageRegistry);
$doc = $documentFactory->create();$doc->setTitle('Embedded Subset Font');$doc->addPage();
$doc->setFont('LiberationSans', '', 20);$doc->cell(0, 14, 'Embedded TrueType face', newLine: true);
$doc->setFont('LiberationSans', '', 12);$doc->multiCell(0, 7, 'Only the glyphs used by this document are embedded. ' . 'The writer subsets the font program and rewrites the BaseFont with a ' . 'deterministic six-letter subset prefix, for example ABCDEF+LiberationSans.');
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT');$doc->save($out !== false ? $out : __DIR__ . '/embed-and-subset-fonts.pdf');
echo "Wrote embed-and-subset-fonts.pdf\n";Beklenen STDOUT:
Wrote embed-and-subset-fonts.pdfAlt kümeyi doğrulamak için çıktıyı açıp yazı tipi sözlüğünü inceleyin. BaseFont değeri <TAG>+LiberationSans biçiminde görünür ve tanımlayıcı bir FontFile2 taşır. qpdf --check çalıştırıldığında herhangi bir yapısal hata bildirilmez.
Uç durumlar ve dikkat edilecek noktalar
“Uç durumlar ve dikkat edilecek noktalar” başlıklı bölüm- Kayıt defteri sahipliği.
Document::createStandalone()kendi kayıt defterini oluşturur. Ayrı birFontRegistryüzerinde kaydettiğiniz yazı tipi bu kayıt defterinde görünmez. Üretim örneğinde olduğu gibi, kayıt defterinizi geçirmek içinDocumentFactorykullanın. - Gömme hakları. Alt kümeleme lisanslamayı değiştirmez. Yalnızca gömme lisansına sahip olduğunuz yazı tiplerini gömün. Bazı yazı tipleri gömme kısıtlaması bitlerini ayarlar; ayrıştırıcı bu bitleri okur, ancak uyumluluktan siz sorumlu kalırsınız.
- CFF/OpenType yolu.
.otfve CFF yüzleriCffSubsettertarafından alt kümelenir,FontSubsettertarafından değil. Davranış ve alt küme etiketinin yeniden yazılması eşdeğerdir. Yalnızca kod yolu farklıdır. - Boyut kazancı yok. Bazen alt küme orijinalden küçük olmaz. Bu, çok küçük yazı tiplerinde veya tüm glifler kullanıldığında olabilir. Bu durumda yazıcı, orijinal programı bir alt küme etiketi olmadan gömer. Bu doğru davranıştır; başarısızlık değildir.
- CJK yazı tipleri. Büyük Çince, Japonca ve Korece (CJK) yüzleri, ADR-008 uyarınca yalıtılmış bir alt süreç ve PHP’nin yerel geri dönüşüyle katmanlı bir alt kümeleme stratejisi kullanır. CJK ayrıntıları ve güncel işlem hattı durumu için CJK metnini cmap duyarlı kodlamayla ayarlama sayfasına bakın.
Performans
“Performans” başlıklı bölümAyrıştırma, yazı tipi tabloları üzerinde tek bir geçiş gerektirir ve alt kümeleme maliyeti glif sayısıyla birlikte artar. CJK olmayan Latin yüzleri, wall_ms: 1500, peak_mb: 96 bütçesi içinde süreç içinde alt kümelenir. Büyük CJK yüzleri, iki saniyelik bir duvar saati zaman aşımı ve PHP’nin yerel geri dönüşüyle yalıtılmış bir alt sürece yönlendirilir (ADR-008). Bu yönlendirme, yavaşlayan veya çöken bir alt kümeleme işleminin çağıranı engelleyemeyeceği anlamına gelir.
Güvenlik notları
“Güvenlik notları” başlıklı bölümBir yazı tipi dosyası güvenilmeyen ikili girdidir. Ayrıştırıcı, akış sarmalayıcı yollarını ve boş baytları reddeder. CJK alt kümeleme alt süreci, devralınan veritabanı bağlantıları, dosya tutamaçları veya çerçeve durumu olmadan çalışır. Çökme veya zaman aşımı durumunda güvenli bir geri dönüş yapar (ADR-008). Son kullanıcılardan kabul edilen yazı tiplerinin kaynağını doğrulayın.
Uygunluk
“Uygunluk” başlıklı bölüm| Bildirim | Belirtim | Madde | reference_id |
|---|---|---|---|
| Bir yazı tipi alt kümesinin BaseFont/FontName değeri, altı büyük harften oluşan ve artı işaretiyle birleştirilmiş bir alt küme öneki taşır. | ISO 32000-2 | iso32000_2_sec9#x1.x66.p2 | |
| Gömülü bir TrueType yazı tipi programı, yazı tipi tanımlayıcısında FontFile2 olarak saklanır. | ISO 32000-2 | iso32000_2_sec9#x1.x65.p15 |
Bu tarif, NextPDF’in bir TrueType yüzünü nasıl gömüp alt kümelediğini ve uygun bir alt küme önekini nasıl ürettiğini gösterir. Yazı tipi lisans uyumluluğunu doğrulamaz. Gömme hakları entegratörün sorumluluğundadır.
Ticari bağlam
“Ticari bağlam” başlıklı bölümUygulanabilir değil.