Extension:Pdf Export/Source Code

From MediaWiki.org

Jump to: navigation, search

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&ouml;&szlig;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&ouml;&szlig;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&aacute;s p&aacute;ginas para exportar en PDF, escriba solo un nombre de p&aacute;gina por linea.',
        'pdf_submit' => 'Hacer PDF',
        'pdf_portrait' => 'Portaretratos',
        'pdf_landscape' => 'Paisaje',
        'pdf_size' => 'Tama&ntilde;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&agrave;gines per exportar a PDF, escriviu nom&eacute;s un nom de p&agrave;gina per l&iacute;nia.',
        'pdf_submit' => 'Fer PDF',
        'pdf_portrait' => 'Portaretrats',
        'pdf_landscape' => 'Apa&iuml;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'),
);
?>