Migracja z FPDF do NextPDF
W skrócie
Dział zatytułowany „W skrócie”Ten przewodnik pomaga przenieść bazę kodu opartą na
FPDF do rdzenia NextPDF. FPDF to jedna z
najszerzej wdrożonych przestarzałych bibliotek PHP do formatu Portable Document
Format (PDF), a jej powierzchnia rysowania — AddPage, SetFont, Cell,
MultiCell, Write, Text, Image, Output sterowane ręcznym kursorem x/y —
czysto odwzorowuje się na własne API cell/text NextPDF, ponieważ niskopoziomowe
metody rysowania NextPDF wywodzą się z tej samej linii FPDF/TCPDF. NextPDF nie
jest jednak klonem FPDF typu drop-in: to nowoczesny silnik PDF 2.0 ze ścisłymi
typami, podzbiorowaniem czcionek, podpisywaniem, PDF/A oraz dostępnością
(tagged PDF). Dwoma rzeczywistymi zmianami są model jednostek (NextPDF działa w
punktach PDF; FPDF domyślnie używa milimetrów) oraz czasowniki wyjściowe
(typowany enum OutputDestination zamiast znaków 'I'/'D'/'F'/'S' FPDF).
W rdzeniu nie ma żadnej nakładki klasy FPDF. Przepisz każde miejsce wywołania,
korzystając z odwzorowania czasowników. Jeśli chcesz
najmniejszej początkowej zmiany dla bazy kodu TCPDF 6.x, zobacz zamiast tego
adapter kompatybilności TCPDF, który
dostarcza niemal źródłowo zgodną ścieżkę drop-in; FPDF nie ma takiego adaptera.
Instalacja
Dział zatytułowany „Instalacja”composer require nextpdf/core:^3Pozostaw zainstalowany setasign/fpdf (lub twój fpdf/fpdf) podczas migracji.
Usuń go po ostatecznym przełączeniu (zobacz bezpieczną sekwencję migracji).
Przegląd koncepcyjny
Dział zatytułowany „Przegląd koncepcyjny”FPDF i NextPDF dzielą ten sam model myślowy: dokument złożony ze stron, kursor
(bieżąca pozycja x/y) oraz czasowniki, które rysują w pozycji kursora lub go
przesuwają. SetXY, Cell, Ln i MultiCell w obu bibliotekach odczytują i
mutują kursor, więc większość proceduralnego kodu FPDF tłumaczy się wiersz po
wierszu.
Różnice są celowe, nie przypadkowe:
- Jednostki. Konstruktor FPDF (
new FPDF($orientation, $unit, $size)) domyślnie używa milimetrów. NextPDF działa w punktach PDF (1 pt = 1/72 cala, ISO 32000-2 §7). Nie ma ogólnodokumentowej gałki jednostek — przelicz mm na punkty raz (pt = mm * 72 / 25.4). - Kierunek Y pozostaje dla ciebie taki sam. Podobnie jak FPDF, współrzędne
użytkownika NextPDF umieszczają
y = 0na górze strony i zwiększają się w dół, więc arytmetyka kursora przenosi się bezpośrednio. NextPDF konwertuje wewnętrznie na natywne dla PDF źródło w lewym dolnym rogu. - Konstrukcja jest jawna. FPDF składa orientację, jednostkę i rozmiar w
konstruktor; NextPDF przyjmuje niezmienny obiekt wartości
NextPDF\Core\Config(rozmiar strony, marginesy, katalog czcionek) oraz jawneaddPage(). - Zawsze Unicode, zawsze podzbiór. Rdzeniowy build FPDF jest Latin-1 i
potrzebuje wariantu tFPDF/UTF-8 dla Unicode. NextPDF jest UTF-8 na wskroś i
zawsze osadza czcionki jako programy podzbiorowe (ISO 32000-2 §9). Pliki
AddFont/metryk czcionek FPDF nie mają odpowiednika; zarejestruj katalog czcionek TrueType/OpenType i wybierz rodzinę po nazwie.
Powierzchnia API
Dział zatytułowany „Powierzchnia API”Główne punkty wejścia używane poniżej to Document::createStandalone(),
Document::addPage(), Document::setFont(), Document::cell(),
Document::multiCell(), Document::text(), Document::write(),
Document::ln(), Document::image(), akcesory kursora (setXY/setX/
setY/getX/getY), Document::output(?string, OutputDestination),
Document::save(string $path): void, Document::getPdfData(): string oraz obiekt
wartości NextPDF\Core\Config. Pełna referencja tych rdzeniowych metod rysowania,
tekstu i wyjścia znajduje się w modułach rdzeniowych
oraz w indeksie referencji, automatycznie generowanym z PHPDoc.
Moduł Html to powiązana lektura dla konwersji HTML na
PDF, a nie referencja czasowników na tej stronie.
Odwzorowanie czasowników API
Dział zatytułowany „Odwzorowanie czasowników API”Publiczne nazwy metod FPDF są długo ustalone i dobrze znane. Kolumna NextPDF poniżej jest potwierdzona względem sygnatur źródeł rdzenia (zobacz Dowody / identyfikowalność).
| FPDF | NextPDF | Uwagi |
|---|---|---|
new FPDF($orient, $unit, $size) | Document::createStandalone($config) | Argumenty konstruktora orientacja/jednostka/rozmiar stają się NextPDF\Core\Config (pageSize, margins, fontsDirectory). Brak $unit — pracuj w punktach. Domyślna strona createStandalone() to A4 pionowo. |
$pdf->AddPage($orient, $size) | $doc->addPage($size, $orientation) | Bezpośrednie odwzorowanie. $size to obiekt wartości PageSize; $orientation to enum Orientation (Portrait/Landscape). |
$pdf->SetFont($family, $style, $size) | $doc->setFont($family, $style, $size) | Bezpośrednie odwzorowanie. $style używa tych samych kodów ''/'B'/'I'/'BI' (plus 'U' podkreślenie). |
$pdf->Cell($w, $h, $txt, $border, $ln, $align, $fill) | $doc->cell($w, $h, $txt, $border, $newLine, $align, $fill) | Bezpośrednie odwzorowanie. $align to enum Alignment (Left/Center/Right/Justify); $border przyjmuje bool lub łańcuch 'LTRB'; $ln staje się bool $newLine. |
$pdf->MultiCell($w, $h, $txt, $border, $align, $fill) | $doc->multiCell($w, $h, $txt, $border, $align) | Zawija słowa na rzeczywistych metrykach czcionki. Brak argumentu $fill; namaluj najpierw wypełniony rect(), jeśli potrzebujesz tła. |
$pdf->Write($h, $txt, $link) | $doc->write($h, $txt, $link) | Płynący tekst od kursora; $link dołącza adnotację łącza URL. |
$pdf->Text($x, $y, $txt) | $doc->text($x, $y, $txt) | Tekst w pozycji bezwzględnej. Bezpośrednie odwzorowanie. |
$pdf->Ln($h) | $doc->ln($h) | Złamanie wiersza do lewego marginesu; 0 = domyślna wysokość wiersza. |
$pdf->Image($file, $x, $y, $w, $h) | $doc->image($file, $x, $y, $w, $h) | Bezpośrednie odwzorowanie; $x/$y/$w/$h są nullowalne (null = bieżący kursor / rozmiar wewnętrzny). |
$pdf->SetXY($x, $y) / SetX / SetY | $doc->setXY($x, $y) / setX / setY | Bezpośrednie odwzorowanie. getX()/getY() odczytują kursor. |
$pdf->SetMargins($l, $t, $r) | $doc->setMargins(new Margin($t, $r, $bottom, $l)) | Jeden obiekt wartości Margin; kolejność konstruktora to (top, right, bottom, left) — nie (left, top, right) FPDF. FPDF SetMargins nie ma argumentu dolnego (jego dolny margines pochodzi z SetAutoPageBreak($auto, $margin)), więc wybierz $bottom sam — zwykle równy górnemu marginesowi lub przekaż margines automatycznego złamania strony. |
$pdf->SetAutoPageBreak($auto, $margin) | $doc->setAutoPageBreak($auto, $margin) | Bezpośrednie odwzorowanie. |
$pdf->SetDrawColor / SetFillColor / SetTextColor | $doc->setDrawColor / setFillColor / setTextColor | RGB (r, g, b) lub pojedyncza wartość dla skali szarości. |
$pdf->Line / Rect / SetLineWidth | $doc->line / rect / setLineWidth | Bezpośrednie odwzorowanie. rect() przyjmuje łańcuch stylu ('S'/'F'/'DF'). |
$pdf->SetTitle/SetAuthor/SetSubject/SetKeywords/SetCreator | $doc->setTitle/setAuthor/setSubject/setKeywords/setCreator | Bezpośrednie odwzorowanie. Ląduje w słowniku informacji ISO 32000-2 §14 / Extensible Metadata Platform (XMP). |
$pdf->Output($dest, $name) | $doc->output($name, OutputDestination::…) | Znaki przeznaczenia FPDF (I/D/F/S) odwzorowują się na enum OutputDestination; zwróć uwagę, że kolejność argumentów się zamienia (nazwa pierwsza w NextPDF). |
$pdf->Output('S') | $doc->getPdfData() | Zwraca bajty PDF. |
$pdf->Output('F', $path) | $doc->save($path) | Zapisuje do ścieżki pliku. |
$pdf->GetStringWidth($s) | (brak publicznej metody) | Szerokość łańcucha jest obliczana wewnętrznie podczas zawijania cell()/multiCell(); nie ma publicznego czasownika pomiaru pojedynczego łańcucha. Steruj zawijaniem przez multiCell() zamiast mierzyć ręcznie. |
Przykład kodu — szybki start
Dział zatytułowany „Przykład kodu — szybki start”<?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";Przykład kodu — produkcja
Dział zatytułowany „Przykład kodu — produkcja”Ten przykład jest zgodny z examples/04-text-and-fonts.php. Używa jawnego
rozmiaru strony, marginesów, zarejestrowanego katalogu czcionek oraz sterowanego
kursorem modelu cell, którego baza kodu FPDF już używa.
<?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);Przypadki brzegowe i pułapki
Dział zatytułowany „Przypadki brzegowe i pułapki”- Jednostki. Każda współrzędna numeryczna, szerokość, wysokość i margines,
które kopiujesz z FPDF, są domyślnie w milimetrach. Pomnóż przez
72 / 25.4, aby uzyskać punkty, raz, podczas przenoszenia. Mieszanie obu po cichu źle wymiaruje wszystko. - Kolejność argumentów
Output(). FPDF toOutput($dest, $name); NextPDF tooutput($name, $dest). Przeznaczenie to enumOutputDestination, a nie znak. Preferujsave()/getPdfData()dla wyjścia do pliku / łańcucha. - Kolejność
SetMargins. FPDF to(left, top, right); obiekt wartościMarginNextPDF to(top, right, bottom, left). Przestaw, nie przepisuj dosłownie. - Czcionki.
AddFont()FPDF + pliki metryk.phpnie mają odpowiednika. Umieść plik TrueType/OpenType w katalogu czcionek i wywołajsetFont()z nazwą rodziny. Rdzeniowe nazwy Base14 (Helvetica,Times,Courier) rozpoznają się bez pliku; pod PDF/A lub tagged PDF są automatycznie podstawiane osadzalną czcionką. GetStringWidth. Nie ma publicznej metody pomiaru łańcucha. Jeśli twój kod FPDF mierzy łańcuchy, aby ręcznie układać kolumny, przełącz ten blok namultiCell()(które zawija na metrykach) lub wywołaniacell()o stałej szerokości.
Wydajność
Dział zatytułowany „Wydajność”NextPDF emituje treść w jednym strumieniowym przejściu (zapis decyzji
architektonicznej ADR-001); szczytowa pamięć śledzi rozmiar dokumentu, a nie
utrzymywane drzewo obiektów. Budżet dla przykładu w tym przewodniku to
wall_ms: 2000, peak_mb: 128. Dla długich dokumentów steruj treścią przez
wywołania addPage() — ten sam kształt pętli, którego już używa raport FPDF.
Uwagi dotyczące bezpieczeństwa
Dział zatytułowany „Uwagi dotyczące bezpieczeństwa”- Metadane.
SetTitle()/SetAuthor()odwzorowują się na typowane settery zapisujące słownik informacji ISO 32000-2 §14 / XMP. Nigdy nie przechowuj tam sekretów. - Ścieżki obrazów.
image()odrzuca schematy stream-wrapper oraz osadzone bajty NUL przed odczytem. Przekazuj ścieżki kontrolowane przez aplikację. - Brak kodu w dokumencie. NextPDF nie wykonuje żadnych skryptów w dokumencie; nic w FPDF tego nie zmienia.
Zgodność
Dział zatytułowany „Zgodność”| Stwierdzenie | Specyfikacja | Klauzula |
|---|---|---|
| Format/orientacja strony odwzorowują się na ramkę granicy strony. | ISO 32000-2 | §7 |
| Czcionki są zapisywane jako osadzone/podzbiorowe programy czcionek. | ISO 32000-2 | §9 |
| Tytuł / metadane lądują w słowniku informacji / XMP. | ISO 32000-2 | §14 |
| Linie, prostokąty i obrazy to malowanie strumienia treści. | ISO 32000-2 | §8 |
NextPDF wytwarza treść ISO 32000-2; nie deklaruje wizualnej identyczności z FPDF. Ponownie przejrzyj wyjście, gdy zmieniasz renderer.
Kontekst komercyjny
Dział zatytułowany „Kontekst komercyjny”Nie dotyczy. Rdzeń NextPDF pokrywa opisaną tutaj ścieżkę migracji z FPDF.
Zobacz też
Dział zatytułowany „Zobacz też”Szczegóły migracji (wymagane sekcje R6)
Dział zatytułowany „Szczegóły migracji (wymagane sekcje R6)”Dla kogo to jest
Dział zatytułowany „Dla kogo to jest”Zespoły uruchamiające FPDF (lub tFPDF) do proceduralnego generowania PDF po
stronie serwera. Jeśli twój kod to sekwencja wywołań AddPage / SetFont /
Cell / MultiCell / Image / Output sterowanych przez SetXY i Ln,
odwzorowanie czasowników pokrywa całą twoją powierzchnię.
W zakresie: czasowniki rysowania FPDF, model kursora, czcionki, kolory, linie i
prostokąty, metadane oraz wyjście. Poza zakresem: narzędzia plików metryk
AddFont FPDF oraz zewnętrzne rozszerzenia skryptowe FPDF (kody kreskowe, rotacja,
zakładki) — odwzoruj je na odpowiadające moduły NextPDF (Barcode, Transforms,
Navigation), które nie są tutaj omówione.
Mapa kompatybilności
Dział zatytułowany „Mapa kompatybilności”Kompatybilność behawioralna, a nie nakładka drop-in: rdzeń nie dostarcza
żadnej nakładki klasy FPDF. Przepisz każde miejsce wywołania. Czasowniki ustawiają
się blisko, ponieważ API cell/text NextPDF dzieli linię FPDF/TCPDF, ale model
jednostek, kolejność argumentów Output oraz typy Margin/enum różnią się — więc
przepisanie dosłowne jest błędne, a tłumaczenie jest poprawne.
Mapa jednostek i konfiguracji
Dział zatytułowany „Mapa jednostek i konfiguracji”| Konstrukcja FPDF | NextPDF | Uwagi |
|---|---|---|
$unit ('mm' domyślnie) | (brak odpowiednika) | Pracuj w punktach PDF. Przeliczaj wymiary za pomocą pt = mm * 72 / 25.4 raz podczas przenoszenia. |
$orientation ('P'/'L') | enum Orientation na addPage() lub zamiana szerokości/wysokości PageSize | Pozioma = szerokość > wysokość. |
$size ('A4', [w,h]) | Config->pageSize (obiekt wartości PageSize) | Nazwane formaty stają się jawnymi wymiarami w punktach; istnieją fabryki PageSize::A4()…A0() oraz Letter/Legal. |
SetMargins($l, $t, $r) | Config->margins (Margin VO) | Kolejność konstruktora (top, right, bottom, left). |
AddFont($family, $style, $file) | katalog czcionek + setFont() po nazwie | Pomiń plik metryk; umieść TTF/OTF w Config->fontsDirectory. |
Różnica w obsłudze czcionek
Dział zatytułowany „Różnica w obsłudze czcionek”- Katalogi czcionek. Rejestracja
AddFontper czcionka w FPDF zwija się do katalogu czcionek plus dopasowania rodziny przezsetFont(). Zacznij odConfig->fontsDirectory(domyślna ścieżka wyszukiwania); zarejestruj dodatkowe katalogi przezFontRegistry::addFontDirectory()lubDocument::addFontDirectory(), gdy czcionki żyją w więcej niż jednym miejscu. - Zawsze Unicode. Brak domyślnego Latin-1 i brak osobnego buildu tFPDF; wejście UTF-8 jest normą.
- Zawsze podzbiór. NextPDF zawsze podzbioruje osadzone czcionki (ISO 32000-2 §9); wybory osadzania czcionek FPDF nie mają odpowiednika i nie są potrzebne.
- Ponownie ustal bazę glifów. Dopasowanie i mechanizm zapasowy czcionek są specyficzne dla silnika; alias czcionki FPDF może potrzebować dokładnej nazwy rodziny. Różnice w podstawianiu są oczekiwane, nie są defektami.
Różnice w zachowaniu
Dział zatytułowany „Różnice w zachowaniu”- Konwersja jednostek (mm → pt) — najczęstszy błąd przenoszenia; zobacz wyżej.
- Kolejność argumentów
Outputsię zamienia, a przeznaczenie staje się enum. Margin/Alignment/Orientationto typowane obiekty/enumy, a nie znaki ani pozycyjne trójki(l, t, r).- Brak publicznego
GetStringWidth— steruj zawijaniem przezmultiCell(). - Niezależna rasteryzacja — zawijanie wierszy i stronicowanie gęstej treści mogą się różnić; ponownie ustal bazę różnic wizualnych.
To udokumentowane różnice behawioralne, a nie defekty żadnego z silników.
Nieobsługiwane / brak bezpośredniego odpowiednika
Dział zatytułowany „Nieobsługiwane / brak bezpośredniego odpowiednika”- Selektor
$unitFPDF — niemodelowany (zawsze punkty). AddFont()+ pliki metryk.php/.z— zastąpione katalogiem czcionek.GetStringWidth()— brak publicznego czasownika pomiaru łańcucha.- Znaki przeznaczenia
'I'/'D'/'F'/'S'FPDF — zastąpione enumOutputDestination+save()/getPdfData().
Kod, który zależy od nich, nie „migruje” dosłownie. Wyraź go ponownie za pomocą wierszy powyżej.
Bezpieczna sekwencja migracji
Dział zatytułowany „Bezpieczna sekwencja migracji”- Dodaj
nextpdf/coreobok FPDF; pozostaw FPDF zainstalowany na razie. - Wybierz jeden dokument o niskim ryzyku. Przekonwertuj konstruktor za pomocą mapy jednostek, a następnie przenieś każdy czasownik za pomocą mapy czasowników. Przelicz każdą współrzędną mm na punkty.
- Umieść czcionki dokumentu w
Config->fontsDirectoryi wybierz je po nazwie rodziny; pomiń wywołaniaAddFont. - Wygeneruj oba PDF-y dla tego samego wejścia i porównaj je wizualnie. Różnice (podstawianie czcionek, zawijanie wierszy) są oczekiwane dla niezależnych silników — zaakceptuj je per dokument.
- Zastąp każdy ręczny układ oparty na
GetStringWidthwywołaniamimultiCell()lubcell()o stałej szerokości. - Powtarzaj per dokument, najpierw najniższe ryzyko; pozostaw FPDF zainstalowany do ostatniego przełączenia.
- Usuń FPDF z
composer.jsonpo ostatecznym przełączeniu.
Testowanie migracji
Dział zatytułowany „Testowanie migracji”- Zrób zrzut wyjścia FPDF dla reprezentatywnych dokumentów, zanim zmienisz kod (wejścia golden; bajty będą się różnić).
- Dla każdego zmigrowanego dokumentu potwierdź akceptację własnym sprawdzeniem
(różnica wizualna + wyodrębnienie tekstu). Zachowanie cell/font NextPDF jest
ćwiczone przez
examples/04-text-and-fonts.phpplus rdzeniowe zestawytests/Font i wyjścia tekstu. Akceptacja migracji jest specyficzna dla dokumentu i pozostaje twoją odpowiedzialnością. - Dodaj test regresji per zmigrowany dokument.
Evidence / traceability
Dział zatytułowany „Evidence / traceability”Każde behawioralne stwierdzenie NextPDF na tej stronie jest poparte sygnaturą
źródła w repozytorium, przykładem lub zapisem decyzji architektonicznej (ADR)
bądź, dla właściwości formatu PDF, klauzulami ISO 32000-2 w nagłówku citations:
oraz w tabeli Zgodność. Zachowanie FPDF jest deklarowane wyłącznie
jako „niezależny silnik — spodziewaj się udokumentowanych różnic”; ta strona nie
deklaruje żadnej zgodności, której nie potwierdza artefakt w repozytorium.
| Behawioralne stwierdzenie NextPDF | Dowód w repozytorium (ścieżka) |
|---|---|
AddPage odwzorowuje się na addPage(?PageSize, Orientation): static. | src/Core/Concerns/HasPages.php (addPage()). |
SetFont($family, $style, $size) odwzorowuje się na setFont(string, string, float): static; style ''/'B'/'I'/'BI'/'U'. | src/Core/Concerns/HasTypography.php (setFont()). |
Cell odwzorowuje się na cell($w, $h, $txt, $border, $newLine, $align, $fill): static. | src/Core/Concerns/HasTextOutput.php (cell()). |
MultiCell odwzorowuje się na multiCell($w, $h, $txt, $border, $align): static (zawijanie na metrykach). | src/Core/Concerns/HasTextOutput.php (multiCell(), wrapText()). |
Write/Text/Ln odwzorowują się na write()/text()/ln(). | src/Core/Concerns/HasTextOutput.php (write(), text(), ln()). |
SetXY/SetX/SetY/GetX/GetY odwzorowują się bezpośrednio; SetMargins przyjmuje Margin VO. | src/Core/Concerns/HasPages.php (setXY(), getX(), setMargins()); src/ValueObjects/Margin.php ((top, right, bottom, left)). |
Image odwzorowuje się na image($file, ?$x, ?$y, ?$w, ?$h): static; odrzuca ścieżki schemat/NUL. | src/Core/Concerns/HasImages.php (image(), assertImageFilePath()). |
Line/Rect/SetLineWidth/SetDrawColor/SetFillColor/SetTextColor odwzorowują się bezpośrednio. | src/Core/Concerns/HasDrawing.php (line(), rect(), setLineWidth()); src/Core/Concerns/HasColors.php (setDrawColor(), setFillColor(), setTextColor()). |
Domyślna strona createStandalone() to A4 pionowo (595.276 × 841.890 pt). | src/Core/Document.php (createStandalone()); src/ValueObjects/PageSize.php (A4()). |
Przeznaczenie wyjścia to enum 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/… odwzorowują się na typowane settery metadanych; lądują w słowniku informacji / XMP. | src/Core/Concerns/HasMetadata.php (setTitle(), setAuthor()); ISO 32000-2 §14 (nagłówek citations:). |
| Czcionki są zawsze osadzane jako programy podzbiorowe. | src/Core/Concerns/HasTypography.php (buildFontData()); ISO 32000-2 §9 (nagłówek citations:). |
| Treść jest emitowana w jednym przejściu. | docs/architecture/adr/ADR-001-stream-based-rendering-pipeline.md. |
Wycofanie zmian
Dział zatytułowany „Wycofanie zmian”Oba pakiety pozostają zainstalowane do ostatecznego przełączenia, więc wycofanie per miejsce wywołania oznacza przywrócenie tego miejsca wywołania do ścieżki FPDF. Po ostatecznym przełączeniu wycofanie oznacza przywrócenie FPDF i poprzedniego kodu z kontroli wersji. Nie jest zaangażowana żadna migracja danych.
Uwagi dotyczące wydajności
Dział zatytułowany „Uwagi dotyczące wydajności”Zobacz Wydajność. Model jednoprzebiegowy eliminuje koszt utrzymywanego bufora. Nowym kosztem per dokument jest wczesne rozpoznawanie czcionek (krok 3), które można buforować na poziomie katalogu czcionek.
Częste pułapki
Dział zatytułowany „Częste pułapki”- Przepisywanie współrzędnych milimetrowych jako punktów bez konwersji
* 72 / 25.4. - Pozostawienie
Output()w kolejności($dest, $name)FPDF lub przekazanie znaku zamiast enumaOutputDestination. - Przepisywanie
SetMargins($l, $t, $r)wprost doMargin(którego kolejność totop, right, bottom, left). - Oczekiwanie, że pliki metryk
AddFontsię przeniosą; umieść TTF/OTF w katalogu czcionek zamiast tego. - Sięganie po odpowiednik
GetStringWidth; użyjmultiCell()do zawijania. - Oczekiwanie wyjścia identycznego bajt po bajcie / piksel po pikselu (niezależne silniki — ten przewodnik nigdy nie deklaruje drop-in ani 100% kompatybilności).