Skip to content

성능

TCPDF-Next는 고처리량 문서 생성을 위해 설계되었습니다. 이 페이지에서는 내장 최적화 기능과 라이브러리를 최대한 활용하기 위한 모범 사례를 다룹니다.

지연 서브엔진 초기화

Document 클래스는 20개 이상의 서브엔진(Graphics, Typography, Barcode, Forms, Layers 등)에 대한 참조를 보유하지만, 대부분은 지연 초기화됩니다 -- 처음 접근할 때만 생성됩니다.

간단한 텍스트 전용 PDF는 SVG 파서, 바코드 엔진 또는 폼 필드 관리자를 인스턴스화하지 않습니다. 이는 실제로 사용하는 기능에 비례하여 메모리 사용량을 유지합니다.

글꼴 서브세팅

기본적으로 TCPDF-Next는 문서에서 실제로 사용된 글리프만 임베드합니다. FontSubsetter는 모든 텍스트 콘텐츠를 분석하고 임베딩 전에 TrueType/OpenType 글꼴에서 사용되지 않는 글리프를 제거합니다.

이를 통해 적은 문자 세트를 사용하는 문서의 경우 글꼴 데이터를 수 메가바이트에서 몇 킬로바이트로 줄일 수 있습니다.

php
use Yeeefang\TcpdfNext\Core\Document;

// 글꼴 서브세팅은 기본적으로 켜져 있음 — 활성화할 것이 없음
$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 12)
    ->cell(0, 10, 'Only these glyphs are embedded.');

FlateDecode 압축

모든 콘텐츠 스트림은 zlib(FlateDecode)을 사용하여 압축됩니다. 이는 기본적으로 활성화되어 있으며 ext-zlib PHP 확장이 필요합니다. 압축은 일반적으로 PDF 파일 크기를 60-80% 줄입니다.

스트리밍 출력 (PdfWriterChunked)

매우 큰 문서의 경우, 청크 라이터는 전체 PDF를 메모리에 보유하는 대신 완료된 페이지 데이터를 점진적으로 플러시합니다. 이는 투명합니다 -- 문서 크기에 관계없이 같은 save()output() 메서드가 작동합니다.

php
use Yeeefang\TcpdfNext\Core\Document;

// 대용량 문서의 스트리밍 출력
$pdf = Document::create();
$pdf->addPage()->setFont('Helvetica', '', 10);

for ($i = 0; $i < 5000; $i++) {
    $pdf->cell(0, 5, "Row {$i}: data content here", newLine: true);
}

$pdf->save('large-document.pdf');
// 글꼴 서브세팅과 FlateDecode 압축은 자동으로 수행됨

교차 참조 스트림

TCPDF-Next는 전통적인 xref 테이블 대신 교차 참조 스트림(PDF 1.5+)을 사용합니다. 교차 참조 스트림은 자체적으로 압축되어 파일 크기가 작아집니다 -- 특히 객체가 많은 문서에서 효과적입니다.

선형화 (빠른 웹 보기)

선형화는 전체 파일이 다운로드되기 전에 첫 번째 페이지를 표시할 수 있도록 PDF 객체를 재정렬합니다. HTTP를 통해 제공되는 모든 PDF에 대해 활성화하십시오:

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->setLinearization(true)
    ->addPage()
    ->cell(0, 10, 'Progressive rendering in the browser')
    ->save('web-optimized.pdf');

Linearizer는 뷰어에게 필요에 따라 페이지를 가져오는 방법을 알려주는 힌트 스트림을 삽입합니다.

페이지 제한

Document::MAX_PAGES 상수는 기본적으로 10,000 페이지입니다. 이는 생성 중 무한 루프에 대한 안전 장치입니다. 사용 사례에 더 많은 페이지가 필요한 경우 클래스를 확장하여 재정의할 수 있습니다.

모범 사례

페이지 간 글꼴 인스턴스 재사용

글꼴을 한 번 설정하고 페이지 간에 유지되도록 합니다. 글꼴이 실제로 변경되지 않는 한 모든 페이지에서 setFont()를 호출하지 마십시오:

php
$pdf = Document::create()
    ->setFont('Helvetica', '', 10);

for ($i = 0; $i < 100; $i++) {
    $pdf->addPage()
        ->cell(0, 5, "Page {$i} content");
}

반복 콘텐츠에 템플릿 (XObjects) 사용

모든 페이지에 같은 헤더, 푸터 또는 워터마크가 있는 경우, 한 번 템플릿으로 생성하고 각 페이지에 스탬프합니다. 이는 콘텐츠를 여러 번 참조되는 단일 PDF 객체로 저장하여 중복하지 않습니다.

압축 활성화

압축은 기본적으로 켜져 있습니다. 디버깅을 위해 원시 PDF 스트림을 검사해야 하는 경우가 아니면 비활성화하지 마십시오.

대용량 문서에 스트리밍 출력 사용

수백 페이지를 초과하는 문서의 경우, 스트리밍 출력은 페이지 수에 관계없이 메모리 사용량을 일정하게 유지합니다.

글꼴 서브세팅

글꼴 서브세팅은 기본적으로 켜져 있습니다. 프로덕션에서 비활성화하지 마십시오 -- 전체 글꼴 임베딩은 파일 크기에 메가바이트를 추가할 수 있습니다.

트랜잭션 범위 최소화

트랜잭션은 전체 문서 스냅샷을 저장합니다. 메모리 사용량이 두 배가 되지 않도록 짧게 유지하십시오. 자세한 내용은 트랜잭션을 참조하십시오.

요약

기능기본값영향
글꼴 서브세팅켜짐더 작은 글꼴 (KB vs MB)
FlateDecode 압축켜짐60-80% 더 작은 스트림
교차 참조 스트림켜짐더 작은 xref 데이터
지연 초기화켜짐사용된 기능에 비례하는 메모리
스트리밍 출력자동대용량 문서에 일정한 메모리
선형화꺼짐웹 전달 PDF에 활성화

LGPL-3.0-or-later 라이선스로 배포됩니다.