コード例 #1
0
function spipdf_html2pdf($html){

	// les librairies possibles
	$possible_librairies = array(
		'mpdf' => array( // gére le float d'image mais pas les captions de tableau
			'float' => true,
			'caption' => true,
			'traite_balise_page' => true,
		),
		'html2pdf' => array( // ne gére pas le float d'image et les captions
			'float' => false,
			'caption' => true,
		),
		'dompdf' => array( // domPDF beta 0.6 EXPERIMENTAL
			'float' => false,
			'caption' => true,
			'traite_balise_page' => true,
		),
	);

	// choix de la classe de génération via la balise <page lib>
	if (preg_match('/\<page*.lib_pdf=["|\'](.*)["|\']/iUms', $html, $match_librairie)
		&& !empty($match_librairie[1])
		&& array_key_exists(strtolower($match_librairie[1]), $possible_librairies)
	){
		$librairie_pdf = strtolower($match_librairie[1]);
	} else {
		$librairie_pdf = 'mpdf';
	}

	// tester si la librairie est dans /lib à la racine du spip ou dans le répertoire du plugin
	if (is_dir(_DIR_LIB . $librairie_pdf)){
		$dir_librairie_pdf = _DIR_LIB . $librairie_pdf . '/';
	} elseif (is_dir(dirname(__FILE__) . '/lib/' . $librairie_pdf)) {
		$dir_librairie_pdf = dirname(__FILE__) . '/lib/' . $librairie_pdf . '/';
	} else {
		die('Impossible de trouver la librairie de génération de PDF ' . $librairie_pdf . '. vérifiez que vous l\'avez bien téléchargée et installée dans /lib');
	}

	// nettoyer le HTML et gérer les placements d'image en fonction de la librairie utilisée
	$html = spipdf_nettoyer_html($html, $possible_librairies[$librairie_pdf]);

	// Debug = voir le html sans génération de PDF
	if (isset($_GET['debug_spipdf'])){
		echo $html;
		exit;
	}

	// du A4 par defaut
	$format_page = _SPIPDF_FORMAT;

	// traiter la balise page pour les librairies qui ne la comprennent pas
	if (!empty($possible_librairies[$librairie_pdf]['traite_balise_page'])){
		$html = traite_balise_page($html);

		// dans balise_page, on ne récupère que quelques possibilité dont le format
		if (!empty($GLOBALS['valeurs_page'])){
			if (!empty($GLOBALS['valeurs_page']['format'])){
				$format_page = $GLOBALS['valeurs_page']['format'];
			}
			if (!empty($GLOBALS['valeurs_page']['backtop'])){
				$backtop = $GLOBALS['valeurs_page']['backtop'];
			} else {
				$backtop = _SPIPDF_MARGIN_TOP;
			}
			if (!empty($GLOBALS['valeurs_page']['backbottom'])){
				$backbottom = $GLOBALS['valeurs_page']['backbottom'];
			} else {
				$backbottom = _SPIPDF_MARGIN_BOTTOM;
			}
			if (!empty($GLOBALS['valeurs_page']['backleft'])){
				$backleft = $GLOBALS['valeurs_page']['backleft'];
			} else {
				$backleft = _SPIPDF_MARGIN_LEFT;
			}
			if (!empty($GLOBALS['valeurs_page']['backright'])){
				$backright = $GLOBALS['valeurs_page']['backright'];
			} else {
				$backright = _SPIPDF_MARGIN_RIGHT;
			}
			if (!empty($GLOBALS['valeurs_page']['margin_header'])){
				$margin_header = $GLOBALS['valeurs_page']['margin_header'];
			} else {
				$margin_header = _SPIPDF_MARGIN_HEADER;
			}
			if (!empty($GLOBALS['valeurs_page']['margin_footer'])){
				$margin_footer = $GLOBALS['valeurs_page']['margin_footer'];
			} else {
				$margin_footer = _SPIPDF_MARGIN_FOOTER;
			}
		}
	}

	if ($librairie_pdf=='mpdf'){ // la librairie mPDF

		// si il y a des options dans la balise page
		// http://mpdf1.com/manual/index.php?tid=307

		// le chemin relatif vers mPDF
		define('_MPDF_PATH', $dir_librairie_pdf);
		include_once _MPDF_PATH . 'mpdf.php';

		// la classe mPDF
		$mpdf = new mPDF(SPIPDF_CHARSET, $format_page, 0, '', $backleft, $backright, $backtop, $backbottom, $margin_header, $margin_footer);
		$mpdf->WriteHTML($html);

		$html = $mpdf->Output('', 'S'); // envoyer le code binaire du PDF dans le flux
		$echap_special_pdf_chars = true;
	} elseif ($librairie_pdf=='dompdf') { // la librairie dompdf beta 0.6 // EXPERIMENTAL

		// le chemin relatif vers mPDF
		require_once _DIR_LIB . 'dompdf/dompdf_config.inc.php';

		$dompdf = new DOMPDF();
		$dompdf->load_html($html, SPIPDF_CHARSET);
		$dompdf->set_paper($format_page);
		$dompdf->render();

		$html = $dompdf->output(); // envoyer le code binaire du PDF dans le flux
		$echap_special_pdf_chars = true;
	} else { // la librairie HTML2PDF par défaut

		// appel de la classe HTML2pdf
		require_once $dir_librairie_pdf . 'html2pdf.class.php';
		try {
			// les paramétres d'orientation et de format son écrasé par ceux défini dans la balise <page> du squelette
			$html2pdf = new HTML2PDF('P', $format_page, $flux['args']['contexte']['lang'], SPIPDF_UNICODE, SPIPDF_CHARSET);

			// mode debug de HTML2PDF
			if (defined('SPIPDF_DEBUG_HTML2PDF')){
				$html2pdf->setModeDebug();
			}
			// police différente selon unicode ou latin
			if (SPIPDF_UNICODE){
				$police_caractere = 'FreeSans';
			} else {
				$police_caractere = 'Arial';
			}
			$html2pdf->setDefaultFont($police_caractere);
			$html2pdf->writeHTML($html);

			$html = $html2pdf->Output('', true); // envoyer le code binaire du PDF dans le flux
			$echap_special_pdf_chars = true;
		} catch (HTML2PDF_exception $e) {
			echo $e;
		}
	}

	// On échappe les suites de caractères <? pour éviter des erreurs d'évaluation PHP (seront remis en place avec affichage_final)
	// l'erreur d'évaluation est liée à la directive short_open_tag=On dans la configuration de PHP
	if (!empty($echap_special_pdf_chars)
		and strpos($html, '<' . '?')!==false
	){
		$html = str_replace('<' . '?', "<\2\2?", $html);
	}

	return $html;
}
コード例 #2
0
	public function htmlToPdf($html, $debug = false) {
		require_once(dirname(__FILE__).'/pdf/html2pdf.class.php');
		try {
		    $html2pdf = new HTML2PDF('P', 'A4', 'fr');
		    if ($debug)
		    	$html2pdf->setModeDebug();
		    $html2pdf->setDefaultFont('Arial');
		    $html2pdf->writeHTML($html);
		    $html2pdf->Output('resultado.pdf');
		}
		catch(HTML2PDF_exception $e) {
		    echo $e;
		    exit;
		}
	}