Create pdfs and images out of SilverStripe with WkHtmlToX. Based on WkHtmlToPdf and mikehaertl's php wrapper.
$ composer require grasenhiller/silverstripe-wkhtmltox
WKHtmlToPdf must be installed on your server to use this module. If it's not, you can try to use the provided binaries (v. 0.12.5). To do so, at first login via SSH and go into your home directory.
cd ~
mkdir ~/wkhtmltox
tar -xjvf vendor/grasenhiller/silverstripe-wkhtmltox/wkhtmltox_binaries.tar.bz2 -C ~/wkhtmltox
chmod 755 ~/wkhtmltox/wkhtmltopdf
chmod 755 ~/wkhtmltox/wkhtmltoimage
After this, if you're typing ./wkhtmltox/wkhtmltopdf -V
you should see the version number. Now it should work ;)
At last you need to provide the correct path to the binaries. Inside your .env
file, define these environment variables
SS_WKHTMLTOPDF_BINARY='/absolute/path/to/wkhtmltox/wkhtmltopdf'
SS_WKHTMLTOIMAGE_BINARY='/absolute/path/to/wkhtmltox/wkhtmltoimage'
To get the absolute path, go into our wkhtmltox directory and type pwd
;
cd ~/wkhtmltox/
pwd
You could define global proxy settings inside your .env
file
SS_PROXY="http://user:[email protected]:8080"
or without the need for authentication
SS_PROXY="http://192.168.1.2:8080"
You can define a different binary path for wkhtmltopdf and wkhtmtltoimage inside your .env
file
SS_WKHTMLTOPDF_BINARY='/path/to/wkhtmltopdf'
SS_WKHTMLTOIMAGE_BINARY='/path/to/wkhtmltoimage'
If you're working on a protected environment (dev?) and want to create pdfs or images from "locale" content, you need to define your BasicAuth credentials inside your .env
file
SS_WKHTMLTOX_USERNAME
SS_WKHTMLTOX_PASSWORD
Navigate to http://your-website.tld/gh-wkhtmltox/
TBD
These methods work with new WkPdf()
and new WkImage()
$pdf = new WkPdf();
$pdf->setFolder('folder/beneath/assets/to/save');
- $obj: The dataobject or page you want to render
- $variables: An array with extra data (optional)
- $template: The desired template (optional)
$pdf = new WkPdf();
$html = $pdf::get_html($obj, $variables = [], $template = '');
HTMLEditorFields normally don't store image links with absolute links. But WkHtmlToX needs absolute links to work. So just replace them with this method.
$pdf = new WkPdf();
$html = $pdf::get_html($obj);
$html = $pdf::replace_img_paths($html);
Get all options
$pdf = new WkPdf();
echo '<pre>';
print_r($pdf->getOptions());
echo '</pre>;
die();
Get a specific option
$pdf = new WkPdf();
echo $pdf->getOption('name_of_option');
die();
setOptions() setOption() removeOption() removeOptions()
private static $allowed_actions = [
'pdfExport',
];
public function pdfExport() {
$stylesheet = 'resources/vendor/grasenhiller/silverstripe-intranet-wiki/client/css/pdf.css';
$filter = URLSegmentFilter::create();
$filename = $filter->filter($this->MenuTitle);
$filename .= '__' . date('Y-m-d') . '.pdf';
$baseUrl = Director::absoluteBaseURL();
$pdf = new WkPdf();
$pdf->setOption('margin-top', 20);
$pdf->setOption('margin-bottom', 20);
$pdf->setOption('margin-left', 15);
$pdf->setOption('margin-right', 15);
$pdf->setOption('user-style-sheet', $stylesheet);
$pdf->setOption('header-html', $baseUrl . 'gh-wkhtmltox/header?template=Grasenhiller\Intranet\Wiki\Pages\Pdf\Header');
$pdf->setOption('footer-html', $baseUrl . 'gh-wkhtmltox/footer?template=Grasenhiller\Intranet\Wiki\Pages\Pdf\Footer');
$pdf->setOption('header-spacing', 5);
$pdf->setOption('footer-spacing', 5);
$html = $pdf::get_html($this);
$pdf->add($html);
$pdf->download($filename);
}
gh-wkhtmltox/header gh-wkhtmltox/footer $all_variables + variables from docs
viewport-size zoom 1.045 window-status h1 { page-break-before: always; }
px & dpi
add() construct
add() construct
preview() download() save() getAsString()
- docs
- demo
- header + hook
- footer + hook
- pdf global
- pdf "pages" predefined + custom
- image global + custom
- bypass_proxy_for_own_site
html!
- Set Options setz mehrere optionen + set / get global options
- Statische Links ersetzen bei get_html (als Option)
- Stylesheets (user-style-sheet)
- Kommentare durchgehen
- README!
- IDE Annotation
- Header / Footer can't be loaded