tecnickcom/tcpdf
TCPDF is a mature PHP library for generating PDF documents without external dependencies. Create pages, headers/footers, tables, images, barcodes, and multilingual/RTL text, with fine control over fonts, layout, and output (inline, download, file).
[!WARNING] TCPDF is in maintenance-only mode. Active development has moved to tc-lib-pdf, its modern, modular successor — new projects should start there.
TCPDF is still installed 100M+ times across 500+ PHP packages. If your product depends on it, sponsor continued maintenance → to keep this shared infrastructure secure and patched.
TCPDF is a pure-PHP library for generating PDF documents and barcodes directly in application code.
It has been widely used across many PHP stacks and still provides a complete feature set for text rendering, page composition, graphics, signatures, forms, and standards-oriented output.
| Package | tecnickcom/tcpdf |
| Author | Nicola Asuni info@tecnick.com |
| License | GNU LGPL v3 (see LICENSE.TXT) |
| Website | http://www.tcpdf.org |
| Source | https://github.com/tecnickcom/TCPDF |
Starting with this version, the TCPDF class no longer contains its own PDF engine.
It is a compatibility facade: every public TCPDF method is a thin wrapper that
delegates the actual PDF generation to the modern tecnickcom/tc-lib-pdf engine
(\Com\Tecnick\Pdf\Tcpdf), while a small internal state layer reproduces the legacy
stateful cursor and page model (current X/Y, margins, fonts, colors, automatic page
breaks, headers/footers).
What this means in practice:
new TCPDF(...),
AddPage(), SetFont(), Cell(), writeHTML(), Output() exactly as before.tc-lib-* libraries.delegated, adapter, shim, intentional-noop,
blocked) with notes; the table is machine-verified against the class.TCPDF is deprecated and in maintenance-only mode.
Active feature development has moved to tc-lib-pdf, the modern and modular successor.
For new projects, use tecnickcom/tc-lib-pdf. This repository remains available for legacy systems and critical compatibility fixes.
tecnickcom/tc-lib-pdf.tc-lib-pdf.TCPDF has migrated font loading to the tc-lib font stack (see "Breaking Changes" below).
tecnickcom/tc-lib-pdf is the Composer entrypoint.tecnickcom/tc-lib-pdf-font and discovered under vendor/tecnickcom/tc-lib-pdf-font/target/fonts/.fonts/ assets are removed; TCPDF now resolves bundled fonts from tc-lib assets.Who is affected:
fonts/ files without Composer dependencies.K_PATH_FONTS assumptions tied to a repository-relative fonts folder.How to migrate custom font usage:
vendor/tecnickcom/tc-lib-pdf-font/target/fonts/.SetFont()/AddFont() from TCPDF, but validate that each custom family resolves from tc-lib assets or from your explicit font path.vendor/ font assets are shipped in production.Font generation procedure (Makefile):
make deps to install Composer dependencies and initialize tc-lib font assets.make fonts to initialize fonts only when missing.make fonts-rebuild to force a full font asset rebuild.Expected generated asset sentinel:
vendor/tecnickcom/tc-lib-pdf-font/target/fonts/core/helvetica.jsonCompatibility notes:
AddFont() path.fontname.php + fontname.z) are no longer supported
(see "Breaking Changes" below); convert the original TTF/OTF with the
tc-lib-pdf-font importer instead.Example:
require __DIR__.'/vendor/autoload.php';
// Optional: override only if you need a non-default path.
define('K_PATH_FONTS', __DIR__.'/vendor/tecnickcom/tc-lib-pdf-font/target/fonts/');
$pdf->SetFont('helvetica', '', 11);
Safe migration checklist:
tecnickcom/tc-lib-pdf in Composer and install dependencies.vendor/tecnickcom/tc-lib-pdf-font/target/fonts/.fonts/ files.K_PATH_FONTS overrides that point to removed directories.Migration still requires planning and regression checks to preserve rendering parity for existing documents.
The facade favors the modern engine model over bug-for-bug legacy emulation in the following areas. Each is a deliberate, documented contract change:
Font model. Fonts are resolved exclusively through the tc-lib-pdf-font stack:
JSON definition files discovered under K_PATH_FONTS
(vendor/tecnickcom/tc-lib-pdf-font/target/fonts/, generated by make fonts).
The legacy TCPDF font definition format (fontname.php + fontname.z /
fontname.ctg.z) is not supported and is not converted at runtime:
SetFont()/AddFont() accept families known to the tc-lib font stack
(core fonts, DejaVu, FreeFont, CID-0, ...) or definition files in the tc-lib
JSON format via the font-file parameter.aefurat, aealarabiya) are unavailable;
requesting them throws a font exception. Use a tc-lib font with equivalent
coverage (e.g. freeserif/dejavusans for Arabic) or import the original
TTF/OTF with the tc-lib-pdf-font importer.See "Migrating Font Assets" above for the step-by-step migration procedure.
Stream compression is always on. setCompression(false) is a no-op; the engine
always compresses content streams.
EPS/AI vector import is dropped. The modern engine has no PostScript interpreter,
so ImageEps() ignores EPS/AI input. Convert EPS/AI artwork to SVG
(e.g. inkscape file.eps --export-filename=file.svg) and use ImageSVG() instead.
As a convenience, ImageEps() dispatches SVG and raster file names to the modern paths.
RC4 encryption is legacy-only. setProtection() modes 0/1 still work, but the
engine deprecates RC4; AES modes (2/3) are recommended. setProtection() must be
called before the first page is added.
Resource loading is policy-based. The engine restricts where external resources
(images, fonts, SVG, imported PDFs) may be loaded from: local reads are limited to an
allowlist of trusted directories and remote (HTTP/HTTPS) reads are disabled by default.
The legacy setAllowLocalFiles() toggle no longer widens access; the policy is driven
by configuration constants instead (see Resource Loading Security).
Smaller deliberate no-ops (disk caching, setDocInfoUnicode(), header XObject template
caching, vector-image rasterization toggles, ...) are listed with their reasons in
MAPPING.md.
External resources are fetched through the sandboxed file helper provided by
tc-lib-pdf / tc-lib-file. The sandbox enforces two independent allowlists, both
configurable via define() constants (read by tcpdf_autoconfig.php, overridable in
config/tcpdf_config.php or before the autoconfig runs):
| Constant | Type | Default | Purpose |
|---|---|---|---|
K_ALLOWED_PATHS |
string[] |
[] |
Extra trusted local directory prefixes, merged on top of the built-in defaults. |
K_ALLOWED_HOSTS |
string[] |
[] |
Trusted remote host names that enable HTTP/HTTPS loading. Empty keeps remote loading disabled. |
K_MAX_REMOTE_SIZE |
int |
52428800 |
Byte cap for a single remote download (50 MiB). |
K_CURLOPTS |
array |
[] |
Extra CURLOPT_* => value pairs merged over the cURL defaults. |
Local reads. The built-in allowlist always covers the system temp directory,
K_PATH_MAIN, the bundled vendor/tecnickcom/ directory, the current working directory,
K_PATH_FONTS, K_PATH_IMAGES and the running script's directory. K_ALLOWED_PATHS
only ever widens this set — paths are resolved with realpath(), so non-existent or
unresolvable entries are silently ignored and traversal/symlink tricks collapse to their
canonical prefix. There is no way to read below the built-in roots.
Remote reads. Remote URL loading is off by default — the single most important
defense against SSRF when rendering untrusted HTML/markup. To opt in, list the exact
host names you trust in K_ALLOWED_HOSTS. TLS certificate verification and redirect
handling are enforced upstream and cannot be relaxed through K_CURLOPTS.
// Enable downloads from two trusted CDNs, cap them at 10 MiB, and add a custom timeout.
define('K_ALLOWED_HOSTS', ['cdn.example.com', 'assets.example.org']);
define('K_MAX_REMOTE_SIZE', 10 * 1024 * 1024);
define('K_CURLOPTS', [CURLOPT_TIMEOUT => 15]);
// Allow reading shared assets from outside the install tree.
define('K_ALLOWED_PATHS', ['/var/www/shared/assets/']);
Document encryption is a separate concern: setProtection() (item 4 above) controls
the PDF permission flags and password/public-key encryption and is unaffected by these
resource-loading constants.
ext-curlOptional extensions for richer output in some workflows: gd (automatic raster format conversion), zlib.
This repository ships a real validation harness:
| Command | Purpose |
|---|---|
make deps |
Install Composer dependencies, tooling, and initialize tc-lib font assets |
make qa |
Full gate: mago lint + static analysis + PHPUnit suite |
make test |
Run the PHPUnit suite (test/) |
make smoke |
Run all 68 example scripts headless and verify the produced PDF documents |
make inventory |
Regenerate the public method inventory reports |
make mapping |
Verify the delegation map and regenerate MAPPING.md |
The example smoke runner (scripts/example_smoke.php) requires
pdfinfo (poppler-utils) and treats any warning, notice, or deprecation as a failure.
Examples that exercise a declared breaking change can be tracked as expected failures with
a documented reason (currently none: all 68 examples pass).
Third-party bundled font assets are provided through tecnickcom/tc-lib-pdf-font under vendor/tecnickcom/tc-lib-pdf-font/target/fonts/.
TCPDF no longer ships a repository-local fonts/ directory.
For full details, see the bundled notices shipped by tecnickcom/tc-lib-pdf-font.
How can I help you explore Laravel packages today?