FPDF에서 NextPDF로 마이그레이션
한눈에 보기
섹션 제목: “한눈에 보기”이 가이드는 FPDF 기반 코드베이스를 NextPDF 코어로 이전하는 것을 돕습니다. FPDF는 가장 널리 배포된 레거시 PHP 포터블 문서 형식(PDF) 라이브러리 중 하나이며, 그 드로잉 표면 — 수동 x/y 커서로 구동되는 AddPage, SetFont, Cell, MultiCell, Write, Text, Image, Output — 은 NextPDF 자체의 셀/텍스트 API에 깔끔하게 매핑됩니다. 이는 NextPDF의 저수준 드로잉 메서드가 동일한 FPDF/TCPDF 계보를 따르기 때문입니다. 다만 NextPDF는 FPDF의 드롭인 클론이 아닙니다. 그것은 엄격한 타입, 글꼴 서브셋팅, 서명, PDF/A, 접근성(태그된 PDF)을 갖춘 현대적인 PDF 2.0 엔진입니다. 두 가지 실질적인 전환은 단위 모델(NextPDF는 PDF 포인트로 동작하고, FPDF는 밀리미터를 기본으로 합니다)과 출력 동사(FPDF의 'I'/'D'/'F'/'S' 문자 대신 타입이 지정된 OutputDestination 열거형)입니다.
코어에는 FPDF 클래스 심이 없습니다. 동사 매핑을 사용하여 각 호출 지점을 다시 작성하십시오. TCPDF 6.x 코드베이스에 대한 가장 작은 초기 변경을 원한다면, 대신 TCPDF 호환성 어댑터를 참조하십시오. 이는 거의 소스 호환되는 드롭인 경로를 제공합니다. FPDF에는 그러한 어댑터가 없습니다.
composer require nextpdf/core:^3마이그레이션하는 동안에는 setasign/fpdf(또는 사용 중인 fpdf/fpdf)를 설치된 상태로 유지하십시오. 최종 전환 후 제거하십시오(안전한 마이그레이션 순서 참조).
개념 개요
섹션 제목: “개념 개요”FPDF와 NextPDF는 동일한 멘탈 모델을 공유합니다. 페이지들로 이루어진 문서, 커서(현재 x/y 위치), 그리고 그 커서에서 그리거나 그것을 전진시키는 동사들입니다. SetXY, Cell, Ln, MultiCell은 두 라이브러리 모두에서 커서를 읽고 변경하므로, 대부분의 절차적 FPDF 코드는 한 줄씩 그대로 변환됩니다.
차이는 우연이 아니라 의도적입니다.
- 단위. FPDF의 생성자(
new FPDF($orientation, $unit, $size))는 밀리미터를 기본으로 합니다. NextPDF는 PDF 포인트로 동작합니다(1 pt = 1/72 in, ISO 32000-2 §7). 문서 전체에 적용되는 단위 노브는 없습니다 — mm를 포인트로 한 번에 변환하십시오(pt = mm * 72 / 25.4). - Y 방향은 사용자에게 동일하게 유지됩니다. FPDF와 마찬가지로, NextPDF의 사용자 좌표는
y = 0을 페이지 상단에 두고 아래로 갈수록 증가하므로, 커서 산술이 그대로 이식됩니다. NextPDF는 내부적으로 PDF 네이티브의 좌하단 원점으로 변환합니다. - 생성은 명시적입니다. FPDF는 orientation, 단위, 크기를 생성자에 접어 넣습니다. NextPDF는 불변
NextPDF\Core\Config값 객체(페이지 크기, 여백, 글꼴 디렉터리)와 명시적인addPage()를 받습니다. - 항상 유니코드, 항상 서브셋. FPDF의 코어 빌드는 Latin-1이며 유니코드를 위해 tFPDF/UTF-8 변형이 필요합니다. NextPDF는 전체가 UTF-8이며 항상 글꼴을 서브셋 프로그램으로 임베드합니다(ISO 32000-2 §9). FPDF의
AddFont/글꼴 메트릭 파일에는 대응물이 없습니다. TrueType/OpenType 글꼴 디렉터리를 등록하고 이름으로 패밀리를 선택하십시오.
API 표면
섹션 제목: “API 표면”아래에서 사용하는 코어 진입점은 Document::createStandalone(), Document::addPage(), Document::setFont(), Document::cell(), Document::multiCell(), Document::text(), Document::write(), Document::ln(), Document::image(), 커서 접근자(setXY/setX/setY/getX/getY), Document::output(?string, OutputDestination), Document::save(string $path): void, Document::getPdfData(): string, 그리고 NextPDF\Core\Config 값 객체입니다. 이 코어 드로잉, 텍스트, 출력 메서드에 대한 전체 레퍼런스는 코어 모듈과 레퍼런스 색인에 있으며, PHPDoc에서 자동 생성됩니다. Html 모듈은 HTML-to-PDF에 관한 관련 읽을거리이며, 이 페이지의 동사에 대한 레퍼런스는 아닙니다.
API 동사 매핑
섹션 제목: “API 동사 매핑”FPDF의 공개 메서드 이름은 오랜 시간 사용되어 잘 알려져 있습니다. 아래 NextPDF 열은 코어 소스 시그니처를 기준으로 확인되었습니다(근거 / 추적성 참조).
| FPDF | NextPDF | 비고 |
|---|---|---|
new FPDF($orient, $unit, $size) | Document::createStandalone($config) | Orientation/단위/크기 생성자 인수는 NextPDF\Core\Config(pageSize, margins, fontsDirectory)가 됩니다. $unit는 없습니다 — 포인트로 동작하십시오. 기본 createStandalone() 페이지는 A4 세로입니다. |
$pdf->AddPage($orient, $size) | $doc->addPage($size, $orientation) | 직접 매핑됩니다. $size는 PageSize 값 객체이고, $orientation은 Orientation 열거형(Portrait/Landscape)입니다. |
$pdf->SetFont($family, $style, $size) | $doc->setFont($family, $style, $size) | 직접 매핑됩니다. $style는 동일한 ''/'B'/'I'/'BI'(및 밑줄 'U') 코드를 사용합니다. |
$pdf->Cell($w, $h, $txt, $border, $ln, $align, $fill) | $doc->cell($w, $h, $txt, $border, $newLine, $align, $fill) | 직접 매핑됩니다. $align은 Alignment 열거형(Left/Center/Right/Justify)이고, $border는 bool 또는 'LTRB' 문자열을 받으며, $ln은 bool $newLine이 됩니다. |
$pdf->MultiCell($w, $h, $txt, $border, $align, $fill) | $doc->multiCell($w, $h, $txt, $border, $align) | 실제 글꼴 메트릭으로 단어 줄바꿈합니다. $fill 인수는 없습니다. 배경이 필요하면 먼저 채워진 rect()를 그리십시오. |
$pdf->Write($h, $txt, $link) | $doc->write($h, $txt, $link) | 커서에서 흐르는 텍스트. $link는 URL 링크 주석을 첨부합니다. |
$pdf->Text($x, $y, $txt) | $doc->text($x, $y, $txt) | 절대 위치 텍스트. 직접 매핑됩니다. |
$pdf->Ln($h) | $doc->ln($h) | 왼쪽 여백으로의 줄바꿈. 0 = 기본 줄 높이. |
$pdf->Image($file, $x, $y, $w, $h) | $doc->image($file, $x, $y, $w, $h) | 직접 매핑됩니다. $x/$y/$w/$h는 nullable입니다(null = 현재 커서 / 본질적 크기). |
$pdf->SetXY($x, $y) / SetX / SetY | $doc->setXY($x, $y) / setX / setY | 직접 매핑됩니다. getX()/getY()는 커서를 읽습니다. |
$pdf->SetMargins($l, $t, $r) | $doc->setMargins(new Margin($t, $r, $bottom, $l)) | 하나의 Margin 값 객체이며, 생성자 순서는 (top, right, bottom, left)입니다 — FPDF의 (left, top, right)가 아닙니다. FPDF SetMargins에는 하단 인수가 없으므로(하단 여백은 SetAutoPageBreak($auto, $margin)에서 옴), $bottom을 직접 선택하십시오 — 흔히 상단 여백과 같게 하거나, 자동 페이지 나눔 여백을 전달합니다. |
$pdf->SetAutoPageBreak($auto, $margin) | $doc->setAutoPageBreak($auto, $margin) | 직접 매핑됩니다. |
$pdf->SetDrawColor / SetFillColor / SetTextColor | $doc->setDrawColor / setFillColor / setTextColor | RGB (r, g, b), 또는 그레이스케일을 위한 단일 값. |
$pdf->Line / Rect / SetLineWidth | $doc->line / rect / setLineWidth | 직접 매핑됩니다. rect()는 스타일 문자열('S'/'F'/'DF')을 받습니다. |
$pdf->SetTitle/SetAuthor/SetSubject/SetKeywords/SetCreator | $doc->setTitle/setAuthor/setSubject/setKeywords/setCreator | 직접 매핑됩니다. ISO 32000-2 §14 정보 딕셔너리 / Extensible Metadata Platform(XMP)에 저장됩니다. |
$pdf->Output($dest, $name) | $doc->output($name, OutputDestination::…) | FPDF 대상 문자(I/D/F/S)는 OutputDestination 열거형에 매핑됩니다. 인수 순서가 바뀌는 점에 유의하십시오(NextPDF에서는 이름이 먼저). |
$pdf->Output('S') | $doc->getPdfData() | PDF 바이트를 반환합니다. |
$pdf->Output('F', $path) | $doc->save($path) | 파일 경로에 씁니다. |
$pdf->GetStringWidth($s) | (공개 메서드 없음) | 문자열 너비는 cell()/multiCell() 줄바꿈 중에 내부적으로 계산되며, 문자열별 측정을 위한 공개 동사는 없습니다. 손으로 측정하는 대신 multiCell()을 통해 줄바꿈을 구동하십시오. |
코드 샘플 — 빠른 시작
섹션 제목: “코드 샘플 — 빠른 시작”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\Alignment;use NextPDF\Core\Document;
// FPDF:// $pdf = new FPDF(); // mm, A4 portrait// $pdf->AddPage();// $pdf->SetFont('Arial', 'B', 16);// $pdf->Cell(40, 10, 'Invoice');// $pdf->Output('F', 'out.pdf');
// NextPDF — points, default page is A4 portrait:$doc = Document::createStandalone();$doc->setTitle('Invoice');$doc->addPage();$doc->setFont('Helvetica', 'B', 16.0);$doc->cell(113.4, 28.3, 'Invoice', false, true, Alignment::Left); // ~40mm x ~10mm in points$doc->save(__DIR__ . '/out.pdf');
echo "Wrote out.pdf\n";코드 샘플 — 프로덕션
섹션 제목: “코드 샘플 — 프로덕션”이 예제는 examples/04-text-and-fonts.php와 일치합니다. 명시적인 페이지 크기, 여백, 등록된 글꼴 디렉터리, 그리고 FPDF 코드베이스가 이미 사용하는 커서 구동 셀 모델을 사용합니다.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\Alignment;use NextPDF\Contracts\OutputDestination;use NextPDF\Core\Config;use NextPDF\Core\Document;use NextPDF\ValueObjects\Margin;use NextPDF\ValueObjects\PageSize;
// Equivalent of: new FPDF('P', 'mm', 'A4') + SetMargins(20, 16, 20)// i.e. FPDF left=20mm, top=16mm, right=20mm. FPDF SetMargins has no bottom// argument, so we pick bottom = top = 16mm. Convert each mm to points// (pt = mm * 72 / 25.4): 16mm = 45.354pt, 20mm = 56.693pt.// Margin constructor order is (top, right, bottom, left) — NOT FPDF's (L, T, R).$config = new Config( pageSize: new PageSize(595.276, 841.890, 'A4'), margins: new Margin(45.354, 56.693, 45.354, 56.693), // top,right,bottom,left in points fontsDirectory: __DIR__ . '/fonts',);
$doc = Document::createStandalone($config);$doc->setTitle('Quarterly Report');$doc->setAuthor('Finance');$doc->addPage();
// SetFont + Cell, the FPDF way — but in points and with a real Unicode font.$doc->setFont('DejaVuSans', 'B', 18.0);$doc->setTextColor(30, 58, 138);$doc->cell(0, 24.0, 'Quarterly Report', false, true, Alignment::Left);
$doc->setFont('DejaVuSans', '', 11.0);$doc->setTextColor(0, 0, 0);$doc->multiCell(0, 16.0, "Body text wraps on real font metrics. Unicode is " . "native, so accented and non-Latin characters need no tFPDF variant — " . "register the family in the fonts directory and select it by name.");
// Equivalent of $pdf->Output('D', 'report.pdf'):$doc->output('report.pdf', OutputDestination::Download);엣지 케이스 및 주의 사항
섹션 제목: “엣지 케이스 및 주의 사항”- 단위. FPDF에서 복사하는 모든 수치 좌표, 너비, 높이, 여백은 기본적으로 밀리미터입니다. 포트 중에
72 / 25.4를 한 번 곱하여 포인트로 변환하십시오. 둘을 섞으면 조용히 모든 크기가 잘못 지정됩니다. Output()인수 순서. FPDF는Output($dest, $name)이고, NextPDF는output($name, $dest)입니다. 대상은 문자가 아니라OutputDestination열거형입니다. 파일 / 문자열 출력에는save()/getPdfData()를 선호하십시오.SetMargins순서. FPDF는(left, top, right)이고, NextPDFMargin값 객체는(top, right, bottom, left)입니다. 그대로 옮기지 말고 재정렬하십시오.- 글꼴. FPDF의
AddFont()+.php메트릭 파일에는 대응물이 없습니다. TrueType/OpenType 파일을 글꼴 디렉터리에 넣고 패밀리 이름으로setFont()를 호출하십시오. 코어 Base14 이름(Helvetica,Times,Courier)은 파일 없이 해석됩니다. PDF/A나 태그된 PDF 아래에서는 임베드 가능한 글꼴로 자동 치환됩니다. GetStringWidth. 공개 문자열 측정 메서드는 없습니다. FPDF 코드가 열을 손으로 배치하기 위해 문자열을 측정한다면, 그 블록을multiCell()(메트릭으로 줄바꿈) 또는 고정 너비cell()호출로 전환하십시오.
NextPDF는 단일 스트리밍 패스로 콘텐츠를 내보냅니다(아키텍처 결정 기록 ADR-001). 최대 메모리는 유지된 객체 트리가 아니라 문서 크기를 따릅니다. 이 가이드 예제의 예산은 wall_ms: 2000, peak_mb: 128입니다. 긴 문서의 경우, FPDF 보고서가 이미 사용하는 것과 같은 루프 형태로 addPage() 호출 전반에 콘텐츠를 구동하십시오.
보안 참고 사항
섹션 제목: “보안 참고 사항”- 메타데이터.
SetTitle()/SetAuthor()는 ISO 32000-2 §14 정보 딕셔너리 / XMP에 쓰는 타입이 지정된 세터에 매핑됩니다. 절대 그곳에 비밀을 저장하지 마십시오. - 이미지 경로.
image()는 읽기 전에 스트림 래퍼 스킴과 임베드된 NUL 바이트를 거부합니다. 애플리케이션이 제어하는 경로를 전달하십시오. - 문서 내 코드 없음. NextPDF는 문서 내 스크립트를 실행하지 않습니다. FPDF의 어떤 것도 이를 바꾸지 않습니다.
적합성
섹션 제목: “적합성”| 진술 | 사양 | 조항 |
|---|---|---|
| 페이지 format/orientation은 페이지 경계 박스에 매핑됩니다. | ISO 32000-2 | §7 |
| 글꼴은 embedded/subset 글꼴 프로그램으로 작성됩니다. | ISO 32000-2 | §9 |
| 제목 / 메타데이터는 정보 딕셔너리 / XMP에 저장됩니다. | ISO 32000-2 | §14 |
| 선, 사각형, 이미지는 콘텐츠 스트림 페인팅입니다. | ISO 32000-2 | §8 |
NextPDF는 ISO 32000-2 콘텐츠를 생성하며, FPDF와의 시각적 동일성을 주장하지 않습니다. 렌더러를 변경할 때마다 출력을 다시 검토하십시오.
상업적 맥락
섹션 제목: “상업적 맥락”해당 없음. NextPDF 코어는 여기서 설명하는 FPDF 마이그레이션 경로를 다룹니다.
참고 항목
섹션 제목: “참고 항목”마이그레이션 세부 사항(R6 필수 섹션)
섹션 제목: “마이그레이션 세부 사항(R6 필수 섹션)”대상 독자
섹션 제목: “대상 독자”서버 측 절차적 PDF 생성에 FPDF(또는 tFPDF)를 운영하는 팀. 코드가 SetXY와 Ln으로 구동되는 AddPage / SetFont / Cell / MultiCell / Image / Output 호출의 시퀀스라면, 동사 매핑이 전체 표면을 다룹니다.
범위 내: FPDF 드로잉 동사, 커서 모델, 글꼴, 색상, 선과 사각형, 메타데이터, 출력. 범위 외: FPDF의 AddFont 메트릭 파일 도구와 서드파티 FPDF 스크립트 확장(바코드, 회전, 북마크) — 이는 해당 NextPDF 모듈(Barcode, Transforms, Navigation)에 매핑되며, 여기서는 다루지 않습니다.
호환성 맵
섹션 제목: “호환성 맵”동작 호환성이며 드롭인 심이 아닙니다: 코어는 FPDF 클래스 심을 제공하지 않습니다. 모든 호출 지점을 다시 작성하십시오. NextPDF의 셀/텍스트 API가 FPDF/TCPDF 계보를 공유하므로 동사는 밀접하게 정렬되지만, 단위 모델, Output 인수 순서, Margin/열거형 타입이 다릅니다 — 따라서 그대로 옮기는 것은 틀리고, 번역하는 것이 옳습니다.
단위 및 구성 맵
섹션 제목: “단위 및 구성 맵”| FPDF 구성 요소 | NextPDF | 비고 |
|---|---|---|
$unit('mm' 기본) | (대응물 없음) | PDF 포인트로 동작하십시오. 포트 중에 pt = mm * 72 / 25.4로 치수를 한 번 변환하십시오. |
$orientation('P'/'L') | addPage()의 Orientation 열거형, 또는 PageSize 너비/높이 교환 | 가로 = 너비 > 높이. |
$size('A4', [w,h]) | Config->pageSize(PageSize 값 객체) | 명명된 형식은 명시적 포인트 치수가 됩니다. PageSize::A4()…A0() 및 Letter/Legal 팩토리가 존재합니다. |
SetMargins($l, $t, $r) | Config->margins(Margin VO) | 생성자 순서 (top, right, bottom, left). |
AddFont($family, $style, $file) | 글꼴 디렉터리 + 이름으로 setFont() | 메트릭 파일을 버리고 TTF/OTF를 Config->fontsDirectory에 두십시오. |
글꼴 처리 차이
섹션 제목: “글꼴 처리 차이”- 글꼴 디렉터리. FPDF의 글꼴별
AddFont등록은 글꼴 디렉터리와setFont()패밀리 매칭으로 축약됩니다.Config->fontsDirectory(기본 검색 경로)로 시작하고, 글꼴이 여러 곳에 있을 때는FontRegistry::addFontDirectory()나Document::addFontDirectory()로 추가 디렉터리를 등록하십시오. - 항상 유니코드. Latin-1 기본값도 없고 별도의 tFPDF 빌드도 없습니다. UTF-8 입력이 표준입니다.
- 항상 서브셋. NextPDF는 임베드된 글꼴을 항상 서브셋합니다(ISO 32000-2 §9). FPDF의 글꼴 임베딩 선택에는 대응물이 없으며 필요하지 않습니다.
- 글리프 재기준화. 글꼴 매칭과 폴백은 엔진별로 다릅니다. FPDF 글꼴 별칭에는 정확한 패밀리 이름이 필요할 수 있습니다. 치환 차이는 결함이 아니라 예상되는 것입니다.
동작 차이
섹션 제목: “동작 차이”- 단위 변환(mm → pt) — 가장 흔한 포팅 실수입니다. 위를 참조하십시오.
Output인수 순서가 바뀌고 대상이 열거형이 됩니다.Margin/Alignment/Orientation은 타입이 지정된 객체/열거형이며, 문자나 위치 기반(l, t, r)삼중쌍이 아닙니다.- 공개
GetStringWidth없음 —multiCell()을 통해 줄바꿈을 구동하십시오. - 독립적인 래스터화 — 밀집한 콘텐츠에서 줄바꿈과 페이지 나눔이 달라질 수 있습니다. 시각적 차이를 재기준화하십시오.
이는 어느 엔진의 결함도 아닌, 문서화된 동작 차이입니다.
지원되지 않음 / 직접 대응물 없음
섹션 제목: “지원되지 않음 / 직접 대응물 없음”- FPDF
$unit선택자 — 모델링되지 않습니다(항상 포인트). AddFont()+.php/.z메트릭 파일 — 글꼴 디렉터리로 대체됩니다.GetStringWidth()— 공개 문자열 측정 동사가 없습니다.- FPDF의
'I'/'D'/'F'/'S'대상 문자 —OutputDestination열거형 +save()/getPdfData()로 대체됩니다.
이에 의존하는 코드는 그대로 “마이그레이션”되지 않습니다. 위의 행으로 다시 표현하십시오.
안전한 마이그레이션 순서
섹션 제목: “안전한 마이그레이션 순서”- FPDF와 함께
nextpdf/core를 추가하십시오. 일단 FPDF는 설치된 상태로 유지하십시오. - 위험이 낮은 문서 하나를 고르십시오. 단위 맵을 통해 생성자를 변환한 다음, 동사 맵으로 각 동사를 포팅하십시오. 모든 mm 좌표를 포인트로 변환하십시오.
- 문서의 글꼴을
Config->fontsDirectory에 두고 패밀리 이름으로 선택하십시오.AddFont호출을 버리십시오. - 동일한 입력에 대해 두 PDF를 모두 생성하고 시각적으로 비교하십시오. 차이(글꼴 치환, 줄바꿈)는 독립적인 엔진에서 예상되는 것입니다 — 문서별로 수용하십시오.
GetStringWidth기반 손 레이아웃을multiCell()이나 고정 너비cell()호출로 교체하십시오.- 위험이 낮은 것부터 문서별로 반복하십시오. 마지막 전환까지 FPDF를 설치된 상태로 유지하십시오.
- 최종 전환 후
composer.json에서 FPDF를 제거하십시오.
마이그레이션 테스트
섹션 제목: “마이그레이션 테스트”- 코드를 변경하기 전에 대표 문서에 대해 FPDF 출력을 스냅샷하십시오(골든 입력. 바이트는 달라집니다).
- 마이그레이션된 각 문서에 대해, 자신의 검사로 수용을 단언하십시오(시각적 비교 + 텍스트 추출). NextPDF의 셀/글꼴 동작은
examples/04-text-and-fonts.php와 코어tests/Font 및 텍스트 출력 스위트에서 검증됩니다. 마이그레이션 수용은 문서별이며 여전히 사용자의 책임입니다. - 마이그레이션된 문서마다 회귀 테스트를 추가하십시오.
Evidence / traceability
섹션 제목: “Evidence / traceability”이 페이지의 모든 NextPDF 동작 진술은 저장소 내 소스 시그니처, 예제, 또는 아키텍처 결정 기록(ADR)으로 뒷받침되며, PDF 형식 속성의 경우에는 프런트매터 citations:와 적합성 표의 ISO 32000-2 조항으로 뒷받침됩니다. FPDF 동작은 오직 “독립적인 엔진 — 문서화된 차이를 예상하십시오”로만 단언됩니다. 이 페이지는 저장소 내 산출물이 증명하지 않는 동등성을 주장하지 않습니다.
| NextPDF 동작 주장 | 저장소 내 근거(경로) |
|---|---|
AddPage는 addPage(?PageSize, Orientation): static에 매핑됩니다. | src/Core/Concerns/HasPages.php(addPage()). |
SetFont($family, $style, $size)는 setFont(string, string, float): static에 매핑됩니다. ''/'B'/'I'/'BI'/'U' 스타일. | src/Core/Concerns/HasTypography.php(setFont()). |
Cell은 cell($w, $h, $txt, $border, $newLine, $align, $fill): static에 매핑됩니다. | src/Core/Concerns/HasTextOutput.php(cell()). |
MultiCell은 multiCell($w, $h, $txt, $border, $align): static(메트릭 기반 줄바꿈)에 매핑됩니다. | src/Core/Concerns/HasTextOutput.php(multiCell(), wrapText()). |
Write/Text/Ln은 write()/text()/ln()에 매핑됩니다. | src/Core/Concerns/HasTextOutput.php(write(), text(), ln()). |
SetXY/SetX/SetY/GetX/GetY는 직접 매핑됩니다. SetMargins는 Margin VO를 받습니다. | src/Core/Concerns/HasPages.php(setXY(), getX(), setMargins()); src/ValueObjects/Margin.php((top, right, bottom, left)). |
Image는 image($file, ?$x, ?$y, ?$w, ?$h): static에 매핑됩니다. 스킴/NUL 경로를 거부합니다. | src/Core/Concerns/HasImages.php(image(), assertImageFilePath()). |
Line/Rect/SetLineWidth/SetDrawColor/SetFillColor/SetTextColor는 직접 매핑됩니다. | src/Core/Concerns/HasDrawing.php(line(), rect(), setLineWidth()); src/Core/Concerns/HasColors.php(setDrawColor(), setFillColor(), setTextColor()). |
createStandalone() 기본 페이지는 A4 세로(595.276 × 841.890 pt)입니다. | src/Core/Document.php(createStandalone()); src/ValueObjects/PageSize.php(A4()). |
출력 대상은 OutputDestination 열거형(Inline/Download/File/String)입니다. Output('S') → getPdfData(), Output('F', $p) → save($p). | src/Contracts/OutputDestination.php; src/Core/Concerns/HasOutput.php(output()). |
SetTitle/SetAuthor/…는 타입이 지정된 메타데이터 세터에 매핑됩니다. 정보 딕셔너리 / XMP에 저장됩니다. | src/Core/Concerns/HasMetadata.php(setTitle(), setAuthor()); ISO 32000-2 §14(프런트매터 citations:). |
| 글꼴은 항상 서브셋 프로그램으로 임베드됩니다. | src/Core/Concerns/HasTypography.php(buildFontData()); ISO 32000-2 §9(프런트매터 citations:). |
| 콘텐츠는 단일 패스로 내보내집니다. | docs/architecture/adr/ADR-001-stream-based-rendering-pipeline.md. |
두 패키지 모두 최종 전환까지 설치된 상태로 유지되므로, 호출 지점별 롤백은 그 호출 지점을 FPDF 경로로 되돌리는 것을 의미합니다. 최종 전환 후, 롤백은 버전 관리에서 FPDF와 이전 코드를 복원하는 것을 의미합니다. 데이터 마이그레이션은 관여하지 않습니다.
성능 고려 사항
섹션 제목: “성능 고려 사항”성능을 참조하십시오. 단일 패스 모델은 유지된 버퍼 비용을 제거합니다. 새로운 문서별 비용은 즉시 글꼴 해석(3단계)이며, 이는 글꼴 디렉터리를 통해 캐시 가능합니다.
흔한 함정
섹션 제목: “흔한 함정”- 밀리미터 좌표를
* 72 / 25.4변환 없이 포인트로 그대로 옮기기. Output()을 FPDF의($dest, $name)순서로 두거나,OutputDestination열거형 대신 문자를 전달하기.SetMargins($l, $t, $r)를Margin(순서가top, right, bottom, left)에 그대로 옮기기.AddFont메트릭 파일이 포팅될 것으로 기대하기. 대신 TTF/OTF를 글꼴 디렉터리에 두십시오.GetStringWidth대응물을 찾기. 줄바꿈에는multiCell()을 사용하십시오.- 바이트/픽셀 단위로 동일한 출력을 기대하기(독립적인 엔진 — 이 가이드는 드롭인이나 100% 호환성을 결코 주장하지 않습니다).