Reduciendo el tamaño de mPDF

mPDF es una clase PHP que genera archivos PDF desde HTML con codificación UTF-8. Se basa en FPDF y HTML2FPDF, con una serie de mejoras. Según el propio autor la librería, que ya va por su versión 6.0 y es sobre la que hablaré en este post, se creó para producir archivos PDF de diferentes idiomas al vuelo. Es más lento que los scripts originales, por ejemplo HTML2FPDF, y produce archivos más grandes cuando se usa Unicode, pero tiene soporte de estilos CSS y muchas mejoras.

Pero bueno, si has llegado hasta aquí buscando como reducir el tamaño de esta librería supongo que sepas lo anterior así que vamos al grano.

Este post va dedicado a todos aquellos que generan PDF pero que no requieren funcionalidades extras, en mi caso solo necesito que un HTML en español e inglés, con imágenes y estilos básicos sea convertido en un PDF de una sola página, por ejemplo el siguiente código:

$mpdf = new mPDF('en-GB-x','A4','','',5,5,5,5,0,0);
$mpdf->mirrorMargins = 1;
$mpdf->SetDisplayMode('fullpage');
$mpdf->WriteHTML(utf8_encode($aCodigohtml));
$mpdf->Output($pdf_tve_filname, "F");

Cómo veis es bastante simple, ahora veamos qué podemos eliminar de esta librería (en concreto de la versión 6.0)

  1. Si tu código no necesita soporte para PDF/A puedes eliminar la carpeta iccprofiles.
  2. Si no vas a trabajar con códigos QR puedes eliminar, y de paso ahorrar mucho espacio, la carpeta qrcode.
  3. Las fuentes, alojadas en ttfonts, ocupan bastante espacio también, si no vas a trabajar con idiomas de alfabetos especiales como el árabe, ruso, chino, etc puedes eliminar todas las fuentes salvo las de la familia DejaVu, es muy importante que modifiques el archivo config_fonts.php o que luego de crear el objeto reasignes el valor de la variable fontdata. (al final del documento pongo un ejemplo)
  4. La carpeta collations se puede eliminar a menos que quieras reorganizar e indexar.
  5. No son necesarias las carpetas examples y utils.
  6. La carpeta mpdfi no sé para que es pero yo la borré y no he tenido problemas para el código anterior.
  7. En la carpeta patterns se almacenan los patrones por idiomas para dividir las palabras en sílabas, importante para cortarlas al final de las líneas. Puedes eliminar los idiomas que no utilices.

Ejemplo del archivo config_fonts.php solo para las letras DejaVu:

$this->fontdata = array(
	"dejavusanscondensed" => array(
		'R' => "DejaVuSansCondensed.ttf",
		'B' => "DejaVuSansCondensed-Bold.ttf",
		'I' => "DejaVuSansCondensed-Oblique.ttf",
		'BI' => "DejaVuSansCondensed-BoldOblique.ttf",
		'useOTL' => 0xFF,
		'useKashida' => 75,
		),
	"dejavusans" => array(
		'R' => "DejaVuSans.ttf",
		'B' => "DejaVuSans-Bold.ttf",
		'I' => "DejaVuSans-Oblique.ttf",
		'BI' => "DejaVuSans-BoldOblique.ttf",
		'useOTL' => 0xFF,
		'useKashida' => 75,
		),
	"dejavuserif" => array(
		'R' => "DejaVuSerif.ttf",
		'B' => "DejaVuSerif-Bold.ttf",
		'I' => "DejaVuSerif-Italic.ttf",
		'BI' => "DejaVuSerif-BoldItalic.ttf",
		),
	"dejavuserifcondensed" => array(
		'R' => "DejaVuSerifCondensed.ttf",
		'B' => "DejaVuSerifCondensed-Bold.ttf",
		'I' => "DejaVuSerifCondensed-Italic.ttf",
		'BI' => "DejaVuSerifCondensed-BoldItalic.ttf",
		),
	"dejavusansmono" => array(
		'R' => "DejaVuSansMono.ttf",
		'B' => "DejaVuSansMono-Bold.ttf",
		'I' => "DejaVuSansMono-Oblique.ttf",
		'BI' => "DejaVuSansMono-BoldOblique.ttf",
		'useOTL' => 0xFF,
		'useKashida' => 75,
		)
);

Ejemplo al inicializar el objeto:

$pdf = new mPDF();
$pdf->fontdata = array(...);

Con estas pautas podremos reducir considerablemente el tamaño de la librería mPDF versión 6.0 para un uso básico de la misma sin perder funcionalidades.

Este artículo es una ampliación y traducción del siguiente en inglés.

Comentarios

Unknown ha dicho que…
Lo que mejor he comprendido ha sido el punto 6.