Przejdź do głównej zawartości
getnextpdf.com

Pro edycja

Font Tools — szczegółowa dokumentacja referencyjna

Ta strona stanowi referencję na poziomie kontraktu dla NextPDF Pro Font Tools. Powierzchnię tworzą jeden skaner, NextPDF\Pro\FontTools\FontDesubsetter, oraz dwa niezmienne obiekty wartości, SubsetInfo i DesubsetPlan. Skaner odczytuje surowe bajty PDF, zgłasza każdy odrębny wpis /BaseFont i oznacza wpisy zgodne z konwencją nazewnictwa podzbiorów według ISO 32000-2:2020 §9.9.2. Plan agreguje oznaczone podzbiory i szacuje koszt w bajtach odtworzenia pełnych programów czcionek. Moduł wyłącznie analizuje i szacuje; nigdy nie przepisuje osadzonego programu czcionki. Ta strona opisuje publiczne API, kontrakt obserwowalnego zachowania oraz tryby awarii.

Ta funkcja jest dostarczana w NextPDF Pro (nextpdf/pro) i aktywuje się przy użyciu koperty licencyjnej poziomu Pro. Wdrożenie bez tego uprawnienia nie ładuje klas tej funkcji. Porównaj edycje i uzyskaj licencję.

Żadna flaga licencji dla pojedynczej funkcji nie ogranicza dostępu do tego modułu. Klasy Font Tools są dostępne zawsze, gdy zainstalowano nextpdf/pro.

SymbolParametryZachowanie domyślneZwracaZgłasza lub kończy się błędemUwagi
FontDesubsetterbrakBezstanowy skaner surowych bajtów PDFfinal; bezpieczny do ponownego użycia w wielu dokumentach
FontDesubsetter::analyzeSubsets()string $pdfDataZgłasza każdy odrębny wpis /BaseFont, podzbiór lub nie, oznaczony przez isSubsetlist<SubsetInfo>InvalidArgumentException, gdy szacunek podzbioru wyprowadzony z szerokości przekracza szacunek pełnej liczby wyprowadzony z nazwySkan na poziomie bajtów; skompresowane strumienie obiektów nie są dekodowane
FontDesubsetter::isSubsetFont()string $baseFontNameDopasowuje konwencję prefiksu sześciu wielkich liter zakończonego znakiem +boolZakotwiczone na początku nazwy
FontDesubsetter::extractSubsetPrefix()string $baseFontNameZwraca sześcioliterowy znacznik podzbiorustringPusty ciąg dla nazw niebędących podzbiorami
FontDesubsetter::generateDesubsetPlan()list<SubsetInfo> $subsetsZbiera wpisy, których isSubset ma wartość true, i sumuje szacunek rozmiaruDesubsetPlanNie zgłasza wyjątkuWpisy niebędące podzbiorami są pomijane po cichu
SubsetInfokonstruktor: $fontName, $baseFont, $subsetGlyphCount, $fullGlyphCount, $isSubset, $encodingNiezmienny opis jednego wpisu /BaseFontInvalidArgumentException przy ujemnej liczbie glifów lub liczbie glifów podzbioru przekraczającej liczbę pełnąfinal readonly; wszystkie właściwości publiczne
SubsetInfo::subsetPrefix()brakWyodrębnia sześcioliterowy znacznik z fontNamestringPusty ciąg, gdy nie jest podzbiorem lub znak + nie znajduje się na szóstej pozycji
SubsetInfo::coveragePercent()brakUdział podzbioru w pełnym zestawie glifówfloat w [0.0, 100.0]Zwraca 0.0, gdy fullGlyphCount wynosi 0
DesubsetPlankonstruktor: list<SubsetInfo> $targets, int $estimatedSizeIncreaseNiezmienny plan odtwarzania podzbiorówfinal readonly; wszystkie właściwości publiczne
DesubsetPlan::count()brakLiczba docelowych czcionekintRówna długości targets
DesubsetPlan::totalGlyphsNeeded()brakBrakujące glify zsumowane dla wszystkich celówintSuma fullGlyphCount - subsetGlyphCount dla każdego celu
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() wyodrębnia tokeny nazw /BaseFont z surowych bajtów za pomocą dopasowania wzorca na poziomie bajtów. Zduplikowane nazwy zwijają się do jednego wpisu; kolejność wynika z pierwszego wystąpienia. Każda odrębna nazwa daje jeden SubsetInfo, niezależnie od tego, czy jest podzbiorem. Nazwa jest podzbiorem, gdy zaczyna się od dokładnie sześciu wielkich liter ASCII zakończonych znakiem + — konwencja z §9.9.2. Dla nazw podzbiorów baseFont to nazwa z usuniętym siedmioznakowym prefiksem. Dla nazw zwykłych baseFont jest równe fontName. Każda odrębna nazwa podzbioru jest zgłaszana jako osobny wpis, zgodnie z zaleceniem §9.9.2, aby traktować podzbiory jako niezależne jednostki.

Dla każdej czcionki skaner przeszukuje ograniczone okno bajtów po wystąpieniu /BaseFont. Wpis nazwy /Encoding w oknie ma pierwszeństwo. W razie jego braku zgłaszany jest podciąg Identity-H lub Identity-V z okna. Gdy nie ma żadnego z nich, wpis zgłasza Unknown. Wartości kodowania przechowywane w słownikach lub osiągane przez odwołania pośrednie zgłaszają Unknown.

Obie liczby glifów są szacunkami. subsetGlyphCount wyprowadza się z tablic szerokości widocznych w pobliżu wpisu czcionki: tablica /W czcionki CIDFont daje mniej więcej jeden glif na trójkę szerokości, a tablica /Widths czcionki prostej daje jeden glif na wpis liczbowy. Gdy żadna z tablic nie jest widoczna w oknie, stosuje się niewielką stałą wartość domyślną. Gdy wystąpienia /BaseFont nie można ponownie zlokalizować na potrzeby przeszukiwania okna, liczba wynosi 0. fullGlyphCount wyprowadza się z heurystyk nazw rodzin: tablicy znanych rodzin łacińskich, zestawu wskaźników nazw rodzin CJK oraz ogólnego progu w pozostałych przypadkach. Osadzony program czcionki nigdy nie jest parsowany. Konkretne tablice, rozmiary okien i stałe są szczegółem implementacyjnym, nie są publikowane i mogą się zmieniać między wydaniami.

generateDesubsetPlan() filtruje dane wejściowe do wpisów, których isSubset ma wartość true. Każdy cel wnosi swoją liczbę brakujących glifów, pomnożoną przez stałą średnią liczbę bajtów na glif, do estimatedSizeIncrease. Plan jest prognozą na potrzeby decyzji o pojemności, a nie zmierzoną różnicą. Wykonanie planu — przepisanie programów czcionek — jest poza tym modułem.

Cała powierzchnia jest czystą funkcją swoich danych wejściowych. Identyczne bajty dają identyczne wyniki. Nie ma losowości, wywołań sieciowych ani dostępu do systemu plików.

  • Konstrukcja SubsetInfo odrzuca nieprawidłowe stany: ujemna liczba glifów lub liczba glifów podzbioru przekraczająca liczbę pełną zgłasza InvalidArgumentException.
  • analyzeSubsets() może propagować ten wyjątek w jednym skrajnym przypadku: czcionka, której nazwa pasuje do znanej rodziny, ale której widoczna tablica szerokości daje większy szacunek podzbioru niż wartość pełnej liczby dla tej rodziny.
  • Wykrywanie działa na reprezentacji bajtowej. Wpisy /BaseFont serializowane wewnątrz skompresowanych strumieni obiektów są niewidoczne; przed skanowaniem zdekompresuj te strumienie.
  • Wpisy, w których klucz i wartość /BaseFont są oddzielone znakiem białym innym niż pojedyncza spacja, są nadal wykrywane, ale przeszukiwanie okna dla danej czcionki nie potrafi ich ponownie zlokalizować. Takie wpisy zgłaszają kodowanie Unknown i liczbę glifów podzbioru 0.
  • Nazwy PDF używające bajtów z sekwencjami ucieczki # są zgłaszane w surowej postaci z sekwencjami ucieczki; sekwencje nie są dekodowane.
  • Zduplikowane nazwy /BaseFont zwijają się do jednego wpisu. Dwa odrębne obiekty czcionek o wspólnej nazwie są nierozróżnialne dla tego skanera.
  • generateDesubsetPlan() nigdy nie zawodzi przy danych niebędących podzbiorami; wpisy z isSubset ustawionym na false są po prostu wykluczane z targets.
  • Wszystkie liczby oraz estimatedSizeIncrease są heurystykami. Nie traktuj ich jako wartości zmierzonych; używaj ich wyłącznie do triażu i planowania pojemności.
  • W tym module nie zachodzi żadna operacja kryptograficzna, więc nie ma zachowania specyficznego dla trybu FIPS.
TwierdzenieStandardKlauzula
Wykrywanie podzbiorów odpowiada konwencji nazewnictwa podzbiorów: znacznik sześciu wielkich liter zakończony znakiem + poprzedzający wartość BaseFont.ISO 32000-2:2020§9.9.2
Każda odrębna nazwa podzbioru jest zgłaszana niezależnie, zgodnie z zaleceniem traktowania wielu podzbiorów jako osobnych jednostek.ISO 32000-2:2020§9.9.2

Wszystkie klauzule są parafrazowane; NextPDF nie odtwarza tekstu normatywnego. Są to deklaracje możliwości, a nie certyfikaty. NextPDF nie posiada żadnego certyfikatu i żadnego nie udziela. Moduł deklaruje wykrywanie konwencji nazewnictwa oraz deterministyczne raportowanie; nie deklaruje dokładności szacunków liczby glifów ani rozmiaru.

  • Zainstaluj poleceniem composer require nextpdf/pro:^3. Dostępne od nextpdf/pro 1.9.0; aktualne w nextpdf/pro 3.1.0.
  • FontDesubsetter jest bezstanowy. Utwórz go raz i używaj ponownie w wielu dokumentach i wątkach pracy.
  • Podawaj analyzeSubsets() zdekompresowane bajty, gdy pokrycie podzbioru ma znaczenie; w przeciwnym razie słowniki czcionek upakowane w strumieniach obiektów zostaną pominięte.
  • Rozgałęziaj na podstawie SubsetInfo::isSubset przed podjęciem działania; lista wyników celowo zawiera czcionki niebędące podzbiorami na potrzeby inwentaryzacji.
  • Użyj DesubsetPlan::totalGlyphsNeeded() oraz estimatedSizeIncrease, aby zdecydować, czy odtwarzanie podzbiorów jest warte kosztu rozmiaru pliku, zanim pozyskasz pełne programy czcionek.
  • Skanowanie jest liniowe względem długości danych wejściowych z ograniczonymi przeszukiwaniami okna dla każdej czcionki. Moduł niczego nie przechowuje i nie emituje żadnej telemetrii.

Ta strona dokumentuje wyłącznie zewnętrznie obserwowalne zachowanie oraz obsługiwaną powierzchnię publicznego API. Wewnętrzne ścieżki przestrzeni nazw, klasy pomocnicze, tablice mechanizmów, nazwy plików runbooków oraz prefiksy zgłoszeń są poza zakresem.