콘텐츠로 이동
getnextpdf.com

Pro 에디션

Font Tools — 심층 참조

이 페이지는 NextPDF Pro Font Tools의 계약 수준 참조입니다. 표면은 스캐너 하나 NextPDF\Pro\FontTools\FontDesubsetter와, 불변 값 객체 둘 SubsetInfoDesubsetPlan으로 구성됩니다. 스캐너는 원시 PDF 바이트를 읽고, 서로 다른 모든 /BaseFont 항목을 보고하며, ISO 32000-2:2020 §9.9.2의 서브셋 명명 규칙을 따르는 항목을 표시합니다. 계획은 표시된 서브셋을 집계하고 전체 글꼴 프로그램을 복원하는 데 드는 바이트 비용을 추정합니다. 이 모듈은 분석과 추정만 수행하며, 임베드된 글꼴 프로그램을 결코 다시 쓰지 않습니다. 이 페이지는 공개 API, 관찰 가능한 동작 계약, 그리고 실패 모드를 명시합니다.

이 기능은 NextPDF Pro(nextpdf/pro)로 제공되며 Pro 등급 라이선스 봉투로 활성화됩니다. 해당 자격이 없는 배포에서는 이 기능의 클래스가 로드되지 않습니다. 에디션 비교 및 라이선스 받기.

이 모듈을 게이트하는 기능별 라이선스 플래그는 없습니다. Font Tools 클래스는 nextpdf/pro가 설치되어 있으면 언제든지 사용할 수 있습니다.

심볼매개변수기본 동작반환예외 또는 실패비고
FontDesubsetter없음원시 PDF 바이트에 대한 무상태 스캐너final; 문서 간 재사용 안전
FontDesubsetter::analyzeSubsets()string $pdfData서브셋 여부와 무관하게 서로 다른 모든 /BaseFont 항목을 isSubset로 표시하여 보고list<SubsetInfo>폭에서 도출한 서브셋 추정치가 이름에서 도출한 전체 수 추정치를 초과하면 InvalidArgumentException바이트 수준 스캔; 압축된 객체 스트림은 디코딩하지 않음
FontDesubsetter::isSubsetFont()string $baseFontName대문자 6자 + + 접두사 규칙에 일치bool이름 시작에 고정(anchored)
FontDesubsetter::extractSubsetPrefix()string $baseFontName6자 서브셋 태그를 반환string비서브셋 이름에는 빈 문자열
FontDesubsetter::generateDesubsetPlan()list<SubsetInfo> $subsetsisSubsettrue인 항목을 모아 크기 추정치를 합산DesubsetPlan예외를 던지지 않음비서브셋 항목은 조용히 건너뜀
SubsetInfo생성자: $fontName, $baseFont, $subsetGlyphCount, $fullGlyphCount, $isSubset, $encoding하나의 /BaseFont 항목에 대한 불변 서술음수 글리프 수, 또는 전체 수를 초과하는 서브셋 수에 대해 InvalidArgumentExceptionfinal readonly; 모든 속성 public
SubsetInfo::subsetPrefix()없음fontName에서 6자 태그를 추출string서브셋이 아니거나 +가 6번째 위치에서 벗어나 있으면 빈 문자열
SubsetInfo::coveragePercent()없음전체 글리프 집합 대비 서브셋 비율[0.0, 100.0] 범위의 floatfullGlyphCount0이면 0.0 반환
DesubsetPlan생성자: list<SubsetInfo> $targets, int $estimatedSizeIncrease불변 de-subsetting 계획final readonly; 모든 속성 public
DesubsetPlan::count()없음대상 글꼴 수inttargets 길이와 동일
DesubsetPlan::totalGlyphsNeeded()없음모든 대상에 걸쳐 합산된 누락 글리프int대상별 fullGlyphCount - subsetGlyphCount의 합
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()는 바이트 수준 패턴 매칭으로 원시 바이트에서 /BaseFont 이름 토큰을 추출합니다. 중복 이름은 하나의 항목으로 합쳐지며, 순서는 첫 등장을 따릅니다. 서로 다른 모든 이름은 서브셋 여부와 무관하게 하나의 SubsetInfo를 만들어냅니다. 이름이 정확히 대문자 ASCII 6자로 시작하고 그 뒤에 +가 오면 §9.9.2 규칙에 따른 서브셋입니다. 서브셋 이름의 경우 baseFont는 7자 접두사를 제거한 이름입니다. 일반 이름의 경우 baseFontfontName과 동일합니다. 서로 다른 각 서브셋 이름은 자체 항목으로 보고되며, 이는 서브셋을 독립된 개체로 취급하라는 §9.9.2 지침에 부합합니다.

각 글꼴에 대해 스캐너는 /BaseFont 등장 이후의 제한된 바이트 창을 검색합니다. 창 안의 /Encoding 이름 항목이 우선합니다. 그것이 없으면 창 안의 Identity-H 또는 Identity-V 부분 문자열이 보고됩니다. 둘 다 없으면 항목은 Unknown을 보고합니다. 딕셔너리에 담기거나 간접 참조를 통해 도달하는 인코딩 값은 Unknown을 보고합니다.

두 글리프 수는 모두 추정치입니다. subsetGlyphCount는 글꼴 항목 근처에서 보이는 폭 배열에서 도출됩니다. CIDFont /W 배열은 대략 폭 3개 조합당 글리프 하나를 산출하고, 단순 글꼴 /Widths 배열은 숫자 항목당 글리프 하나를 산출합니다. 창 안에 어느 배열도 보이지 않으면 작은 고정 기본값이 적용됩니다. 창 검색을 위해 /BaseFont 등장 위치를 다시 찾을 수 없으면 수는 0입니다. fullGlyphCount는 패밀리 이름 휴리스틱에서 도출됩니다. 잘 알려진 Latin 패밀리 표, CJK 패밀리 이름 지표 집합, 그리고 그 외의 일반적 하한선입니다. 임베드된 글꼴 프로그램은 결코 파싱하지 않습니다. 구체적인 표, 창 크기, 상수는 구현 세부이며, 공개되지 않고, 릴리스마다 변경될 수 있습니다.

generateDesubsetPlan()은 입력을 isSubsettrue인 항목으로 걸러냅니다. 각 대상은 누락 글리프 수에 고정된 글리프당 평균 바이트 상수를 곱한 값을 estimatedSizeIncrease에 기여합니다. 이 계획은 용량 결정을 위한 투영이며, 측정된 차이가 아닙니다. 계획을 실행하는 것(글꼴 프로그램 다시 쓰기)은 이 모듈의 범위 밖입니다.

이 표면 전체는 입력의 순수 함수입니다. 동일한 바이트는 동일한 결과를 산출합니다. 무작위성도, 네트워크 호출도, 파일 시스템 접근도 없습니다.

  • SubsetInfo 생성은 잘못된 상태를 거부합니다. 음수 글리프 수, 또는 전체 수를 초과하는 서브셋 수는 InvalidArgumentException을 던집니다.
  • analyzeSubsets()는 한 가지 경우에 그 예외를 전파할 수 있습니다. 이름이 알려진 패밀리와 일치하지만 보이는 폭 배열이 그 패밀리의 전체 수 값보다 큰 서브셋 추정치를 산출하는 글꼴입니다.
  • 탐지는 바이트 표현에 대해 작동합니다. 압축된 객체 스트림 안에 직렬화된 /BaseFont 항목은 보이지 않으므로, 스캔 전에 해당 스트림의 압축을 해제하십시오.
  • /BaseFont 키와 값이 단일 공백 이외의 공백으로 분리된 항목은 여전히 탐지되지만, 글꼴별 창 검색이 위치를 다시 찾지 못합니다. 그런 항목은 인코딩 Unknown과 서브셋 글리프 수 0을 보고합니다.
  • #-이스케이프 바이트를 사용하는 PDF 이름은 원시 이스케이프 형태로 보고되며, 이스케이프는 디코딩되지 않습니다.
  • 중복된 /BaseFont 이름은 하나의 항목으로 합쳐집니다. 하나의 이름을 공유하는 서로 다른 두 글꼴 객체는 이 스캐너에게는 구별되지 않습니다.
  • generateDesubsetPlan()은 비서브셋 입력에서 결코 실패하지 않습니다. isSubsetfalse로 설정된 항목은 단순히 targets에서 제외됩니다.
  • 모든 수와 estimatedSizeIncrease는 휴리스틱입니다. 이를 측정된 값으로 취급하지 말고, 분류와 용량 계획에만 사용하십시오.
  • 이 모듈에서는 어떠한 암호화 연산도 발생하지 않으므로, FIPS 모드 특유의 동작은 없습니다.
주장표준
서브셋 탐지는 서브셋 명명 규칙에 일치합니다. 대문자 6자 태그 뒤에 +를 붙여 BaseFont 값 앞에 놓는 규칙입니다.ISO 32000-2:2020§9.9.2
서로 다른 각 서브셋 이름은, 여러 서브셋을 별개 개체로 취급하라는 권고에 따라 독립적으로 보고됩니다.ISO 32000-2:2020§9.9.2

모든 절은 의역이며, NextPDF는 규범 텍스트를 재현하지 않습니다. 이는 기능 진술이지 인증이 아닙니다. NextPDF는 어떠한 인증도 보유하지 않으며 어떠한 인증도 부여하지 않습니다. 이 모듈은 명명 규칙의 탐지와 결정적 보고를 주장하며, 글리프 수나 크기 추정치의 정확성은 주장하지 않습니다.

  • composer require nextpdf/pro:^3으로 설치합니다. nextpdf/pro 1.9.0부터 제공되며, nextpdf/pro 3.1.0에서 최신입니다.
  • FontDesubsetter는 무상태입니다. 한 번 생성하여 문서와 작업 스레드 전반에서 재사용하십시오.
  • 서브셋 커버리지가 중요할 때는 analyzeSubsets()에 압축이 해제된 바이트를 공급하십시오. 그렇지 않으면 객체 스트림에 담긴 글꼴 딕셔너리는 놓칩니다.
  • 조치하기 전에 SubsetInfo::isSubset으로 분기하십시오. 결과 목록은 인벤토리 목적을 위해 의도적으로 비서브셋 글꼴을 포함합니다.
  • 전체 글꼴 프로그램을 확보하기 전에 de-subsetting이 파일 크기 비용을 감수할 만한지 판단하려면 DesubsetPlan::totalGlyphsNeeded()estimatedSizeIncrease를 사용하십시오.
  • 스캔은 입력 길이에 선형이며 글꼴별 창 검색은 제한적입니다. 이 모듈은 아무것도 저장하지 않고 텔레메트리도 방출하지 않습니다.

이 페이지는 외부에서 관찰 가능한 동작과 지원되는 공개 API 표면만 문서화합니다. 내부 네임스페이스 경로, 헬퍼 클래스, 메커니즘 표, 런북 파일명, 티켓 접두사는 범위 밖입니다.