Last active
November 12, 2019 07:30
-
-
Save alex3305/c1f402602d810bc93c70 to your computer and use it in GitHub Desktop.
HTML to PDF converter with marginless cover page with Snappy and PDF Merge
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* PDF exporter for Mediawiki. This will load a specified content page and | |
* will append a seperate, specified cover page to the returning document. | |
* | |
* Requirements: | |
* - PHP 5.1+ | |
* - wkhtmltox (wkhtmltopdf) 0.12+ (http://www.wkhtmltopdf.org) | |
* - KnpLabs Snappy (https://github.com/KnpLabs/snappy/) | |
* - PDF Merger for PHP (http://pdfmerger.codeplex.com/) | |
* | |
* Input: | |
* @param page URLEncoded String Page to be loaded. | |
* | |
* @author Alex van den Hoogen | |
* @copyright (c) 2014, Alex van den Hoogen | |
*/ | |
/** Load Snappy, wkhtmltopdf and PDF Merger for PHP. */ | |
require_once 'PDFMerger.php'; | |
require_once 'autoload.php'; | |
use Knp\Snappy\Pdf; | |
$coverpage = new Pdf('/usr/local/bin/wkhtmltox/bin/wkhtmltopdf'); | |
$content = new Pdf('/usr/local/bin/wkhtmltox/bin/wkhtmltopdf'); | |
$pdf = new PDFMerger; | |
/** Parse GET input */ | |
$page = filter_input(INPUT_GET, 'page'); | |
if (empty($page)) { ?> | |
<DOCTYPE html> | |
<html> | |
<head> | |
<title>PDF downloader</title> | |
<meta name="googlebot" content="noarchive,nofollow,noindex,noodp,nosnippit"> | |
<meta name="robots" content="noarchive,nofollow,noindex,noodp,nosnippit"> | |
<style type="text/css"> | |
body {color: #000; background: #eee; font: 12pt Verdana, Arial, Helvetica, sans-serif; margin: 0 auto; padding: 0; text-align: center;} | |
#content {width: 500px; height: 300px; background: #fff; top: 50px; position: absolute; box-sizing: border-box; padding: 60px 30px; left: 50%; margin-left: -250px; box-shadow: 0 0 8px #888; border-radius: 4px;} | |
#content ul {list-style-type: none; margin: 0; padding: 0;} | |
#content li {margin: 20px 0;} | |
#content h1 {margin: 0; padding: 0;} | |
</style> | |
<script type="text/javascript"> | |
function viewPdf() { | |
var value = document.getElementById('document').value; | |
window.location.replace(document.URL + '?page=' + value); | |
} | |
</script> | |
</head> | |
<body> | |
<div id='content'> | |
<h1>Mediawiki download PDF</h1> | |
<ul> | |
<!-- You can add more items here. --> | |
<li><input type="text" name="document" id="document" placeholder="Name of wiki page" required> | |
<input type="button" name="view" id="view" value="Download page" onclick="viewPdf();"></li> | |
</ul> | |
</div> | |
</body> | |
</html> | |
<?php exit; } | |
/** Set headers */ | |
header('Content-Type: application/pdf'); | |
/** Set cover page and write to disk */ | |
$coverpage->setOption('no-background', false); | |
$coverpage->setOption('background', true); | |
$coverpage->setOption('disable-javascript', true); | |
$coverpage->setOption('print-media-type', false); | |
$coverpage->setOption('margin-bottom', 0); | |
$coverpage->setOption('margin-left', 0); | |
$coverpage->setOption('margin-right', 0); | |
$coverpage->setOption('margin-top', 0); | |
# The cover is just a simple HTML file with some PHP variables that are replaced by the title of the page. | |
$fp = fopen(getcwd() . '/cover.pdf', 'w'); | |
fwrite($fp, $coverpage->getOutput("pdf/cover.php?title=$page")); | |
fclose($fp); | |
/** Set content options and write to disk */ | |
# Set a custom cookie, so wkhtmltopdf can login to your wiki! Get this information from your browser. | |
$content->setOption('cookie', | |
array('WIKNAME_wikiToken' => '', | |
'WIKINAME_wikiUserID' => '', | |
'WIKINAME_wikiUserName' => '')); | |
$content->setOption('no-background', false); | |
$content->setOption('background', true); | |
$content->setOption('disable-javascript', false); | |
$content->setOption('print-media-type', true); | |
$content->setOption('margin-bottom', '2.54cm'); | |
$content->setOption('margin-left', '2.54cm'); | |
$content->setOption('margin-right', '2.54cm'); | |
$content->setOption('margin-top', '2.54cm'); | |
$content->setOption('header-spacing', '8'); | |
$content->setOption('footer-spacing', '8'); | |
$content->setOption('header-left', str_replace('_', " ", $page)); | |
$content->setOption('header-right', 'Author'); | |
$content->setOption('footer-left', 'Document'); | |
$content->setOption('footer-right', 'Page [page] / [topage]'); | |
$fp = fopen(getcwd() . '/content.pdf', 'w'); | |
fwrite($fp, $content->getOutput("http://YOURWIKI.EXAMPLE.COM/index.php/$page")); | |
fclose($fp); | |
/** Join both PDFs and export to browser. */ | |
$pdf->addPDF('cover.pdf', '1') | |
->addPDF('content.pdf', 'all') | |
->merge('browser', 'output.pdf'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment