/** * {@inheritdoc} */ public function createDocument(array $options = []) { $document = new PdfDocument(); $params = $this->params; $request = $this->requestStack->getCurrentRequest(); $document->setOptions($this->getWkHtmlToPdfOptions($request->getUri(), $params['pdf_wkhtmltopdf_bin'])); $document->outputSelector(function () use($request) { return $request->query->get('do'); }); $head = $document->element('head'); $bootstrap = new HtmlElement('link'); $bootstrap->attr('rel', 'stylesheet'); $bootstrap->attr('type', 'text/css'); $bootstrap->attr('href', $request->getSchemeAndHttpHost() . $this->appPaths->url("web") . '/pdf/css/bootstrap.min.css'); $bootstrap->insertTo($head); $style = new HtmlElement('link'); $style->attr('rel', 'stylesheet'); $style->attr('type', 'text/css'); $style->attr('href', $request->getSchemeAndHttpHost() . $this->appPaths->url("web") . '/pdf/css/pdf.css'); $style->insertTo($head); $filename = $this->appPaths->getRootDir() . '/../pdf/' . $request->getPathInfo(); $dir = dirname($filename); if (!is_dir($dir)) { mkdir($dir, 0755, true); } $document->setFilename($filename); return $document; }
public function testTest() { $doc = new PdfDocument(); $doc->title('Sample Page'); $doc->body(file_get_contents(__DIR__ . '/tmp/pdf.html')); $head = $doc->element('head'); $bootstrap = new HtmlElement('link'); $bootstrap->attr('rel', 'stylesheet'); $bootstrap->attr('type', 'text/css'); $bootstrap->attr('href', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css'); $bootstrap->insertTo($head); $style = new HtmlElement('style'); $style->text(file_get_contents(__DIR__ . '/tmp/pdf.css')); $style->attr('type', 'text/css'); $style->insertTo($head); $now = new DateTime(); $doc->lastModified($now->format('Y-m-d H:i:s')); $doc->setOptions(array('dummy_pdf_url' => 'empty.pdf', 'display_url' => 'test.pdf', 'download_url' => 'test.pdf', 'remote_url' => 'http://www.foo.bar/test.pdf', "pluginDetect_PDFReader_url" => "/pdf/PluginDetect_PDFReader.js", "waiting_view_path" => __DIR__ . '/tmp/waiting-view.html', "queue_db_path" => __DIR__ . '/tmp/pdf-queue.db', "wkhtmltopdf_global" => array("binary" => "wkhtmltopdf"))); $doc->outputSelector(function () { return isset($_GET['do']) ? $_GET['do'] : null; }); $doc->setFilename(__DIR__ . '/tmp/cache/test.pdf'); $doc->toc(true, __DIR__ . '/tmp/toc.xsl'); $doc->addCover('start', 'http://www.loremipsum.net'); $doc->addCover('end', 'http://www.loremipsum.net'); var_dump($doc->render()); }
/** * {@inheritdoc} */ public function render() { $output = preg_match('/^<!DOCTYPE\\s.*>$/', trim($this->doctype->render())) ? trim($this->doctype->render()) . PHP_EOL : '<!DOCTYPE html>' . PHP_EOL; preg_match('/<html.*?>/', $this->html->render(), $result); $output .= isset($result[0]) ? $result[0] . PHP_EOL : '<html>' . PHP_EOL; $output .= substr($this->head->render(), 0, -7); $favicon = $this->favicon->render(); if (!empty($favicon)) { $output .= $favicon . PHP_EOL; } if ($this->styleSheet->length()) { $output .= $this->styleSheet->render('html') . PHP_EOL; } if ($this->javaScript->length()) { $tmp = call_user_func($this->scriptOutput, $this->javaScript, $this->translations); if (!empty($tmp)) { $output .= $tmp . PHP_EOL; } } if (!$this->script->isEmpty()) { $output .= '<script type="text/javascript">' . $this->script->render() . '</script>' . PHP_EOL; } $output .= $this->customHeadCode; $output .= '</head>' . PHP_EOL; $bodyEndPos = strrpos($this->body, "</body>"); if ($bodyEndPos !== false) { $output .= substr($this->body, 0, $bodyEndPos); $output .= $this->customBottomCode . '</body>'; } else { $output .= $this->body; } $output .= '</html>'; return $output; }
/** * {@inheritdoc} */ public function render() { $output = $this->prologRender(); preg_match('/<' . $this->root->name() . '.*?>/', $this->root->render(false, true), $result); $output .= isset($result[0]) ? str_replace(array("/>", " />"), ">", $result[0]) . PHP_EOL : '<' . $this->root->name() . '>' . PHP_EOL; $output .= $this->body; $output .= '</' . $this->root->name() . '>'; return $output; }
/** * Kod źródłowy w formacie HTML * * @param StyleSheetResource $res * @param string $output */ protected function render_html(StyleSheetResource $res, &$output) { foreach ($res->getUrl() as $url) { $tag = new HtmlElement('link'); $tag->attr('href', $url); $tag->attr('rel', 'stylesheet'); $tag->attr('type', 'text/css'); $output .= $tag->render(); $tag->destroy($tag); } }
/** * Filtr na prawidłową datę. * * @param HtmlElement $htmlElement * @param string $text * * @throws \UnexpectedValueException */ private function filterDate(HtmlElement $htmlElement, $text) { $date = \DateTime::createFromFormat(\DateTime::ATOM, $text); if ($date === false) { throw new \UnexpectedValueException("Invalid ATOM date format. Must be: " . \DateTime::ATOM); } $htmlElement->text($date->format(\DateTime::ATOM)); }
/** * {@inheritdoc } */ public function render() { $this->optionsTest(); $exists = file_exists($this->filename); $pdfDate = new \DateTime(); $pdfDate->setTimestamp($exists ? filemtime($this->filename) : 0); // generowanie pliku jeśli nie ma lub jest przestarzały if (!$exists || $this->lastModified() > $pdfDate) { $html = parent::render(); if (isset($this->covers['start'])) { $this->wkhtmltopdf->addCover($this->covers['start']['url'], $this->covers['start']['options']); } if ($this->useToc) { $this->wkhtmltopdf->addToc($this->options['wkhtmltopdf_toc']); } $this->wkhtmltopdf->addPage($html, $this->options['wkhtmltopdf_page']); if (isset($this->covers['end'])) { $this->wkhtmltopdf->addCover($this->covers['end']['url'], $this->covers['end']['options']); } if (!$this->wkhtmltopdf->saveAs($this->filename)) { //throw new \Exception('Could not create PDF: ' . $this->wkhtmltopdf->getError()); file_put_contents($this->getFilenameToHtml(), $html); $this->queue->beginTransaction(); if ($this->queue->select($this->getFilename()) == false) { $this->queue->insert($this->getFilename(), array('date_added' => time(), 'block' => 0, 'html_file' => $this->getFilenameToHtml())); } $this->queue->endTransaction(); return $this->waitingView(); } } switch (call_user_func($this->outputSelector)) { case 'download': $this->download(); return ''; case 'display': $this->display(); return ''; } $viewer = new HtmlDocument(); $viewer->name($this->name()); $viewer->title($this->title(), HtmlDocument::TITLE_ONLY_TITLE); $viewer->author($this->author()); $viewer->authorUrl($this->authorUrl()); $viewer->keywords($this->keywords()); $viewer->description($this->description()); $pdfDetect = str_replace(array('{dummy_pdf}', '{url_download}', '{url_display}', '{url_remote}'), array($this->options['dummy_pdf_url'], $this->options['download_url'], $this->options['display_url'], $this->options['remote_url']), base64_decode('PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KKGZ1bmN0aW9uKCl7DQogICAgInVzZSBzdHJpY3QiOw0KDQogICAgdmFyIER1bW15UERGID0gJ3tkdW1teV9wZGZ9JywNCiAgICAgICAgZGV0ZWN0Tm9uQWRvYmVJRSA9IDEsDQogICAgICAgIHZpZXdlciA9ICc8aWZyYW1lIHNyYz0iaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vdmlld2VyP2VtYmVkZGVkPXRydWUmYW1wO3VybD17dXJsX3JlbW90ZX0iIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBmcmFtZWJvcmRlcj0iMCIgc3R5bGU9ImJvcmRlcjogbm9uZTsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7IHBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OiAwcHg7IHRvcDogMHB4OyI+PC9pZnJhbWU+JzsNCgkJdmlld2VyICs9ICc8YSBocmVmPSJ7dXJsX2Rvd25sb2FkfSI+PGltZyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmdBQUFBWUNBWUFBQURnZHozNEFBQUFqa2xFUVZSNG5PMlZYUXFBUUFpRTNlaUtkZitMOVBOUWtwRG1xR3dRTk5EYk9GL3ExaEoxVmdNOFc2Vit3TjhscHgvZ1NsdlMwMUxEZVZvSGN5SjRqZFpOZEhTQ1BNdnBEd3VCcE1NUlNDbWNReXlJREpmZVVMZ0YwY0poaURVT0NiSENYWWkzVUlhZ1hpSzZQZ3gwaGkzb0RSVmtoRndIZFVMWERyci9UVWRKSytUd0ZHNkg1cFg3NE5zNzJBRll3VnJBemNhS1BnQUFBQUJKUlU1RXJrSmdnZz09IiBhbHQ9IkRvd25sb2FkIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGJvcmRlcj0iMCIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OiAxNXB4OyB0b3A6IDVweDsiIC8+PC9hPic7DQogICAgUGx1Z2luRGV0ZWN0Lm9uRGV0ZWN0aW9uRG9uZSgnUERGUmVhZGVyJywgZnVuY3Rpb24gKCQkKSB7DQogICAgICAgIHZhciBzdGF0dXMgPSAkJC5pc01pblZlcnNpb24oJ1BERlJlYWRlcicsIDApOw0KICAgICAgICBpZiAoc3RhdHVzID49IC0wLjE1KSB7DQogICAgICAgICAgICBkb2N1bWVudC5sb2NhdGlvbiA9ICd7dXJsX2Rpc3BsYXl9JzsNCiAgICAgICAgfSBlbHNlIHsNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3ZXInKS5pbm5lckhUTUwgPSB2aWV3ZXI7DQoJCX0NCiAgICB9LCBEdW1teVBERiwgZGV0ZWN0Tm9uQWRvYmVJRSk7DQp9KCkpOw0KPC9zY3JpcHQ+CQ==')); $viewer->body('<body><div id="viewer"><p style="text-align: center;"><a href="' . $this->options['download_url'] . '" title="Download PDF"><img src="data:image/png;base64,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" width="128" height="128" alt="click here to download" /></a></p></div> <noscript><meta http-equiv="Refresh" content="0; url=' . $this->options['download_url'] . '" /></noscript>' . $pdfDetect . '</body>'); $head = $viewer->element('head'); $script = new HtmlElement('script'); $script->attr('type', 'text/javascript'); $script->attr('src', $this->options['pluginDetect_PDFReader_url']); $script->insertTo($head); $style = new HtmlElement('style'); $style->text('body {margin: 0; padding: 0; overflow: hidden;}'); $style->attr('type', 'text/css'); $style->insertTo($head); $link = new HtmlElement('link'); $link->attr('href', $this->options['download_url'])->attr('rel', 'alternate')->attr('type', 'application/pdf')->attr('title', $this->title())->attr('media', 'print')->insertTo($head); return $viewer->render(); }
/** * wstaw element obecny element do innego elementu * * @param HtmlElement $element * @param int $where * * @throws \RuntimeException */ public function insertTo(HtmlElement $element, $where = self::CHILD_APPEND) { if ($this->element === $element->getElement()) { throw new \RuntimeException('You can not insert the Element into a self.'); } switch ($where) { case self::CHILD_APPEND: $element->getElement()->appendChild($this->element); break; case self::CHILD_PREPEND: $element->getElement()->insertBefore($this->element, $element->getElement()->childNodes->item(0)); break; } }
/** * test wstawiania elementu do elementu */ public function insertTest() { $script = new HtmlElement('script'); $head = new HtmlElement('head'); $script->insertTo($head); $this->assertEquals(1, $head->xpath('script')->length); $script = new HtmlElement('script'); $head->insert($script); $this->assertEquals(2, $head->xpath('script')->length); }
/** * Kod znacznika <picture> * * @param ImageResource $res * @param string $output */ protected function render_html_picture(ImageResource $res, &$output) { $data = $res->imageData(); $tmp = ''; $source = function (array &$arr) use(&$data, &$tmp) { $tag = new HtmlElement('source'); $srcset = ''; foreach ($arr as &$img) { $srcset .= $img['url']; $srcset .= !empty($img['data']['srcset_x']) ? ' ' . $img['data']['srcset_x'] . 'x' : ''; $srcset .= ', '; } $tag->attr('srcset', substr($srcset, 0, -2)); $index = $arr[0]['data']['media_index']; if (isset($data['media'][$index])) { $tag->attr('media', $data['media'][$index]); } $tmp .= $tag->render() . PHP_EOL; $tag->destroy($tag); }; foreach ($data as $k => $v) { if (is_integer($k) && $k > -1 && is_array($v)) { $source($data[$k]); } } if (isset($data[-1])) { $source($data[-1]); } $urls = $res->getUrl(); $img = new HtmlElement('img'); $img->attr('src', $urls[$data['src-index']]); $img->attr('alt', htmlspecialchars($res->getName())); $tag = new HtmlElement('picture'); //$tag->attr('alt', htmlspecialchars($res->getName())); foreach ($data['attr'] as $k => $v) { $tag->attr(htmlspecialchars($k), htmlspecialchars($v)); } preg_match('/<picture.*?>/', $tag->render(), $result); $output[] = (isset($result[0]) ? $result[0] . PHP_EOL : '<picture>' . PHP_EOL) . "<!--[if IE 9]><video style=\"display: none;\"><![endif]-->" . PHP_EOL . str_replace("</source>", '', $tmp) . "<!--[if IE 9]></video><![endif]-->" . PHP_EOL . $img->render() . PHP_EOL . '</picture>'; $tag->destroy($tag); $img->destroy($img); }
/** * Kod źródłowy w formacie HTML * * @param JavaScriptResource $res * @param string $output */ protected function render_html(JavaScriptResource $res, &$output) { foreach ($res->getUrl() as $url) { $tag = new HtmlElement('script'); $tag->attr('src', $url); $tag->attr('type', 'text/javascript'); $output .= $tag->render(); $tag->destroy($tag); } }