Pro 에디션
Optimizer
한눈에 보기
섹션 제목: “한눈에 보기”Optimizer는 PDF에서 중복 객체와 이미지 재압축 가능성을 분석한 뒤 예상 크기 감소를 보고합니다. 세 가지 레벨이 출력 충실도와 파일 크기를 절충합니다.
사용 가능 여부 및 라이선스
섹션 제목: “사용 가능 여부 및 라이선스”이 기능은 NextPDF Pro(nextpdf/pro)에 포함되어 있으며 Pro 계층 라이선스 엔벨로프로 활성화됩니다. 해당 권한이 없는 배포에서는 이 기능의 클래스가 로드되지 않습니다. 에디션 비교 및 라이선스 받기.
기능별로 분리된 라이선스 플래그는 없습니다. 최적화 레벨(lossless, balanced, aggressive)은 라이선스 스위치가 아니라 런타임 매개변수입니다.
composer require nextpdf/pro:^3코드는 NextPDF\Pro\Optimizer 네임스페이스 아래에 있습니다.
개념 개요
섹션 제목: “개념 개요”PdfOptimizer는 객체 중복 제거기와 이미지 재압축기를 조율합니다. 원시 PDF 바이트가 주어지면, (레벨이 허용할 때) 중복 객체 그룹을 찾고, 이미지를 분석하며, 레벨의 목표 품질에서 각 이미지의 압축을 추정합니다. 그 결과를 OptimizationResult로 집계하여 원본 크기, 예상 최적화 크기, 제거된 객체, 그리고 전후 이미지 수를 보고합니다.
OptimizationLevel은 절충을 정의합니다. lossless는 이미지 품질을 보존하고 바이트가 안정적인 출력을 위해 중복 제거를 건너뜁니다. balanced는 중복을 제거하고 75퍼센트 이미지 품질을 목표로 합니다. aggressive는 중복을 제거하고, 다운샘플링하며, 50퍼센트 품질을 목표로 합니다.
이렇게 작동하는 이유
섹션 제목: “이렇게 작동하는 이유”Optimizer는 다시 쓰는 것이 아니라 분석합니다. analyze()는 잠재적 절감량을 추정하고 입력을 변경하지 않은 채 OptimizationResult를 반환합니다. 이로써 이 패스는 비파괴적으로 유지되며, Writer를 통해 적용할지 여부를 사용자가 결정할 수 있습니다. 레벨 추상화는 절충을 한곳에 담습니다. lossless는 deduplicateStreams()에서 false를 반환하므로 출력이 바이트 단위로 동일하게 유지될 수 있고, balanced와 aggressive는 더 낮은 품질 목표로 이미지 스트림을 재압축합니다. 달성 가능한 절감량은 문서가 이미 스트림과 이미지를 어떻게 인코딩하는지에 따라 달라지므로, 이 모듈은 고정된 대표 수치가 아니라 실제로 존재하는 객체로부터 추정치를 보고합니다. 설계 배경: Streams and filters.
동작 계약
섹션 제목: “동작 계약”analyze($pdfData)는OptimizationResult를 반환합니다. 입력을 변경하지 않습니다.- lossless 레벨은 출력이 바이트 안정적으로 유지될 수 있도록 스트림 중복 제거를 건너뜁니다. balanced와 aggressive는 중복 제거를 활성화합니다.
- 이미지 품질 목표는 lossless, balanced, aggressive에 대해 각각 100, 75, 50퍼센트입니다.
- 예상 최적화 크기는 0 미만으로 떨어지지 않으며 원본을 초과하지 않습니다.
withLevel($level)은 요청된 레벨의 새 optimizer를 반환합니다. 인스턴스는 변경되지 않습니다.
코드 샘플 — 빠른 시작
섹션 제목: “코드 샘플 — 빠른 시작”다음은 문서화된 공개 API를 반영합니다. 리포지터리는 이 모듈에 대한 실행 가능한 예제를 제공하지 않습니다.
use NextPDF\Pro\Optimizer\PdfOptimizer;
$result = (new PdfOptimizer())->analyze($pdfBytes);코드 샘플 — 프로덕션
섹션 제목: “코드 샘플 — 프로덕션”use NextPDF\Pro\Optimizer\PdfOptimizer;use NextPDF\Pro\Optimizer\OptimizationLevel;
$optimizer = new PdfOptimizer(OptimizationLevel::Aggressive);$result = $optimizer->analyze($pdfBytes);
$savings = $result->originalSize > 0 ? (1 - $result->optimizedSize / $result->originalSize) * 100 : 0.0;엣지 케이스 및 함정
섹션 제목: “엣지 케이스 및 함정”analyze()는 가능성을 추정합니다. 최적화된 문서를 생성하려면 Writer 모듈과 짝지어 사용하십시오.- lossless 레벨은 품질을 보존하고 중복 제거를 건너뛰기 때문에 의도적으로 크기 감소가 거의 없습니다.
- 최적화 후 이미지 수는 중복 제거로 제거된 이미지를 반영하며, 삭제된 이미지가 아닙니다.
분석은 입력 크기에 선형적이며 여기에 객체 및 이미지 구조 스캔 비용이 더해집니다. 레벨은 중복 제거 및 재압축 추정이 얼마나 적극적인지를 제어합니다. 발행된 고정 크기 감소 수치는 없습니다. 결과는 전적으로 문서에 따라 달라집니다. 대표적인 문서로 측정하십시오.
보안 참고
섹션 제목: “보안 참고”입력을 신뢰할 수 없는 것으로 취급하십시오. 분석은 읽기 전용으로 유지되며 포함된 콘텐츠를 실행하지 않습니다. 이 모듈은 문서 콘텐츠를 로깅하지 않습니다.
적합성
섹션 제목: “적합성”최적화는 ISO 32000-2가 정의하는 PDF 객체 및 이미지 모델에서 작동합니다. 소스가 관련 조항을 주석으로 표시합니다. 작성 시점에 RAG 코퍼스를 사용할 수 없었으므로, 이 페이지는 외부 조항 식별자를 주장하지 않으며 적합성 진술을 모듈 테스트로 검증된 동작으로 한정합니다.
Enterprise 경계 참고
섹션 제목: “Enterprise 경계 참고”Enterprise는 Optimizer 동작을 변경하지 않습니다. Enterprise는 별도로 문서화된 상위 계층의 규정 준수 및 보관 기능을 추가합니다. 이는 최적화 가능성을 분석하는 데 필요하지 않습니다.
Core 폴백 / 대안
섹션 제목: “Core 폴백 / 대안”Pro 없이는 NextPDF Core의 기본 최적화를 사용하십시오. 객체 중복 제거와 조정 가능한 이미지 재압축 분석은 Pro 추가 기능입니다.를 참조하십시오.
게시 경계
섹션 제목: “게시 경계”이 페이지는 외부에서 관찰 가능한 동작과 지원되는 공개 API 표면만 문서화합니다. 내부 네임스페이스 경로, 헬퍼 클래스, 메커니즘 표, 런북 파일명, 티켓 접두사는 범위 밖입니다.