1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
<?php
/* Icinga Web 2 | (c) 2013 Icinga Development Team | GPLv2+ */
namespace Icinga\File;
use Dompdf\Dompdf;
use Dompdf\Options;
use Icinga\Application\Icinga;
use Icinga\Exception\ProgrammingError;
use Icinga\Util\Environment;
use Icinga\Web\Hook;
use Icinga\Web\Url;
call_user_func(function () {
/**
* @package dompdf
* @link http://dompdf.github.com/
* @author Benj Carson <benjcarson@digitaljunkies.ca>
* @author Fabien Ménager <fabien.menager@gmail.com>
* @author Alexander A. Klimov <alexander.klimov@icinga.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
$baseDir = Icinga::app()->getBaseDir('library/vendor/dompdf');
require_once "$baseDir/vendor/autoload.php";
});
class Pdf
{
protected function assertNoHeadersSent()
{
if (headers_sent()) {
throw new ProgrammingError(
'Could not send pdf-response, content already written to output.'
);
}
}
public function renderControllerAction($controller)
{
$this->assertNoHeadersSent();
Environment::raiseMemoryLimit('512M');
Environment::raiseExecutionTime(300);
$viewRenderer = $controller->getHelper('viewRenderer');
$viewRenderer->postDispatch();
$layoutHelper = $controller->getHelper('layout');
$oldLayout = $layoutHelper->getLayout();
$layout = $layoutHelper->setLayout('pdf');
$layout->content = $controller->getResponse();
$html = $layout->render();
// Restore previous layout and reset content, to properly show errors
$controller->getResponse()->clearBody($viewRenderer->getResponseSegment());
$layoutHelper->setLayout($oldLayout);
$imgDir = Url::fromPath('img');
$html = preg_replace(
'~src="' . $imgDir . '/~',
'src="' . Icinga::app()->getBootstrapDirectory() . '/img/',
$html
);
$request = $controller->getRequest();
if (Hook::has('Pdfexport')) {
$pdfexport = Hook::first('Pdfexport');
$pdfexport->streamPdfFromHtml($html, sprintf(
'%s-%s-%d',
$request->getControllerName(),
$request->getActionName(),
time()
));
return;
}
$options = new Options();
$options->set('defaultPaperSize', 'A4');
$dompdf = new Dompdf($options);
$dompdf->loadHtml($html);
$dompdf->render();
$dompdf->stream(
sprintf(
'%s-%s-%d',
$request->getControllerName(),
$request->getActionName(),
time()
)
);
}
}
|