Pro editie
Font Tools — Diepe referentie
In een oogopslag
Sectie met titel “In een oogopslag”Deze pagina is de referentie op contractniveau voor NextPDF Pro Font Tools. Het oppervlak bestaat uit één scanner, NextPDF\Pro\FontTools\FontDesubsetter, en twee immutable value objects, SubsetInfo en DesubsetPlan. De scanner leest ruwe PDF-bytes, rapporteert elke afzonderlijke /BaseFont-vermelding en markeert vermeldingen die de subset-naamgevingsconventie van ISO 32000-2:2020 §9.9.2 volgen. Een plan aggregeert de gemarkeerde subsets en schat de bytekost van het herstellen van volledige lettertypeprogramma’s. De module analyseert en schat alleen; hij herschrijft nooit een ingebed lettertypeprogramma. Deze pagina beschrijft de publieke API, het contract voor waarneembaar gedrag en de faalmodi.
Beschikbaarheid en licentie
Sectie met titel “Beschikbaarheid en licentie”Deze functionaliteit wordt geleverd in NextPDF Pro (nextpdf/pro) en wordt geactiveerd met een licentie-envelop van het Pro-niveau. Een deployment zonder die entitlement laadt de klassen van de functionaliteit niet. Vergelijk edities en vraag een licentie aan.
Geen enkele licentieflag per functie gate’t deze module. De Font Tools-klassen zijn beschikbaar zodra nextpdf/pro is geïnstalleerd.
Publiek API-oppervlak
Sectie met titel “Publiek API-oppervlak”| Symbool | Parameters | Standaardgedrag | Retourneert | Gooit of faalt met | Opmerkingen |
|---|---|---|---|---|---|
FontDesubsetter | geen | Stateless scanner over ruwe PDF-bytes | — | — | final; veilig om te hergebruiken over documenten heen |
FontDesubsetter::analyzeSubsets() | string $pdfData | Rapporteert elke afzonderlijke /BaseFont-vermelding, subset of niet, gemarkeerd met isSubset | list<SubsetInfo> | InvalidArgumentException wanneer een op breedte gebaseerde subsetschatting de op naam gebaseerde schatting van het volledige aantal overschrijdt | Scan op byteniveau; gecomprimeerde object streams worden niet gedecodeerd |
FontDesubsetter::isSubsetFont() | string $baseFontName | Matcht de prefixconventie van zes hoofdletters plus + | bool | — | Verankerd aan het begin van de naam |
FontDesubsetter::extractSubsetPrefix() | string $baseFontName | Retourneert de subset-tag van zes letters | string | — | Lege string voor niet-subset-namen |
FontDesubsetter::generateDesubsetPlan() | list<SubsetInfo> $subsets | Verzamelt vermeldingen waarvan isSubset true is en telt de grootteschatting op | DesubsetPlan | Gooit niet | Niet-subset-vermeldingen worden stilzwijgend overgeslagen |
SubsetInfo | constructor: $fontName, $baseFont, $subsetGlyphCount, $fullGlyphCount, $isSubset, $encoding | Immutable beschrijving van één /BaseFont-vermelding | — | InvalidArgumentException bij een negatief glyph-aantal, of een subset-aantal boven het volledige aantal | final readonly; alle eigenschappen publiek |
SubsetInfo::subsetPrefix() | geen | Extraheert de tag van zes letters uit fontName | string | — | Lege string wanneer het geen subset is of de + niet op positie zes staat |
SubsetInfo::coveragePercent() | geen | Aandeel van de subset in de volledige glyph-set | float in [0.0, 100.0] | — | Retourneert 0.0 wanneer fullGlyphCount 0 is |
DesubsetPlan | constructor: list<SubsetInfo> $targets, int $estimatedSizeIncrease | Immutable de-subsetting-plan | — | — | final readonly; alle eigenschappen publiek |
DesubsetPlan::count() | geen | Aantal beoogde lettertypen | int | — | Gelijk aan de lengte van targets |
DesubsetPlan::totalGlyphsNeeded() | geen | Ontbrekende glyphs opgeteld over alle doelen | int | — | Som van fullGlyphCount - subsetGlyphCount per doel |
Signaturen van de entry points
Sectie met titel “Signaturen van de entry points”public function analyzeSubsets(string $pdfData): array
public function isSubsetFont(string $baseFontName): bool
public function extractSubsetPrefix(string $baseFontName): string
public function generateDesubsetPlan(array $subsets): DesubsetPlanpublic function __construct( public string $fontName, public string $baseFont, public int $subsetGlyphCount, public int $fullGlyphCount, public bool $isSubset, public string $encoding,)
public function subsetPrefix(): string
public function coveragePercent(): floatpublic function __construct( public array $targets, public int $estimatedSizeIncrease,) {}
public function count(): int
public function totalGlyphsNeeded(): intGedragscontract
Sectie met titel “Gedragscontract”Scan en subsetdetectie
Sectie met titel “Scan en subsetdetectie”analyzeSubsets() extraheert /BaseFont-naamtokens uit de ruwe bytes met een patroonmatch op byteniveau. Dubbele namen vallen samen tot één vermelding; de volgorde volgt de eerste verschijning. Elke afzonderlijke naam levert een SubsetInfo op, ongeacht of het een subset is. Een naam is een subset wanneer hij begint met precies zes hoofdletters uit ASCII gevolgd door +, de conventie van §9.9.2. Voor subset-namen is baseFont de naam met de prefix van zeven tekens verwijderd. Voor gewone namen is baseFont gelijk aan fontName. Elke afzonderlijke subset-naam wordt als een eigen vermelding gerapporteerd, in lijn met de richtlijn van §9.9.2 om subsets als onafhankelijke entiteiten te behandelen.
Coderingsdetectie
Sectie met titel “Coderingsdetectie”Voor elk lettertype doorzoekt de scanner een begrensd byte-venster na de /BaseFont-verschijning. Een /Encoding-naamvermelding in het venster wint. Lukt dat niet, dan wordt een Identity-H- of Identity-V-substring in het venster gerapporteerd. Lukken beide niet, dan rapporteert de vermelding Unknown. Coderingswaarden in dictionaries of bereikt via indirecte referenties rapporteren Unknown.
Glyph-boekhouding
Sectie met titel “Glyph-boekhouding”Beide glyph-aantallen zijn schattingen. subsetGlyphCount wordt afgeleid uit breedte-arrays die zichtbaar zijn nabij de lettertypevermelding: een /W-array van een CIDFont levert ruwweg één glyph per breedte-triple op, en een /Widths-array van een simpel lettertype levert één glyph per numerieke vermelding op. Wanneer geen van beide arrays zichtbaar is in het venster, geldt een kleine vaste standaardwaarde. Wanneer de /BaseFont-verschijning niet kan worden teruggevonden voor het venster-onderzoek, is het aantal 0. fullGlyphCount wordt afgeleid uit heuristieken op basis van familienamen: een tabel met bekende Latijnse families, een set CJK-familienaamindicatoren, en anders een generieke ondergrens. Het ingebedde lettertypeprogramma wordt nooit geparseerd. De specifieke tabellen, venstergroottes en constanten zijn implementatiedetails, worden niet gepubliceerd en kunnen tussen releases veranderen.
Plangeneratie
Sectie met titel “Plangeneratie”generateDesubsetPlan() filtert de invoer tot vermeldingen waarvan isSubset true is. Elk doel draagt zijn aantal ontbrekende glyphs, vermenigvuldigd met een vaste constante voor gemiddelde bytes per glyph, bij aan estimatedSizeIncrease. Het plan is een projectie voor capaciteitsbeslissingen, geen gemeten delta. Het uitvoeren van een plan — het herschrijven van lettertypeprogramma’s — valt buiten deze module.
Determinisme
Sectie met titel “Determinisme”Het hele oppervlak is een pure functie van zijn invoer. Identieke bytes leveren identieke resultaten op. Er is geen willekeur, geen netwerkoproep en geen toegang tot het bestandssysteem.
Randgevallen en faalmodi
Sectie met titel “Randgevallen en faalmodi”- De constructie van
SubsetInfoweigert ongeldige toestanden: een negatief glyph-aantal, of een subset-aantal boven het volledige aantal, gooitInvalidArgumentException. analyzeSubsets()kan die exception in één hoekgeval doorgeven: een lettertype waarvan de naam een bekende familie matcht, maar waarvan de zichtbare breedte-array een grotere subsetschatting oplevert dan het cijfer van het volledige aantal van die familie.- Detectie werkt op de byte-representatie.
/BaseFont-vermeldingen die geserialiseerd zijn binnen gecomprimeerde object streams zijn onzichtbaar; decomprimeer die streams vóór het scannen. - Vermeldingen waarvan de
/BaseFont-sleutel en -waarde gescheiden zijn door andere witruimte dan één enkele spatie worden nog steeds gedetecteerd, maar het venster-onderzoek per lettertype kan ze niet terugvinden. Zulke vermeldingen rapporteren coderingUnknownen een subset-glyph-aantal van0. - PDF-namen die
#-geëscapete bytes gebruiken worden in ruwe geëscapete vorm gerapporteerd; escapes worden niet gedecodeerd. - Dubbele
/BaseFont-namen vallen samen tot één enkele vermelding. Twee afzonderlijke lettertype-objecten die één naam delen zijn voor deze scanner niet van elkaar te onderscheiden. generateDesubsetPlan()faalt nooit op niet-subset-invoer; vermeldingen waarvanisSubsetopfalsestaat worden simpelweg uitgesloten vantargets.- Alle aantallen en
estimatedSizeIncreasezijn heuristieken. Behandel ze niet als gemeten waarden; gebruik ze alleen voor triage en capaciteitsplanning. - In deze module vindt geen enkele cryptografische bewerking plaats, dus er is geen gedrag dat specifiek is voor de FIPS-modus.
Conformiteit
Sectie met titel “Conformiteit”| Bewering | Standaard | Clausule |
|---|---|---|
Subsetdetectie matcht de subset-naamgevingsconventie: een tag van zes hoofdletters gevolgd door +, geplaatst vóór de BaseFont-waarde. | ISO 32000-2:2020 | §9.9.2 |
| Elke afzonderlijke subset-naam wordt onafhankelijk gerapporteerd, volgens de aanbeveling om meerdere subsets als aparte entiteiten te behandelen. | ISO 32000-2:2020 | §9.9.2 |
Alle clausules zijn geparafraseerd; NextPDF reproduceert geen normatieve tekst. Dit zijn capaciteitsbeweringen, geen certificeringen. NextPDF heeft geen certificering en verleent er geen. De module beweert detectie van de naamgevingsconventie en deterministische rapportage; hij beweert niet de nauwkeurigheid van de glyph-aantal- of grootteschattingen.
Ontwikkelnotities
Sectie met titel “Ontwikkelnotities”- Installeer met
composer require nextpdf/pro:^3. Beschikbaar sindsnextpdf/pro1.9.0; actueel innextpdf/pro3.1.0. FontDesubsetteris stateless. Construeer hem één keer en hergebruik hem over documenten en werkthreads heen.- Voed
analyzeSubsets()gedecomprimeerde bytes wanneer subset-dekking ertoe doet; lettertype-dictionaries die in object streams verpakt zitten worden anders gemist. - Vertak op
SubsetInfo::isSubsetvoordat je handelt; de resultaatlijst bevat opzettelijk niet-subset-lettertypen voor inventarisatiedoeleinden. - Gebruik
DesubsetPlan::totalGlyphsNeeded()enestimatedSizeIncreaseom te beslissen of de-subsetting de kost aan bestandsgrootte waard is voordat je volledige lettertypeprogramma’s aanschaft. - Scannen is lineair in de invoerlengte met begrensde venster-onderzoeken per lettertype. De module slaat niets op en zendt geen telemetrie uit.
Publicatiegrens
Sectie met titel “Publicatiegrens”Deze pagina documenteert alleen extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, hulpklassen, mechanisme-tabellen, runbook-bestandsnamen en ticketprefixen vallen buiten scope.
Zie ook
Sectie met titel “Zie ook”- Font Tools (functionaliteit) — installatie, snelstart en voorbeelden van de planningsworkflow.
- Optimizer — Diepgaande referentie — het verwante oppervlak voor groottereductie, inclusief lettertypegerelateerde optimalisatie.
- Core font module — lettertype-inbedding en subsetting tijdens documentcreatie in NextPDF Core.