https://github.com/a5sys/pdfbundle
Bundle to integrate phpwkhtmltopdf with Symfony 2
https://github.com/a5sys/pdfbundle
Last synced: 27 days ago
JSON representation
Bundle to integrate phpwkhtmltopdf with Symfony 2
- Host: GitHub
- URL: https://github.com/a5sys/pdfbundle
- Owner: A5sys
- Created: 2016-02-22T15:38:38.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-07-28T15:34:43.000Z (almost 3 years ago)
- Last Synced: 2024-11-18T05:51:39.045Z (7 months ago)
- Language: PHP
- Size: 7.81 KB
- Stars: 2
- Watchers: 7
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
PdfBundle
=============
#### Goal
This bundle allows generation of pdf docs by using the wrapper **phpwkhtmltopdf**, which uses himself the tool **wkhtmltopdf**.The advantage of **wkhtmltopdf** is that it's Webkit processing html code, with JS and CSS functionnal, as if the code were ran in a browser.
####Why this bundle, KnpSnappyBundle already exist ?
KnpSnappyBundle does not work in all cases, particularly on Windows when generated HTML has external files (CSS, JS, images).
We hit some network access, because of the PHP proc_open function, which seems buggy.After a successful try with phpwkhtmltopdf, this bundle was created to integrate with Symfony 2.
#### dependencies
Requires **phpwkhtmltopdf** and **wkhtmltopdf**.## Installation
First install **wkhtmltopdf** (http://wkhtmltopdf.org/downloads.html)
Add dependencies in `composer.json` :
```json
"a5sys/pdf-bundle": "dev-master",
"mikehaertl/phpwkhtmltopdf": "~2.0"
```Declare bundle in `AppKernel.php` :
```php
new A5sys\PdfBundle\A5sysPdfBundle(),
```Note: the wrapper **phpwkhtmltopdf** is a library, not a bundle.
## Configuration
- Install wkhtmltopdf. Be sure not to have spaces in the path.
- Configure A5sys ProjectBundleIn **config.yml**, add :
```yaml
a5sys_pdf:
binary: "C:/wkhtmltopdf/bin/wkhtmltopdf.exe"
# temp_dir: "D:/tmp"
# encoding: "UTF-8"
# command_options:
# use_exec: true
# escape_args: false
# proc_options:
# bypass_shell: true
# suppress_errors: false
```- binary: mandatory
- temp_dir: optional, default system temp dir (C:/windows/temp).
- encoding: optional, default UTF-8
- command_options: optional, by default the array is created with the default children values
-- use_exec: optional, default true, does the system use exec function instead of proc_open ?
-- escape_args: optional, default false, does the system escape parameters before integrating it to the command ?
-- proc_options: optional, default NULL, used when use_exec = false
---- bypass_shell: optional, default true, adviced when on Windows
---- suppress_errors: default false. Adviced to TRUE when on Windows. Generation can be done ,even if error occired. NO GUARRANTY pdf is correctly generated.## Usage
Example given in a profession service.
\$this->templating is injected twig service.
\$this->pdfService is pdf service to be injected.*utf8_decode* for header et footer. Necessary to get accents.
```php
use A5sys\PdfBundle\Service\PdfService;class MyService
{
/**
* @var $data array
*/
public function savePdf($data)
{
// HTML of pdf
$html = $this->templating->render('MyAppBundle:Folder:my_pdf.pdf.twig', $data);// Header in HTML
$htmlHeader = $this->templating->render('MyAppBundle:Folder:my_header.pdf.twig');// Footer in HTML
$htmlFooter = $this->templating->render('MyAppBundle:Folder:my_footer.pdf.twig');// name and path to PDF file
$fileName = uniqid() . ".pdf";
$filePath = $this->constants['my_pdf_path'] . "/" . $fileName;// note : throws ServiceException
// Generation and saving of the PDF$options = array(
//'no-outline',
'orientation' => 'Landscape',
'header-html' => utf8_decode($htmlHeader),
'header-spacing' => '2', // space between header and content in mm
'footer-html' => utf8_decode($htmlFooter),
);$this->pdfService->saveAs(
$filePath,
$html,
$options
);
}
}
```To the 2015-02-10, only saveAs is implemented for the wrapper phpwkhtmltopdf.
## Options
Variable **\$options ** allows to specify options to use for the generation.
At the begining, informations from configuration will b integrated to this array. If you want to override the value of the conf, simply add the key of the wrapper **phpwkhtmltopdf** to the array.Specific **phpwkhtmltopdf** wrapper are here:
https://github.com/mikehaertl/phpwkhtmltopdf#special-global-optionsStill in **\$options**, at the same level than specific wrapper options, you can add all options you want to give to **wkhtmltopdf**, as for example orientation , header-spacing, header-html or footer-html like shown in the example.
All wkhtmltopdf options here :
http://wkhtmltopdf.org/usage/wkhtmltopdf.txt## Page break
In the example, \$html varaible contains all HTML to render in PDF. It is possible to tell explicitly where to page break, simply using CSS:`
`## Page numbers
In the footer-html of the example, no param is given, but wkhtmltopdf do it for us ! We can get the current page number and even more, for example with this code :
```html
function subst() {
var vars={};
var x=document.location.search.substring(1).split('&');
for (var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);}
var x=['frompage','topage','page','webpage','section','subsection','subsubsection'];
for (var i in x) {
var y = document.getElementsByClassName(x[i]);
for (var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]];
}
}
{{ 'now'|date('d/m/Y') }}
{{ 'pdf.archival.title'|trans|raw('html') }}
{{ 'page'|trans }} {{ 'pageOn'|trans }}
```
JS works ? Yes it's Webkit that process the page, even for header-html and footer-html
**Note** : Don't forget the doctype in footer and header, it won't work otherwise !
This HTML code displays the date to the left, a translated text in the center, and the text "page x sur y" to the right