Bỏ qua để đến nội dung
getnextpdf.com

Pro phiên bản

Optimizer — Tài liệu tham chiếu chuyên sâu

Trang này là tài liệu tham chiếu chuyên sâu cho bề mặt công khai của NextPDF\Pro\Optimizer. Nó bao quát bộ điều phối phân tích, các mức tối ưu hóa, hai bộ quét, và các đối tượng giá trị kết quả. Nó nêu rõ tham số, giá trị mặc định, số học ước tính, và các chế độ lỗi. Việc phân tích là chỉ-đọc: nó ước tính khoản tiết kiệm và không tạo ra tài liệu đầu ra nào. Hãy đọc trang năng lực Optimizer trước để có hướng dẫn quy trình.

Năng lực này được cung cấp trong NextPDF Pro (nextpdf/pro) và kích hoạt bằng một license envelope bậc Pro. Một triển khai không có quyền đó sẽ không nạp các lớp của năng lực này. So sánh các phiên bản và lấy giấy phép.

Optimizer không có cờ giấy phép theo từng tính năng. Đây là một năng lực của phiên bản Pro. Mức tối ưu hóa là một tham số lúc chạy, không phải một công tắc giấy phép.

Terminal window
composer require nextpdf/pro:^3

Metapackage nextpdf/premium cài đặt phần mã nextpdf/pro; module này nằm trong namespace NextPDF\Pro\Optimizer.

Ký hiệuTham sốHành vi mặc địnhTrả vềNém hoặc thất bại vớiGhi chú
PdfOptimizer::__constructOptimizationLevel $level = OptimizationLevel::BalancedDựng một optimizer ở mức đã choPdfOptimizerKhông khai báo gìTự dựng các thể hiện bộ quét của riêng nó
PdfOptimizer::analyzestring $pdfDataPhân tích chỉ-đọc ở mức đã cấu hìnhOptimizationResultOverflowException khi đầu vào trên 100,000,000 byte; InvalidArgumentException từ các bộ quét khi dữ liệu PDF không hợp lệChỉ ước tính; không tạo tài liệu đầu ra
PdfOptimizer::withLevelOptimizationLevel $levelTrả về một optimizer mới ở mức được yêu cầuselfKhông khai báo gìThể hiện nhận lời gọi không bị thay đổi
OptimizationLevelcác case Lossless, Balanced, AggressiveEnum nền chuỗi cho các mức độ quyết liệtCác giá trị nền lossless, balanced, aggressive
OptimizationLevel::labelkhông cóNhãn mức dễ đọc cho ngườistringKhông khai báo gìDùng để hiển thị
OptimizationLevel::imageQualitykhông cóChất lượng ảnh mục tiêu cho mứcintKhông khai báo gì100, 75, hoặc 50
OptimizationLevel::deduplicateStreamskhông cóLiệu mức có bật khử trùng lặp hay khôngboolKhông khai báo gìfalse chỉ với Lossless
OptimizationResult::__constructint $originalSize, int $optimizedSize, int $objectsRemoved, int $imagesBefore, int $imagesAfter, float $processingTimeMsKết quả phân tích bất biếnOptimizationResultKhông khai báo gìMọi thuộc tính đều public và readonly
OptimizationResult::savedByteskhông cóKích thước gốc trừ kích thước tối ưu ước tínhintKhông khai báo gìByte
OptimizationResult::savedPercentkhông cóPhần trăm giảm kích thướcfloatKhông khai báo gì0.0 khi kích thước gốc bằng không
OptimizationResult::summarykhông cóBáo cáo nhiều dòng dễ đọc cho ngườistringKhông khai báo gìKích thước định dạng theo B, KB, hoặc MB
ObjectDeduplicator::findDuplicatesstring $pdfDataNhóm các thân đối tượng giống hệt nhau theo băm SHA-256list<DuplicateGroup>InvalidArgumentException khi thiếu header %PDF, đầu vào trên 268,435,456 byte, hoặc hơn 500,000 dấu đối tượngChỉ trả về các nhóm có từ hai thành viên trở lên
ObjectDeduplicator::estimateSavingslist<DuplicateGroup> $groupsCộng số lượng bản trùng nhân với kích thước đối tượng theo từng nhómintKhông khai báo gìByte
ImageRecompressor::analyzeImagesstring $pdfDataTrích xuất metadata cho mọi image XObjectlist<ImageAnalysis>InvalidArgumentException khi thiếu header %PDFBỏ qua các đối tượng không có chiều rộng và chiều cao tường minh
ImageRecompressor::suggestCompressionImageAnalysis $image, OptimizationLevel $levelĐề xuất một filter và ước tính khoản tiết kiệmImageCompressionSuggestionKhông khai báo gìHeuristic phụ thuộc vào mức; xem hợp đồng hành vi
DuplicateGroup::__constructstring $contentHash, list<int> $objectNumbers, int $objectSizeBản ghi nhóm-trùng-lặp bất biếnDuplicateGroupKhông khai báo gìSố đối tượng đầu tiên là đối tượng chuẩn được giữ lại
DuplicateGroup::duplicateCountkhông cóKích thước nhóm trừ đối tượng chuẩnintKhông khai báo gìCác đối tượng có thể loại bỏ bằng cách gộp
ImageAnalysis::__constructint $objectNumber, int $width, int $height, string $colorSpace, int $bitsPerComponent, string $filter, int $streamSizeBản ghi metadata theo từng ảnh bất biếnImageAnalysisKhông khai báo gìCác trường phản chiếu các mục của image dictionary
ImageAnalysis::estimatedDpifloat $displayWidthPtDPI hữu hiệu tại chiều rộng hiển thị đã chofloatKhông khai báo gì0.0 khi chiều rộng hiển thị bằng không hoặc âm
ImageAnalysis::isOverResolutionfloat $displayWidthPt, int $targetDpi = 300Đánh dấu các ứng viên hạ mẫu vượt DPI mục tiêuboolKhông khai báo gìSo sánh lớn hơn nghiêm ngặt
ImageCompressionSuggestion::__constructint $objectNumber, string $currentFilter, string $suggestedFilter, int $estimatedSavings, string $reasonBản ghi khuyến nghị bất biếnImageCompressionSuggestionKhông khai báo gìreason là văn bản giải thích dễ đọc cho người
final class PdfOptimizer
{
public function __construct(
private OptimizationLevel $level = OptimizationLevel::Balanced,
)
public function analyze(string $pdfData): OptimizationResult
public function withLevel(OptimizationLevel $level): self
}
enum OptimizationLevel: string
{
case Lossless = 'lossless';
case Balanced = 'balanced';
case Aggressive = 'aggressive';
public function label(): string
public function imageQuality(): int
public function deduplicateStreams(): bool
}
final readonly class OptimizationResult
{
public function __construct(
public int $originalSize,
public int $optimizedSize,
public int $objectsRemoved,
public int $imagesBefore,
public int $imagesAfter,
public float $processingTimeMs,
)
public function savedBytes(): int
public function savedPercent(): float
public function summary(): string
}
final class ObjectDeduplicator
{
public function findDuplicates(string $pdfData): array
public function estimateSavings(array $groups): int
}
final class ImageRecompressor
{
public function analyzeImages(string $pdfData): array
public function suggestCompression(
ImageAnalysis $image,
OptimizationLevel $level,
): ImageCompressionSuggestion
}

PdfOptimizer::analyze nhận byte PDF thô và là chỉ-đọc. Trước tiên nó giới hạn đầu vào không tin cậy ở 100,000,000 byte; đầu vào quá cỡ làm phát sinh OverflowException trước khi bất kỳ lần quét nào chạy. Sau đó nó chạy phân tích khử trùng lặp khi mức cho phép, luôn chạy phân tích ảnh, và tổng hợp cả hai vào một OptimizationResult. withLevel trả về một optimizer mới; các thể hiện không bao giờ bị biến đổi.

MứcChất lượng ảnh mục tiêuKhử trùng lặpÝ định
Lossless100%TắtKhông mất chất lượng; chủ ý đầu ra ổn định byte
Balanced75%BậtĐánh đổi chất lượng vừa phải; giá trị mặc định
Aggressive50%BậtGiảm tối đa; hạ mẫu; mất chất lượng thấy rõ

Lossless bỏ qua khử trùng lặp để đầu ra có thể giữ ổn định byte. Chất lượng mục tiêu là đầu vào cho số học gợi ý ảnh bên dưới.

Bộ khử trùng lặp quét các định nghĩa đối tượng gián tiếp thế hệ-không (N 0 obj cho tới endobj). Mỗi thân được cắt bỏ khoảng trắng xung quanh, băm bằng SHA-256, và nhóm theo băm. Do đó các định nghĩa chỉ khác nhau ở phần đệm vẫn khớp nhau. Chỉ các nhóm có từ hai thành viên trở lên được trả về. Khoản tiết kiệm ước tính cho mỗi nhóm bằng số lượng bản trùng nhân với kích thước một thân, vì mọi đối tượng ngoài đối tượng chuẩn đều có thể loại bỏ.

Một đối tượng được coi là ảnh khi thân của nó chứa /Subtype /Image (có hoặc không có khoảng trắng bên trong). Chiều rộng và chiều cao là bắt buộc; một đối tượng thiếu một trong hai sẽ bị bỏ qua. Không gian màu mặc định là DeviceRGB, số bit trên mỗi thành phần là 8, và filter là chuỗi rỗng khi vắng mặt. Kích thước stream được đo giữa các dấu streamendstream; khi không tìm thấy stream nội tuyến, giá trị /Length được dùng thay thế.

  • Ở mức Lossless, filter hiện tại được giữ nguyên và khoản tiết kiệm ước tính bằng không.
  • Với nguồn DCTDecode, gợi ý mã hóa lại ở chất lượng của mức. Ước tính bằng kích thước stream nhân với (1 − quality/100) nhân với 0.5.
  • Với nguồn FlateDecode, gợi ý chuyển sang DCTDecode. Ước tính bằng 40% kích thước stream ở Balanced và 60% ở Aggressive.
  • Với bất kỳ filter nào khác, hoặc không có filter, gợi ý chuyển sang FlateDecode. Ước tính bằng 20% kích thước stream.
  • Số đối tượng loại bỏ bằng tổng, trên tất cả các nhóm trùng lặp, của các thành viên ngoài đối tượng chuẩn đầu tiên.
  • Tổng khoản tiết kiệm bằng khoản tiết kiệm khử trùng lặp cộng với các ước tính gợi ý theo từng ảnh.
  • Kích thước tối ưu ước tính bằng kích thước gốc trừ tổng khoản tiết kiệm, giới hạn dưới ở không. Khoản tiết kiệm không âm, nên ước tính không bao giờ vượt quá kích thước gốc.
  • Số ảnh-sau trừ đi, với mỗi nhóm trùng lặp có chứa một ảnh đã phân tích, số thành viên trùng của nhóm đó. Số đếm được giới hạn dưới ở không.
  • Thời gian xử lý được đo bằng đồng hồ đơn điệu và báo cáo theo mili-giây.

Bộ ước tính DPI chia chiều rộng điểm ảnh cho chiều rộng hiển thị tính theo inch (72 point trên một inch). Chiều rộng hiển thị bằng không hoặc âm cho ra 0.0. Vị từ vượt-độ-phân-giải so sánh ước tính với một mục tiêu, mặc định 300 DPI.

  • analyze chỉ báo cáo tiềm năng. Hãy tạo đầu ra đã tối ưu bằng module Writer.
  • Đầu vào rỗng, hoặc đầu vào không bắt đầu bằng header %PDF, thất bại với InvalidArgumentException.
  • Đầu vào trên 100,000,000 byte thất bại với OverflowException ngay tại cửa trước của bộ điều phối, trước bất kỳ lần quét nào.
  • Bộ khử trùng lặp độc lập từ chối đầu vào trên 268,435,456 byte và hơn 500,000 dấu đối tượng. Cả hai đều từ chối theo kiểu fail-closed với InvalidArgumentException; không có gì bị cắt cụt hoặc quét một phần.
  • Chỉ các định nghĩa đối tượng thế hệ-không tham gia. Các đối tượng có số thế hệ khác không sẽ không được quét.
  • Một định nghĩa không có dấu endobj kết thúc sẽ bị bỏ qua.
  • Các đối tượng ảnh không có chiều rộng và chiều cao tường minh bị loại khỏi báo cáo ảnh.
  • Mọi con số tiết kiệm đều là heuristic suy ra từ metadata đối tượng, không phải kết quả nén lại đã đo.
  • Mức lossless chủ ý báo cáo các khoản giảm nhỏ; nó bảo toàn chất lượng và bỏ qua khử trùng lặp.
  • Việc phân tích không bao giờ giải mã, thực thi, hay kết xuất nội dung được nhúng. Nó chỉ đọc cấu trúc đối tượng và metadata.
  • Nguyên thủy mã hóa duy nhất được dùng là SHA-256, để nhóm nội dung trùng lặp. Module không định nghĩa hành vi đặc thù FIPS nào.

Cả hai bộ quét đều hoạt động trên mô hình đối tượng và ảnh PDF của ISO 32000-2:2020. Khử trùng lặp nhắm vào các định nghĩa đối tượng gián tiếp; cấu trúc định danh của chúng được định nghĩa trong ISO 32000-2:2020, 7.3.10, được trích dẫn trong bản ghi trích dẫn của trang này. Phân tích ảnh đọc các tham số mà một image dictionary nêu tường minh — chiều rộng, chiều cao, và số bit trên mỗi thành phần — theo ISO 32000-2:2020, 8.9.4, cũng được trích dẫn.

Các phát biểu này mô tả năng lực đối chiếu với các điều khoản được trích dẫn. NextPDF không nắm giữ chứng nhận phù hợp nào, và việc hỗ trợ một điều khoản không phải là một tuyên bố chứng nhận.

  • Mã nguồn module mang @since 1.9.0; tài liệu tham chiếu này mô tả bề mặt như được phát hành trong nextpdf/pro 3.1.0.
  • Mọi lớp đều là final; các bản ghi kết quả và phân tích là các đối tượng giá trị readonly. Hãy dựng thể hiện mới thay vì biến đổi.
  • Mức mặc định là Balanced. Chọn mức khác thông qua constructor hoặc phương thức kiểu with.
  • Giới hạn đầu vào ở cửa trước được thực thi bởi một bộ bảo vệ kích-thước-đầu-vào của Core dùng chung trên các bề mặt đầu vào NextPDF.
  • Việc phân tích dựa trên chuỗi trên các byte đã có sẵn trong bộ nhớ. Module không thực hiện truy cập hệ thống tệp hay mạng.
  • Chi tiết cơ chế nội bộ được giữ trong tài liệu nội bộ của kho mã nguồn và nằm ngoài phạm vi của cẩm nang này.

Trang này chỉ mô tả hành vi quan sát được từ bên ngoài và bề mặt API công khai được hỗ trợ. Các đường dẫn namespace nội bộ, lớp trợ giúp, bảng cơ chế, tên tệp runbook, và tiền tố ticket đều nằm ngoài phạm vi.