Table of Contents

TCPDF su Debian 10 Buster

Purtroppo il pacchetto php-tcpdf non è presente in Debian 10 Buster, esiste però come backport oppure si dovrebbe poter installare la versione da Debian Bullseye, scarcando il file da Debian packages.

mkdir -p /usr/local/download/php-tcpdf
cd /usr/local/download/php-tcpdf
wget http://ftp.de.debian.org/debian/pool/main/t/tcpdf/php-tcpdf_6.3.2+dfsg1-1_all.deb
dpkg -i php-tcpdf_6.3.2+dfsg1-1_all.deb

Una volta installato è sufficiente includere nel codice PHP:

require_once('/usr/share/php/tcpdf/tcpdf.php');

L'alternativa FPDF

In alternativa a php-tcpdf esiste il pacchetto php-fpdf (home page www.fpdf.org). Si tratta di una libreria con minori funzionalità, ma più snella. È inclusa nelle ultime versioni di Debian, compresa l'auttuale stabile 10 Buster (che include php-fpdf 1.8.1), e la futura Bullseye.

L'estensione FPDI

FPDI sta per Free PDF Document Importer, si tratta di una estensione che funziona sia con FPDF che con TCPDF. Consente di inlcudere un file PDF esistente ed utilizzarlo come template per creare altri documenti.

Debian includeva libfpdi-php 1.4.1 fino alla versione 8 Jessie, nella attuale versione 10 Buster purtroppo non c'è. La libreria è comunque scaricabile da GitHub, ad esempio la release 2.2.0 è scaricabile scegliendo il Tag v2.2.0.

Per una installazione manuale si può scompattare l'archivio FPDI-2.2.0.zip in /usr/local/share/php/ oppure anche nella directory stessa del progetto PHP. Quello che serve è la directory src contenuta nell'archivio ZIP, che può essere rinominata ad esempio in fpdi-2.2.0 creando un link simbolico fpdi. Per includerla si aggiunge al codice PHP:

// Set the namespace to use FPDI over FPDF.
use setasign\Fpdi\Fpdi;
// Set the namespace to use FPDI over TCPDF.
// use setasign\Fpdi\Tcpdf\Fpdi;
// Include the FPDI extension, to import pages from existing PDF documents.
require_once('/usr/local/share/php/fpdi/autoload.php');

Come si vede nell'esempio viene utilizzata la keyword use per definire quale variante di FPDI si vuole utilizzare: quella basata su FPDF oppure quella basata su TCPDF (in effetti sono supportate anche altre varianti).

ATTENZIONE: La versione FPDI 2.2.0 richiede FPDF 1.8. Con versioni più vecchie (ad esempio FPDF 1.7) si incappa nell'errore:

PHP Fatal error:  Access level to setasign\Fpdi\FpdfTplTrait::_putimages()
  must be public (as in class FPDF) in /niccolo/fpdi/FpdfTpl.php on line 19

Installazione consigliata

Ad oggi (giugno 2024) questo è lo stack di librerie consigiate:

Nel codice PHP si includono le librerie con le seguenti direttive:

set_include_path(".:/usr/local/share/php:/usr/share/php");
require_once('tcpdf/tcpdf.php');
use setasign\Fpdi\Tcpdf\Fpdi;
require_once('fpdi/autoload.php');

Per creare una pagina PDF con Fpdi:

// TCPDI extends the TCPDF class:
$pdf = new Fpdi($orientation='P', $unit='pt', $format='A4', $unicode=TRUE, $encoding='UTF-8', $diskcache=FALSE);
// Add a page
$pdf->AddPage();
// Include a PNG picture.
$pdf->Image('image.png', 80.0, 110.0, 60.0);
// Include page 7 from an existing PDF document.
$pdf->setSourceFile('document.pdf');
$imported_page = $pdf->importPage(7, '/MediaBox');
// Arguments: ($page, $x, $y, $size):
$pdf->useTemplate($imported_page, 80, 510, 140);
//Close and output PDF document
$pdf->Output('save_as.pdf', 'I');