Extension:Pdf Export/Source Code
From MediaWiki.org
Contents |
[edit] Overview
This is the source code for Pdf Export extension. There are four files. Copy each of the following into the files as indicated.
[edit] PdfExport.php
Put the following into $IP/extensions/PdfExport/PdfExport.php:
<?php if ( !defined( 'MEDIAWIKI' ) ) die (); $wgExtensionCredits['specialpage'][] = array( 'name' => 'PdfExport', 'author' =>'Thomas Hempel', 'version' => '2.2.1', 'description' => 'renders a page as pdf', 'url' => 'http://www.mediawiki.org/wiki/Extension:Pdf_Export' ); $dir = dirname(__FILE__) . '/'; # Internationalisation file $wgExtensionMessagesFiles['PdfPrint'] = $dir . 'PdfExport.i18n.php'; $wgExtensionAliasesFiles['PdfPrint'] = $dir . 'PdfExport.i18n.alias.php'; $wgSpecialPageGroups['PdfPrint'] = 'pagetools'; # Add special page. $wgSpecialPages['PdfPrint'] = 'SpecialPdf'; $wgAutoloadClasses['SpecialPdf'] = $dir . 'PdfExport_body.php'; $wgHooks['SkinTemplateBuildNavUrlsNav_urlsAfterPermalink'][] = 'wfSpecialPdfNav'; $wgHooks['SkinTemplateToolboxEnd'][] = 'wfSpecialPdfToolbox'; function wfSpecialPdfNav( &$skintemplate, &$nav_urls, &$oldid, &$revid ) { wfLoadExtensionMessages( 'PdfPrint' ); $nav_urls['pdfprint'] = array( 'text' => wfMsg( 'pdf_print_link' ), 'href' => $skintemplate->makeSpecialUrl( 'PdfPrint', "page=" . wfUrlencode( "{$skintemplate->thispage}" ) ) ); return true; } function wfSpecialPdfToolbox( &$monobook ) { wfLoadExtensionMessages( 'PdfPrint' ); if ( isset( $monobook->data['nav_urls']['pdfprint'] ) ) if ( $monobook->data['nav_urls']['pdfprint']['href'] == '' ) { ?><li id="t-ispdf"><?php echo $monobook->msg( 'pdf_print_link' ); ?></li><?php } else { ?><li id="t-pdf"><?php ?><a href="<?php echo htmlspecialchars( $monobook->data['nav_urls']['pdfprint']['href'] ) ?>"><?php echo $monobook->msg( 'pdf_print_link' ); ?></a><?php ?></li><?php } return true; } ?>
[edit] PdfExport_body.php
Put the following into $IP/extensions/PdfExport/PdfExport_body.php:
<?php // define maximum width of images if(!defined('MAX_IMAGE_WIDTH')) define("MAX_IMAGE_WIDTH", 670); if ( !defined( 'MEDIAWIKI' ) ) die(); global $wgPdfExportAttach, $wgPdfExportHttpsImages; $wgPdfExportAttach = false; // set to true if you want output as an attachment $wgPdfExportHttpsImages = false; // set to true if page is on a HTTPS server and contains images that are on the HTTPS server and also // reachable with HTTP class SpecialPdf extends SpecialPage { var $title; var $article; var $html; var $parserOptions; var $bhtml; public $iswindows; function SpecialPdf() { global $iswindows; SpecialPage::SpecialPage( 'PdfPrint' ); $os = getenv ("SERVER_SOFTWARE"); $iswindows = strstr ($os, "Win32"); } public function write1file ($text) { // make a temporary directory with an unique name // NOTE: If no PDF file is created and you get message "ERROR: No HTML files!", // try using a temporary directory that is within web server space. // For example (assuming the web server root directory is /var/www/html): // $mytemp = "/var/html/www/tmp/f" .time(). "-" .rand() . ".html"; global $wgTmpDirectory; $mytemp = $wgTmpDirectory . "/f" .time(). "-" .rand() . ".html"; $article_f = fopen($mytemp,'w'); if($article_f === FALSE) { error_log("Failed opening temporary HTML file to \"$mytemp\" failed", 0); return; } fwrite($article_f, $text); fclose($article_f); return $mytemp; } public function save1page ( $page ) { global $wgUser; global $wgParser; global $wgScriptPath; global $wgServer; global $wgPdfExportHttpsImages; $title = Title::newFromText( $page ); if( is_null( $title ) ) { return null; } if( !$title->userCanRead() ){ return null; } $article = new Article ($title); $parserOptions = ParserOptions::newFromUser( $wgUser ); $parserOptions->setEditSection( false ); $parserOptions->setTidy(true); $wgParser->mShowToc = false; $parserOutput = $wgParser->parse( $article->preSaveTransform( $article->getContent() ) ."\n\n", $title, $parserOptions ); $bhtml = $parserOutput->getText(); // XXX Hack to thread the EUR sign correctly $bhtml = str_replace(chr(0xE2) . chr(0x82) . chr(0xAC), chr(0xA4), $bhtml); $bhtml = utf8_decode($bhtml); $bhtml = str_replace ($wgScriptPath, $wgServer . $wgScriptPath, $bhtml); $bhtml = str_replace ('/w/',$wgServer . '/w/', $bhtml); // removed heights of images $bhtml = preg_replace ('/height="\d+"/', '', $bhtml); // set upper limit for width $bhtml = preg_replace ('/width="(\d+)"/e', '"width=\"".($1> MAX_IMAGE_WIDTH ? MAX_IMAGE_WIDTH : $1)."\""', $bhtml); if ($wgPdfExportHttpsImages) { $bhtm = str_replace('img src=\"https:\/\/','img src=\"http:\/\/', $bhtml); } $html = "<html><head><title>" . utf8_decode($page) . "</title></head><body>" . $bhtml . "</body></html>"; return $this->write1file ($html); } function outputpdf ($pages, $landscape, $size, $filename) { global $iswindows; global $wgPdfExportAttach; global $wgRequest; $returnStatus = 0; $pagestring = ""; $pagefiles = array(); $foundone = false; foreach ($pages as $pg) { $f = $this->save1page ($pg); if ($f == null) { continue; } $foundone = true; if ($iswindows) { $pagestring .= "\"" . $f . "\" "; } else { $pagestring .= $f . " "; } $pagefiles[] = $f; } if ($foundone == false) { return; } putenv("HTMLDOC_NOCGI=1"); # Write the content type to the client... header("Content-Type: application/pdf"); header(sprintf('Content-Disposition: attachment; filename="%s.pdf"', $wgRequest->getVal('page'))); # Run HTMLDOC to provide the PDF file to the user... passthru("htmldoc -t pdf14 --charset iso-8859-15 --color --quiet --jpeg --size " . $size . " " . $landscape . "--webpage " . $pagestring, $returnStatus); if($returnStatus == 1) { error_log("Generating PDF failed, check path to HTMLDoc, return status was:" . $returnStatus, 0); } flush(); foreach ($pagefiles as $pgf) { unlink ($pgf); } } function execute( $par ) { global $wgRequest; global $wgOut; wfLoadExtensionMessages ('PdfPrint'); $dopdf = false; if ($wgRequest->wasPosted()) { $pagel = $wgRequest->getText ('pagel'); $pages = array_filter( explode( "\n", $pagel ), 'wfFilterPage1' ); $filename = $wgRequest->getText ('filename'); $size = $wgRequest->getText ('Size', 'Letter'); $orientations = $wgRequest->getVal ('orientation'); if ($orientations == 'landscape') { $orientation = " --landscape --browserwidth 1200 "; } else { $orientation = " --portrait "; } $dopdf = true; } else { $page = isset( $par ) ? $par : $wgRequest->getText( 'page' ); if ($page != "") { $dopdf = true; } $pages = array ($page); $orientation = " --portrait "; $size = "Letter"; $filename = "wikiexport"; } if ($dopdf) { $wgOut->setPrintable(); $wgOut->disable(); $this->outputpdf ($pages, $orientation, $size, $filename); return; } $self = SpecialPage::getTitleFor( 'PdfPrint' ); $wgOut->addHtml( wfMsgExt( 'pdf_print_text', 'parse' ) ); $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $self->getLocalUrl( 'action=submit' ) ) ); $form .= Xml::openElement( 'textarea', array( 'name' => 'pagel', 'cols' => 40, 'rows' => 10 ) ); $form .= Xml::closeElement( 'textarea' ); $form .= '<br />'; $form .= Xml::radioLabel(wfMsg ('pdf_portrait'), 'orientation' , 'portrait' , 'portrait', true); $form .= Xml::radioLabel(wfMsg ('pdf_landscape'), 'orientation' , 'landscape' , 'landscape', false); $form .= '<br />' . wfMsg('pdf_size'); $form .= Xml::listDropDown ('Size', wfMsg ('pdf_size_options'),'', wfMsg('pdf_size_default')); // input field for name of PDF $form .= '<br />'; $form .= wfMsg ('pdf_filename').":"; $form .= Xml::openElement( 'input', array( 'type'=>'text', 'name' => 'filename', 'value' => 'print.pdf' ) ); $form .= Xml::closeElement( 'input' ); $form .= '<br />'; $form .= Xml::submitButton( wfMsg( 'pdf_submit' ) ); $form .= Xml::closeElement( 'form' ); $wgOut->addHtml( $form ); } } function wfFilterPage1( $page ) { return $page !== '' && $page !== null; } ?>
[edit] PdfExport.i18n.php
Put the following into $IP/extensions/PdfExport/PdfExport.i18n.php:
<?php /** * Internationalisation file for PdfExport extension. * * @addtogroup Extensions */ $messages = array(); $messages['de'] = array( 'pdfprint' => 'PDF-Druck' , 'pdf_print_link' => 'Als PDF ausgeben', 'pdf_print_text' => 'Gib eine Liste von einer oder mehr Seiten an (ein Seitenname pro Zeile)', 'pdf_submit' => 'PDF erstellen', 'pdf_portrait' => 'Hochformat', 'pdf_landscape' => 'Querformat', 'pdf_size' => 'Papiergröße', 'pdf_size_default' => 'A4', 'pdf_size_options' => 'A4 Letter Universal', 'pdf_filename' => 'Dateiname', ); $messages['de-formal'] = array( 'pdfprint' => 'PDF-Druck' , 'pdf_print_link' => 'Als PDF ausgeben', 'pdf_print_text' => 'Geben Sie eine Liste von einer oder mehr Seiten an (ein Seitenname pro Zeile)', 'pdf_submit' => 'PDF erstellen', 'pdf_portrait' => 'Hochformat', 'pdf_landscape' => 'Querformat', 'pdf_size' => 'Papiergröße', 'pdf_size_default' => 'A4', 'pdf_size_options' => 'A4 Letter Universal', 'pdf_filename' => 'Dateiname', ); $messages['en'] = array( 'pdfprint' => 'Pdf Export' , 'pdf_print_link' => 'Print as PDF', 'pdf_print_text' => 'Enter a list of one or more pages to export to PDF, one page name per line', 'pdf_submit' => 'Make PDF', 'pdf_portrait' => 'Portrait', 'pdf_landscape' => 'Landscape', 'pdf_size' => 'Paper Size', 'pdf_size_default' => 'Letter', 'pdf_size_options' => 'Letter A4 Universal', 'pdf_filename' => 'file name', ); $messages['es'] = array( 'pdfprint' => 'Imprimir PDF' , 'pdf_print_link' => 'Generar PDF', 'pdf_print_text' => 'Ingrese una lista de una o más páginas para exportar en PDF, escriba solo un nombre de página por linea.', 'pdf_submit' => 'Hacer PDF', 'pdf_portrait' => 'Portaretratos', 'pdf_landscape' => 'Paisaje', 'pdf_size' => 'Tamaño del papel: ', 'pdf_size_default' => 'Letter', 'pdf_size_options' => 'Letter A4 Universal' ); $messages['ca'] = array( 'pdfprint' => 'Imprimir PDF' , 'pdf_print_link' => 'Generar PDF', 'pdf_print_text' => 'Poseu una llista de pàgines per exportar a PDF, escriviu només un nom de pàgina per línia.', 'pdf_submit' => 'Fer PDF', 'pdf_portrait' => 'Portaretrats', 'pdf_landscape' => 'Apaïsat', 'pdf_size' => 'Mida del paper: ', 'pdf_size_default' => 'Letter', 'pdf_size_options' => 'Letter A4 Universal' ); $messages['fr'] = array( 'pdfprint' => 'PdfPrint' , 'pdf_print_link' => 'Imprimer en PDF', 'pdf_print_text' => 'Entrez une liste d\'une ou plusieurs pages à exporter en PDF, un nom de page par ligne', 'pdf_submit' => 'Transformer en PDF', 'pdf_portrait' => 'Portrait', 'pdf_landscape' => 'Paysage', 'pdf_size' => 'Papier', 'pdf_size_default' => 'A4', 'pdf_size_options' => 'Letter A4 Universal' ); $messages['it'] = array( 'pdfprint' => 'Pdf Export' , 'pdf_print_link' => 'Stampa come PDF', 'pdf_print_text' => 'Inserire un elenco di una o più pagine da esportare, un nome pagina per linea', 'pdf_submit' => 'Crea PDF', 'pdf_portrait' => 'Verticale', 'pdf_landscape' => 'Orizzontale', 'pdf_size' => 'Formato carta', 'pdf_size_default' => 'A4', 'pdf_size_options' => 'Letter A4 Universal' ); $messages['nl'] = array( 'pdfprint' => 'Pdf afdruk' , 'pdf_print_link' => 'Print als PDF', 'pdf_print_text' => 'Geef een lijst van een of meer paginas om naar PDF te exporteren, één paginanaam per regel', 'pdf_submit' => 'Creëer PDF', 'pdf_portrait' => 'Portret', 'pdf_landscape' => 'Landschap', 'pdf_size' => 'Papierafmetingen', 'pdf_size_default' => 'A4', 'pdf_size_options' => 'Letter A4 Universal', 'pdf_filename' => 'bestandsnaam', ); $messages['ksh'] = array( 'pdfprint' => 'Pdf Drokke' , 'pdf_print_link' => 'PDF ußjäve', 'pdf_print_text' => 'Enter a list of one or more pages to export to PDF, one page name per line', 'pdf_submit' => 'Make PDF', 'pdf_portrait' => 'Portrait', 'pdf_landscape' => 'Landscape', 'pdf_size' => 'Paper Size', 'pdf_size_default' => 'Letter', 'pdf_size_options' => 'Letter A4 Universal' ); $messages['nds'] = array( 'pdfprint' => 'Pdf-Drok' , 'pdf_print_link' => 'PDF utgeven', 'pdf_print_text' => 'Enter a list of one or more pages to export to PDF, one page name per line', 'pdf_submit' => 'Make PDF', 'pdf_portrait' => 'Portrait', 'pdf_landscape' => 'Landscape', 'pdf_size' => 'Paper Size', 'pdf_size_default' => 'Letter', 'pdf_size_options' => 'Letter A4 Universal' ); $messages['sv'] = array( 'pdfprint' => 'Pdf-export' , 'pdf_print_link' => 'Generera PDF', 'pdf_print_text' => 'Skriv in en lista med en eller flera sidor att exportera till PDF, ett sidnamn per rad', 'pdf_submit' => 'Skapa PDF', 'pdf_portrait' => 'Stående', 'pdf_landscape' => 'Liggande', 'pdf_size' => 'Pappersstorlek', 'pdf_size_default' => 'Brev', 'pdf_size_options' => 'Brev A4 Universell', 'pdf_filename' => 'Filnamn', ); $messages['tr'] = array( 'pdfprint' => 'Pdf Yazdir' , 'pdf_print_link' => 'PDF olarak yazdir', 'pdf_print_text' => 'Enter a list of one or more pages to export to PDF, one page name per line', 'pdf_submit' => 'Make PDF', 'pdf_portrait' => 'Portrait', 'pdf_landscape' => 'Landscape', 'pdf_size' => 'Paper Size', 'pdf_size_default' => 'Letter', 'pdf_size_options' => 'Letter A4 Universal' ); ?>
[edit] PdfExport.i18n.alias.php
Put the following into $IP/extensions/PdfExport/PdfExport.i18n.alias.php:
<?php /** * Aliases for Special:PdfExport * * @addtogroup Extensions * $aliases = array(); /** English */ $aliases['en'] = array( 'PdfPrint' => array( 'Pdfprint' ,'Pdf Export'), ); ?>