Ga naar inhoud
getnextpdf.com

Pro editie

Font Tools — Diepe referentie

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.

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.

SymboolParametersStandaardgedragRetourneertGooit of faalt metOpmerkingen
FontDesubsettergeenStateless scanner over ruwe PDF-bytesfinal; veilig om te hergebruiken over documenten heen
FontDesubsetter::analyzeSubsets()string $pdfDataRapporteert elke afzonderlijke /BaseFont-vermelding, subset of niet, gemarkeerd met isSubsetlist<SubsetInfo>InvalidArgumentException wanneer een op breedte gebaseerde subsetschatting de op naam gebaseerde schatting van het volledige aantal overschrijdtScan op byteniveau; gecomprimeerde object streams worden niet gedecodeerd
FontDesubsetter::isSubsetFont()string $baseFontNameMatcht de prefixconventie van zes hoofdletters plus +boolVerankerd aan het begin van de naam
FontDesubsetter::extractSubsetPrefix()string $baseFontNameRetourneert de subset-tag van zes lettersstringLege string voor niet-subset-namen
FontDesubsetter::generateDesubsetPlan()list<SubsetInfo> $subsetsVerzamelt vermeldingen waarvan isSubset true is en telt de grootteschatting opDesubsetPlanGooit nietNiet-subset-vermeldingen worden stilzwijgend overgeslagen
SubsetInfoconstructor: $fontName, $baseFont, $subsetGlyphCount, $fullGlyphCount, $isSubset, $encodingImmutable beschrijving van één /BaseFont-vermeldingInvalidArgumentException bij een negatief glyph-aantal, of een subset-aantal boven het volledige aantalfinal readonly; alle eigenschappen publiek
SubsetInfo::subsetPrefix()geenExtraheert de tag van zes letters uit fontNamestringLege string wanneer het geen subset is of de + niet op positie zes staat
SubsetInfo::coveragePercent()geenAandeel van de subset in de volledige glyph-setfloat in [0.0, 100.0]Retourneert 0.0 wanneer fullGlyphCount 0 is
DesubsetPlanconstructor: list<SubsetInfo> $targets, int $estimatedSizeIncreaseImmutable de-subsetting-planfinal readonly; alle eigenschappen publiek
DesubsetPlan::count()geenAantal beoogde lettertypenintGelijk aan de lengte van targets
DesubsetPlan::totalGlyphsNeeded()geenOntbrekende glyphs opgeteld over alle doelenintSom van fullGlyphCount - subsetGlyphCount per doel
public function analyzeSubsets(string $pdfData): array
public function isSubsetFont(string $baseFontName): bool
public function extractSubsetPrefix(string $baseFontName): string
public function generateDesubsetPlan(array $subsets): DesubsetPlan
public 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(): float
public function __construct(
public array $targets,
public int $estimatedSizeIncrease,
) {}
public function count(): int
public function totalGlyphsNeeded(): int

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.

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.

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.

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.

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.

  • De constructie van SubsetInfo weigert ongeldige toestanden: een negatief glyph-aantal, of een subset-aantal boven het volledige aantal, gooit InvalidArgumentException.
  • 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 codering Unknown en een subset-glyph-aantal van 0.
  • 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 waarvan isSubset op false staat worden simpelweg uitgesloten van targets.
  • Alle aantallen en estimatedSizeIncrease zijn 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.
BeweringStandaardClausule
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.

  • Installeer met composer require nextpdf/pro:^3. Beschikbaar sinds nextpdf/pro 1.9.0; actueel in nextpdf/pro 3.1.0.
  • FontDesubsetter is 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::isSubset voordat je handelt; de resultaatlijst bevat opzettelijk niet-subset-lettertypen voor inventarisatiedoeleinden.
  • Gebruik DesubsetPlan::totalGlyphsNeeded() en estimatedSizeIncrease om 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.

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.