TCPDF Migration

TCPDF ist ab Version 7 deprecated und nur noch eine Kompatibilitäts-Layer für tecnickcom/tc-lib-pdf. Die API ist gleich geblieben, also nur ein paar Verhalten sind anders.

Für neue PDFs ids/ids-pdf benutzen (tc-lib-pdf Wrapper).

Fonts

Die alten Fonts (fontname.php + fontname.z) gehen nicht mehr. Die Fonts mit tc-lib-pdf-font bauen, z. B. nach assets/fonts/, und K_PATH_FONTS darauf zeigen lassen.

Erlaubte Pfade

Bilder werden nur noch aus Verzeichnissen in K_ALLOWED_PATHS geladen. Beide Konstanten müssen in load.inc.php vor dem Composer-Autoload stehen:

define('K_PATH_FONTS', ASSETS_PATH . DIRECTORY_SEPARATOR . 'fonts' . DIRECTORY_SEPARATOR);

define('K_ALLOWED_PATHS', [
    SHOP_PATH . DIRECTORY_SEPARATOR . 'system' . DIRECTORY_SEPARATOR,
    SHOP_PATH . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR,
    ASSETS_PATH . DIRECTORY_SEPARATOR,
]);

Keine Pfade mit ..

Pfade mit .. werden immer abgelehnt, auch wenn sie in einem erlaubten Verzeichnis landen. Stattdessen die _PATH-Konstanten nehmen:

// geht nicht mehr
$imgpfad = __DIR__ . '/../../';
$img = "../../system/labelimages/" . $datei;

// so passt es
$imgpfad = SHOP_PATH . '/';
$img = SHOP_PATH . "/system/labelimages/" . $datei;

Doppelte Slashes sind egal, die werden normalisiert.

Output() mit F ändert den Dateinamen

Beim Speichern mit 'F' wird der Dateiname bereinigt (Punkte, Sonderzeichen). Wenn der Name z. B. aus Kundenname und Ort gebaut wird, stimmt danach der Downloadlink nicht mehr. Deshalb selbst schreiben:

file_put_contents($pdfDatei, $pdf->Output('', 'S'));

Bildtyp nicht fest vorgeben

Image(..., 'JPG', ...) mit einer PNG schlägt fehl. Typ leer lassen (''), dann wird er erkannt. Die alte Umwandlung PNG/GIF → JPG per GD braucht es dann nicht mehr.

Fehler kosten das ganze PDF

Kann ein Bild nicht geladen werden, wirft Image() eine Exception und es gibt gar kein PDF. Bei eigenen Bildern ist das okay, bei vom Kunden hochgeladenen Dateien (Kundenlogo) nicht. Daher beim Laden prüfen und beim Einfügen abfangen:

if ($logo != '' && @getimagesize($logo) === false) {
    $env->log('Kundenlogo ungültig, PDF ohne Logo: ' . $logo, 'warning');
    $logo = '';
}

try {
    $pdf->Image($logo, 15, 10, 0, 25, '', '', '', false, 300);
} catch (Throwable $e) {
    $env->log('Kundenlogo im PDF übersprungen: ' . $e->getMessage(), 'warning');
    // Fallback, z. B. Firmenname ausgeben
}

Die getimagesize()-Prüfung gilt auch für ids-pdf: dort steckt das Bild im HTML, ein Fehler kostet dann die ganze Seite.

Layout prüfen

Zeilenumbrüche und Schriftmetrik können leicht abweichen. Nach dem Update jedes PDF einmal erzeugen und anschauen, vor allem manuell positionierte Layouts (SetXY, feste Zellhöhen).