Pro 에디션
Font Tools — 심층 참조
한눈에 보기
섹션 제목: “한눈에 보기”이 페이지는 NextPDF Pro Font Tools의 계약 수준 참조입니다. 표면은 스캐너 하나 NextPDF\Pro\FontTools\FontDesubsetter와, 불변 값 객체 둘 SubsetInfo 및 DesubsetPlan으로 구성됩니다. 스캐너는 원시 PDF 바이트를 읽고, 서로 다른 모든 /BaseFont 항목을 보고하며, ISO 32000-2:2020 §9.9.2의 서브셋 명명 규칙을 따르는 항목을 표시합니다. 계획은 표시된 서브셋을 집계하고 전체 글꼴 프로그램을 복원하는 데 드는 바이트 비용을 추정합니다. 이 모듈은 분석과 추정만 수행하며, 임베드된 글꼴 프로그램을 결코 다시 쓰지 않습니다. 이 페이지는 공개 API, 관찰 가능한 동작 계약, 그리고 실패 모드를 명시합니다.
가용성 및 라이선싱
섹션 제목: “가용성 및 라이선싱”이 기능은 NextPDF Pro(nextpdf/pro)로 제공되며 Pro 등급 라이선스 봉투로 활성화됩니다. 해당 자격이 없는 배포에서는 이 기능의 클래스가 로드되지 않습니다. 에디션 비교 및 라이선스 받기.
이 모듈을 게이트하는 기능별 라이선스 플래그는 없습니다. Font Tools 클래스는 nextpdf/pro가 설치되어 있으면 언제든지 사용할 수 있습니다.
공개 API 표면
섹션 제목: “공개 API 표면”| 심볼 | 매개변수 | 기본 동작 | 반환 | 예외 또는 실패 | 비고 |
|---|---|---|---|---|---|
FontDesubsetter | 없음 | 원시 PDF 바이트에 대한 무상태 스캐너 | — | — | final; 문서 간 재사용 안전 |
FontDesubsetter::analyzeSubsets() | string $pdfData | 서브셋 여부와 무관하게 서로 다른 모든 /BaseFont 항목을 isSubset로 표시하여 보고 | list<SubsetInfo> | 폭에서 도출한 서브셋 추정치가 이름에서 도출한 전체 수 추정치를 초과하면 InvalidArgumentException | 바이트 수준 스캔; 압축된 객체 스트림은 디코딩하지 않음 |
FontDesubsetter::isSubsetFont() | string $baseFontName | 대문자 6자 + + 접두사 규칙에 일치 | bool | — | 이름 시작에 고정(anchored) |
FontDesubsetter::extractSubsetPrefix() | string $baseFontName | 6자 서브셋 태그를 반환 | string | — | 비서브셋 이름에는 빈 문자열 |
FontDesubsetter::generateDesubsetPlan() | list<SubsetInfo> $subsets | isSubset이 true인 항목을 모아 크기 추정치를 합산 | DesubsetPlan | 예외를 던지지 않음 | 비서브셋 항목은 조용히 건너뜀 |
SubsetInfo | 생성자: $fontName, $baseFont, $subsetGlyphCount, $fullGlyphCount, $isSubset, $encoding | 하나의 /BaseFont 항목에 대한 불변 서술 | — | 음수 글리프 수, 또는 전체 수를 초과하는 서브셋 수에 대해 InvalidArgumentException | final readonly; 모든 속성 public |
SubsetInfo::subsetPrefix() | 없음 | fontName에서 6자 태그를 추출 | string | — | 서브셋이 아니거나 +가 6번째 위치에서 벗어나 있으면 빈 문자열 |
SubsetInfo::coveragePercent() | 없음 | 전체 글리프 집합 대비 서브셋 비율 | [0.0, 100.0] 범위의 float | — | fullGlyphCount가 0이면 0.0 반환 |
DesubsetPlan | 생성자: list<SubsetInfo> $targets, int $estimatedSizeIncrease | 불변 de-subsetting 계획 | — | — | final readonly; 모든 속성 public |
DesubsetPlan::count() | 없음 | 대상 글꼴 수 | int | — | targets 길이와 동일 |
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): 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(): int동작 계약
섹션 제목: “동작 계약”스캔 및 서브셋 탐지
섹션 제목: “스캔 및 서브셋 탐지”analyzeSubsets()는 바이트 수준 패턴 매칭으로 원시 바이트에서 /BaseFont 이름 토큰을 추출합니다. 중복 이름은 하나의 항목으로 합쳐지며, 순서는 첫 등장을 따릅니다. 서로 다른 모든 이름은 서브셋 여부와 무관하게 하나의 SubsetInfo를 만들어냅니다. 이름이 정확히 대문자 ASCII 6자로 시작하고 그 뒤에 +가 오면 §9.9.2 규칙에 따른 서브셋입니다. 서브셋 이름의 경우 baseFont는 7자 접두사를 제거한 이름입니다. 일반 이름의 경우 baseFont는 fontName과 동일합니다. 서로 다른 각 서브셋 이름은 자체 항목으로 보고되며, 이는 서브셋을 독립된 개체로 취급하라는 §9.9.2 지침에 부합합니다.
인코딩 탐지
섹션 제목: “인코딩 탐지”각 글꼴에 대해 스캐너는 /BaseFont 등장 이후의 제한된 바이트 창을 검색합니다. 창 안의 /Encoding 이름 항목이 우선합니다. 그것이 없으면 창 안의 Identity-H 또는 Identity-V 부분 문자열이 보고됩니다. 둘 다 없으면 항목은 Unknown을 보고합니다. 딕셔너리에 담기거나 간접 참조를 통해 도달하는 인코딩 값은 Unknown을 보고합니다.
글리프 회계
섹션 제목: “글리프 회계”두 글리프 수는 모두 추정치입니다. subsetGlyphCount는 글꼴 항목 근처에서 보이는 폭 배열에서 도출됩니다. CIDFont /W 배열은 대략 폭 3개 조합당 글리프 하나를 산출하고, 단순 글꼴 /Widths 배열은 숫자 항목당 글리프 하나를 산출합니다. 창 안에 어느 배열도 보이지 않으면 작은 고정 기본값이 적용됩니다. 창 검색을 위해 /BaseFont 등장 위치를 다시 찾을 수 없으면 수는 0입니다. fullGlyphCount는 패밀리 이름 휴리스틱에서 도출됩니다. 잘 알려진 Latin 패밀리 표, CJK 패밀리 이름 지표 집합, 그리고 그 외의 일반적 하한선입니다. 임베드된 글꼴 프로그램은 결코 파싱하지 않습니다. 구체적인 표, 창 크기, 상수는 구현 세부이며, 공개되지 않고, 릴리스마다 변경될 수 있습니다.
계획 생성
섹션 제목: “계획 생성”generateDesubsetPlan()은 입력을 isSubset이 true인 항목으로 걸러냅니다. 각 대상은 누락 글리프 수에 고정된 글리프당 평균 바이트 상수를 곱한 값을 estimatedSizeIncrease에 기여합니다. 이 계획은 용량 결정을 위한 투영이며, 측정된 차이가 아닙니다. 계획을 실행하는 것(글꼴 프로그램 다시 쓰기)은 이 모듈의 범위 밖입니다.
결정성
섹션 제목: “결정성”이 표면 전체는 입력의 순수 함수입니다. 동일한 바이트는 동일한 결과를 산출합니다. 무작위성도, 네트워크 호출도, 파일 시스템 접근도 없습니다.
엣지 케이스 및 실패 모드
섹션 제목: “엣지 케이스 및 실패 모드”SubsetInfo생성은 잘못된 상태를 거부합니다. 음수 글리프 수, 또는 전체 수를 초과하는 서브셋 수는InvalidArgumentException을 던집니다.analyzeSubsets()는 한 가지 경우에 그 예외를 전파할 수 있습니다. 이름이 알려진 패밀리와 일치하지만 보이는 폭 배열이 그 패밀리의 전체 수 값보다 큰 서브셋 추정치를 산출하는 글꼴입니다.- 탐지는 바이트 표현에 대해 작동합니다. 압축된 객체 스트림 안에 직렬화된
/BaseFont항목은 보이지 않으므로, 스캔 전에 해당 스트림의 압축을 해제하십시오. /BaseFont키와 값이 단일 공백 이외의 공백으로 분리된 항목은 여전히 탐지되지만, 글꼴별 창 검색이 위치를 다시 찾지 못합니다. 그런 항목은 인코딩Unknown과 서브셋 글리프 수0을 보고합니다.#-이스케이프 바이트를 사용하는 PDF 이름은 원시 이스케이프 형태로 보고되며, 이스케이프는 디코딩되지 않습니다.- 중복된
/BaseFont이름은 하나의 항목으로 합쳐집니다. 하나의 이름을 공유하는 서로 다른 두 글꼴 객체는 이 스캐너에게는 구별되지 않습니다. generateDesubsetPlan()은 비서브셋 입력에서 결코 실패하지 않습니다.isSubset이false로 설정된 항목은 단순히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/pro1.9.0부터 제공되며,nextpdf/pro3.1.0에서 최신입니다.FontDesubsetter는 무상태입니다. 한 번 생성하여 문서와 작업 스레드 전반에서 재사용하십시오.- 서브셋 커버리지가 중요할 때는
analyzeSubsets()에 압축이 해제된 바이트를 공급하십시오. 그렇지 않으면 객체 스트림에 담긴 글꼴 딕셔너리는 놓칩니다. - 조치하기 전에
SubsetInfo::isSubset으로 분기하십시오. 결과 목록은 인벤토리 목적을 위해 의도적으로 비서브셋 글꼴을 포함합니다. - 전체 글꼴 프로그램을 확보하기 전에 de-subsetting이 파일 크기 비용을 감수할 만한지 판단하려면
DesubsetPlan::totalGlyphsNeeded()와estimatedSizeIncrease를 사용하십시오. - 스캔은 입력 길이에 선형이며 글꼴별 창 검색은 제한적입니다. 이 모듈은 아무것도 저장하지 않고 텔레메트리도 방출하지 않습니다.
게시 경계
섹션 제목: “게시 경계”이 페이지는 외부에서 관찰 가능한 동작과 지원되는 공개 API 표면만 문서화합니다. 내부 네임스페이스 경로, 헬퍼 클래스, 메커니즘 표, 런북 파일명, 티켓 접두사는 범위 밖입니다.
함께 보기
섹션 제목: “함께 보기”- Font Tools (기능) — 설치, 빠른 시작, 계획 워크플로 샘플.
- Optimizer — 심층 참조 — 글꼴 관련 최적화를 포함한 자매 크기 축소 표면.
- Core 글꼴 모듈 — NextPDF Core에서 문서 생성 중의 글꼴 임베딩 및 서브셋화.