跳轉到

效能最佳化指南

Pro:PDF 最佳化器

安裝

composer require nextpdf/pro

基本用法

use NextPDF\Pro\Optimizer\PdfOptimizer;
use NextPDF\Pro\Optimizer\ValueObjects\OptimizationProfile;

$optimizer = PdfOptimizer::create();

$optimized = $optimizer->optimize(
    document: $document,
    profile:  OptimizationProfile::balanced(),
);

$optimized->save('/output/optimized.pdf');

// 取得最佳化統計
$stats = $optimized->optimizationStats();
echo "原始大小: {$stats->originalSizeFormatted()}\n";
echo "最佳化後: {$stats->optimizedSizeFormatted()}\n";
echo "壓縮率: {$stats->compressionRatioPercent()}%\n";

最佳化設定檔

設定檔 適用場景 預期壓縮率
screen() 螢幕閱讀、電子郵件 60-80%
ebook() 電子書平台 40-60%
balanced() 通用用途(預設) 30-50%
print() 辦公室列印 10-25%
prepress() 商業印刷 0-10%

精細最佳化控制

use NextPDF\Pro\Optimizer\ValueObjects\ImageOptimizationConfig;
use NextPDF\Pro\Optimizer\ValueObjects\FontOptimizationConfig;

$optimized = $optimizer->optimize(
    document: $document,
    profile:  OptimizationProfile::custom(
        images: ImageOptimizationConfig::create()
            ->withJpegQuality(75)
            ->withDownsampleDpi(150)
            ->withConvertToJpeg(grayscale: true),
        fonts:  FontOptimizationConfig::create()
            ->withSubset(true)
            ->withDeduplication(true),
        streams: true,
        metadata: true,
    ),
);

Spectrum 加速引擎(Core)

啟用 Spectrum

use NextPDF\Core\Accelerator\SpectrumClient;
use NextPDF\Core\Accelerator\SpectrumConfig;

$spectrum = SpectrumClient::create(
    config: SpectrumConfig::create()
        ->withBinaryPath('/usr/local/bin/nextpdf-spectrum')
        ->withMaxConnections(4)
        ->withCircuitBreakerThreshold(3),
);

$factory = DocumentFactory::create(
    fontRegistry:  $fontRegistry,
    imageRegistry: $imageRegistry,
    accelerator:   $spectrum,
);

效能基準測試

電路中斷器

$config = SpectrumConfig::create()
    ->withCircuitBreakerThreshold(3)     // 3 次失敗後開啟
    ->withCircuitBreakerTimeout(30_000)  // 30 秒後嘗試恢復
    ->withFallbackEnabled(true);         // 失敗時回退至純 PHP

Worker 模式效能

線性化(Web 最佳化)

use NextPDF\Core\Writer\Linearizer;

$linearized = Linearizer::create()->linearize(document: $document);
$linearized->save('/output/linearized.pdf');

記憶體使用最佳化

生產環境建議

延伸閱讀