Przejdź do głównej zawartości
getnextpdf.com

Migracja z FPDF do NextPDF

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.

Okno terminala
composer require nextpdf/core:^3

Pozostaw zainstalowany setasign/fpdf (lub twój fpdf/fpdf) podczas migracji. Usuń go po ostatecznym przełączeniu (zobacz bezpieczną sekwencję migracji).

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 = 0 na 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 jawne addPage().
  • 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.

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.

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ść).

FPDFNextPDFUwagi
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 / setYBezpoś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 / setTextColorRGB (r, g, b) lub pojedyncza wartość dla skali szarości.
$pdf->Line / Rect / SetLineWidth$doc->line / rect / setLineWidthBezpośrednie odwzorowanie. rect() przyjmuje łańcuch stylu ('S'/'F'/'DF').
$pdf->SetTitle/SetAuthor/SetSubject/SetKeywords/SetCreator$doc->setTitle/setAuthor/setSubject/setKeywords/setCreatorBezpoś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.
<?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";

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);
  • 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 to Output($dest, $name); NextPDF to output($name, $dest). Przeznaczenie to enum OutputDestination, a nie znak. Preferuj save() / getPdfData() dla wyjścia do pliku / łańcucha.
  • Kolejność SetMargins. FPDF to (left, top, right); obiekt wartości Margin NextPDF to (top, right, bottom, left). Przestaw, nie przepisuj dosłownie.
  • Czcionki. AddFont() FPDF + pliki metryk .php nie mają odpowiednika. Umieść plik TrueType/OpenType w katalogu czcionek i wywołaj setFont() 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 na multiCell() (które zawija na metrykach) lub wywołania cell() o stałej szerokości.

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.

  • 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.
StwierdzenieSpecyfikacjaKlauzula
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.

Nie dotyczy. Rdzeń NextPDF pokrywa opisaną tutaj ścieżkę migracji z FPDF.


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.

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.

Konstrukcja FPDFNextPDFUwagi
$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 PageSizePozioma = 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 nazwiePomiń plik metryk; umieść TTF/OTF w Config->fontsDirectory.
  • Katalogi czcionek. Rejestracja AddFont per czcionka w FPDF zwija się do katalogu czcionek plus dopasowania rodziny przez setFont(). Zacznij od Config->fontsDirectory (domyślna ścieżka wyszukiwania); zarejestruj dodatkowe katalogi przez FontRegistry::addFontDirectory() lub Document::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.
  • Konwersja jednostek (mm → pt) — najczęstszy błąd przenoszenia; zobacz wyżej.
  • Kolejność argumentów Output się zamienia, a przeznaczenie staje się enum.
  • Margin / Alignment / Orientation to typowane obiekty/enumy, a nie znaki ani pozycyjne trójki (l, t, r).
  • Brak publicznego GetStringWidth — steruj zawijaniem przez multiCell().
  • 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.

  • Selektor $unit FPDF — 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 enum OutputDestination + save()/getPdfData().

Kod, który zależy od nich, nie „migruje” dosłownie. Wyraź go ponownie za pomocą wierszy powyżej.

  1. Dodaj nextpdf/core obok FPDF; pozostaw FPDF zainstalowany na razie.
  2. 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.
  3. Umieść czcionki dokumentu w Config->fontsDirectory i wybierz je po nazwie rodziny; pomiń wywołania AddFont.
  4. 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.
  5. Zastąp każdy ręczny układ oparty na GetStringWidth wywołaniami multiCell() lub cell() o stałej szerokości.
  6. Powtarzaj per dokument, najpierw najniższe ryzyko; pozostaw FPDF zainstalowany do ostatniego przełączenia.
  7. Usuń FPDF z composer.json po ostatecznym przełączeniu.
  • 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.php plus rdzeniowe zestawy tests/ Font i wyjścia tekstu. Akceptacja migracji jest specyficzna dla dokumentu i pozostaje twoją odpowiedzialnością.
  • Dodaj test regresji per zmigrowany dokument.

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 NextPDFDowó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.

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.

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.

  • 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 enuma OutputDestination.
  • Przepisywanie SetMargins($l, $t, $r) wprost do Margin (którego kolejność to top, right, bottom, left).
  • Oczekiwanie, że pliki metryk AddFont się przeniosą; umieść TTF/OTF w katalogu czcionek zamiast tego.
  • Sięganie po odpowiednik GetStringWidth; użyj multiCell() 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).