Difference between revisions of "Extension:PdfBook"

From Organic Design wiki
m (redo the main book-construction code)
(Other free PDF libraries)
 
(24 intermediate revisions by the same user not shown)
Line 1: Line 1:
<?php
+
{{svn|http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/PdfBook}}
# Extension:PdfBook{{Category:Extensions|PdfBook}}{{php}}{{Category:Extensions created with Template:Extension}}
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Author: [http://www.organicdesign.co.nz/nad User:Nad]
 
# - Started: 2007-08-08
 
  
if (!defined('MEDIAWIKI')) die('Not an entry point.');
+
== Other free PDF libraries ==
 
+
*[http://www.tcpdf.org/ TCPDF]
define('PDFBOOK_VERSION','0.0.0, 2007-08-08');
+
*[http://www.mpdf1.com mPDF]
 
 
$wgPdfBookMagic                = "book";
 
$wgExtensionFunctions[]        = 'wfSetupPdfBook';
 
$wgHooks['LanguageGetMagic'][] = 'wfPdfBookLanguageGetMagic';
 
 
 
$wgExtensionCredits['parserhook'][] = array(
 
'name'        => 'Pdf Book',
 
'author'      => '[http://www.organicdesign.co.nz/nad User:Nad]',
 
'description' => 'Composes a book from articles in a category and exports as a PDF book',
 
'url'        => 'http://www.mediawiki.org/wiki/Extension:Pdf_Book',
 
'version'    => PDFBOOK_VERSION
 
);
 
 
 
class PdfBook {
 
 
 
# Constructor
 
function PdfBook() {
 
global $wgHooks,$wgParser,$wgPdfBookMagic;
 
$wgParser->setFunctionHook($wgPdfBookMagic,array($this,'magicBook'));
 
$wgHooks['UnknownAction'][] = $this;
 
 
 
# Add a new pdf log type
 
global $wgLogTypes,$wgLogNames,$wgLogHeaders,$wgLogActions;
 
$wgLogTypes[]            = 'pdf';
 
$wgLogNames  ['pdf']      = 'pdflogpage';
 
$wgLogHeaders['pdf']      = 'pdflogpagetext';
 
$wgLogActions['pdf/book'] = 'pdflogentry';
 
}
 
 
 
# Expand the book-magic
 
function magicBook(&$parser) {
 
 
 
# Populate $argv with both named and numeric parameters
 
$argv = array();
 
foreach (func_get_args() as $arg) if (!is_object($arg)) {
 
if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $argv[$match[1]] = $match[2]; else $argv[] = $arg;
 
}
 
 
 
# Return result with available parser flags
 
return array(
 
$text,
 
found  => true,
 
nowiki  => false,
 
noparse => false,
 
noargs  => false,
 
isHTML  => false
 
);
 
}
 
 
 
function onUnknownAction($action,$article) {
 
global $wgOut,$wgUser,$wgTitle,$wgParser,$wgArticlePath,$wgScriptPath,$wgUploadPath,$wgScript;
 
if($action == 'pdfbook') {
 
 
 
# Log the export
 
$msg = $wgUser->getUserPage()->getPrefixedText().' exported as a PDF book';
 
$log = new LogPage('pdf',false);
 
$log->addEntry('book',$wgTitle,$msg);
 
 
 
# Initialise PDF variables
 
$layout = '--firstpage toc';
 
if (!xwGetProperty($properties,'pdf/left-margin',$left))    $left  = '1cm';
 
if (!xwGetProperty($properties,'pdf/right-margin',$right))  $right  = '1cm';
 
if (!xwGetProperty($properties,'pdf/top-margin',$top))      $top    = '1cm';
 
if (!xwGetProperty($properties,'pdf/bottom-margin',$bottom)) $bottom = '5mm';
 
if (!xwGetProperty($properties,'pdf/font-name',$font))      $font  = 'Arial';
 
if (!xwGetProperty($properties,'pdf/font-size',$size))      $size  = '8';
 
if (!xwGetProperty($properties,'pdf/links',$links))          $links  = '217A28';
 
if (!xwGetProperty($properties,'pdf/toc-levels',$levels))    $levels = '2';
 
if (xwGetProperty($properties,'pdf/exclude',$exclude))      $exclude = split('\\s*,\\s*',$exclude); else $exclude = array();
 
 
# Select all article titles in category
 
$cat    = $article->getTitle()->getText();
 
$db    = &wfGetDB(DB_SLAVE);
 
$cl    = $db->tableName('categorylinks');
 
$result = $db->query("SELECT cl_from FROM $cl WHERE cl_to = '$cat' ORDER BY cl_sortkey");
 
# Format the article's as a single HTML document with absolute URL's
 
$html = '';
 
while ($row = mysql_fetch_row($result)) {
 
$title = Title::newFromID($row[0]);
 
$ttext = $title->getPrefixedText();
 
if (!in_array($ttext,$exclude)) {
 
$tmp          = array($wgArticlePath,$wgScriptPath,$wgScript);
 
$wgArticlePath = $wgServer.$wgArticlePath;
 
$wgScriptPath  = $wgServer.$wgScriptPath;
 
$wgScript      = $wgServer.$wgScript;
 
$article      = new Article($title);
 
$text          = $article->getContent();
 
$opt          = new ParserOptions;
 
$opt->setRemoveComments(false); # allow HTML comments
 
$opt->setEditSection(false);    # remove section-edit links
 
$wgOut->setHTMLTitle($ttext);  # use this so DISPLAYTITLE magic works
 
$out          = $wgParser->parse($text,$title,$opt,true,true);
 
$ttext        = $wgOut->getHTMLTitle();
 
$html        .= "<h1>$ttext</h1>".$out->getText()."\n";
 
list($wgArticlePath,$wgScriptPath,$wgScript) = $tmp;
 
}
 
}
 
 
 
# Write the HTML to a tmp file
 
$file = "$wgUploadPath/".uniqid('pdf-book');
 
$fh = fopen($file,'w+');
 
fwrite($fh,$html);
 
fclose($fh);
 
 
 
# Send the file to the client via htmldoc converter
 
while (@ob_end_clean());
 
header("Content-Type: application/pdf");
 
header("Content-Disposition: attachment; filename=\"$file\"");
 
flush();
 
passthru("htmldoc -t pdf --left $left --right $right --top $top --bottom $bottom --header ... --footer .1. --headfootsize 8 --quiet --jpeg --color --bodyfont $font --fontsize $size --linkstyle plain --linkcolor $links --toclevels $levels --format pdf14 --numbered $layout $file");
 
@unlink($file);
 
die;
 
}
 
}
 
 
 
# Needed in some versions to prevent Special:Version from breaking
 
function __toString() { return 'PdfBook'; }
 
}
 
 
 
# Called from $wgExtensionFunctions array when initialising extensions
 
function wfSetupPdfBook() {
 
global $wgPdfBook;
 
$wgPdfBook = new PdfBook();
 
}
 
 
 
# Needed in MediaWiki >1.8.0 for magic word hooks to work properly
 
function wfPdfBookLanguageGetMagic(&$magicWords,$langCode = 0) {
 
global $wgPdfBookMagic;
 
$magicWords[$wgPdfBookMagic] = array(0,$wgPdfBookMagic);
 
return true;
 
}
 
 
 
?>
 

Latest revision as of 13:13, 17 June 2014

Info.svg This code is in our Git repository here.

Note: If there is no information in this page about this code and it's a MediaWiki extension, there may be something at mediawiki.org.

Other free PDF libraries