From 7dd780ef03af754d44274abd4f3bb7eb9236dd32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Lelis=20de=20Vietro?= Date: Mon, 3 Feb 2014 16:24:26 -0300 Subject: [PATCH 1/2] Adicionando suporte a streaming --- .../SimpleReport/Renderer/WkPdfRenderer.php | 69 ++++++++++++------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php b/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php index b62f40d..7d8b852 100755 --- a/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php +++ b/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php @@ -18,11 +18,13 @@ namespace Umbrella\SimpleReport\Renderer; +use DateTime; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; +use Symfony\Component\HttpFoundation\StreamedResponse; use Umbrella\SimpleReport\Api\IDatasource; use Umbrella\SimpleReport\Api\ITemplate; use Umbrella\SimpleReport\BaseRenderer; use Umbrella\SimpleReport\Parser\TemplateParser; -use Symfony\Component\HttpFoundation\StreamedResponse; /** * Classe utilizada para gerar relatórios em PDF com o wkhtmltopdf @@ -46,10 +48,15 @@ class WkPdfRenderer extends BaseRenderer */ private $parser; + /** + * @var boolean + */ + private $isStreaming = false; + /** * Inicializa uma nova instancia da classe WkPdfRenderer - * @param \Umbrella\SimpleReport\Api\IDatasource $datasource Uma instância de IDatasource - * @param \Umbrella\SimpleReport\Api\ITemplate $template Uma instância de ITemplate + * @param IDatasource $datasource Uma instância de IDatasource + * @param ITemplate $template Uma instância de ITemplate */ public function __construct(IDatasource $datasource, ITemplate $template) { @@ -73,16 +80,42 @@ public function setOutput($output) return $this; } + public function isStreaming() + { + return $this->isStreaming; + } + + public function setStreaming($isStreaming) + { + $this->isStreaming = $isStreaming; + return $this; + } + public function render() { $htmlFile = $this->getHtmlPageContent(); - $response = new StreamedResponse(); - $response->setCallback(function () use($htmlFile) { + + if ($this->isStreaming()) { + $response = new StreamedResponse(); + + ob_start(); + $self = $this; + $response->setCallback(function () use($htmlFile, $self) { + dump('lol'); + $self->renderPdf($htmlFile); + ob_flush(); + flush(); + }); + } else { + $response = new \Symfony\Component\HttpFoundation\Response(); $this->renderPdf($htmlFile); - ob_flush(); - flush(); - }); + } + + $d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_INLINE, md5($this->output)); + $response->headers->set('Content-Disposition', $d); + $response->headers->set('Content-type', 'application/pdf'); $response->send(); + return $this; } @@ -99,7 +132,6 @@ protected function getHtmlPageContent() ), $this->template->getTags()) ); $content = $this->parser->parse(); - file_put_contents($filename, $content); ob_end_clean(); @@ -108,11 +140,11 @@ protected function getHtmlPageContent() protected function createDate() { - $date = new \DateTime(); + $date = new DateTime(); return $date->format('d/m/Y'); } - protected function renderPdf($htmlFile) + public function renderPdf($htmlFile) { \wkhtmltox_convert('pdf', array( 'out' => $this->output, @@ -125,6 +157,7 @@ protected function renderPdf($htmlFile) $this->setPermissions($htmlFile, $this->output); $this->unlinkFile($htmlFile); + readfile($this->output); } /** @@ -143,18 +176,4 @@ public function unlinkFile($file) unlink($file); } - /** - * Envia os headersde pdf para o browser - * @param boolean $attachment Se o pdf será exibido no browser ou baixado pelo usuário - */ - public function send($attachment = true) - { - $type = $attachment ? 'attachment' : 'inline'; - header('Content-type: application/pdf'); - header('Content-Disposition: ' . $type . '; filename="' . md5($this->output) . '.pdf"'); - readfile($this->output); - - $this->unlinkFile($this->output); - } - } From 794f8502e82b625bd5175da6bdb0462da36d2b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Lelis=20de=20Vietro?= Date: Mon, 3 Feb 2014 16:58:54 -0300 Subject: [PATCH 2/2] Adicionando suporte a streaming --- .../SimpleReport/Renderer/WkPdfRenderer.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php b/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php index 7d8b852..a49db0f 100755 --- a/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php +++ b/src/Umbrella/SimpleReport/Renderer/WkPdfRenderer.php @@ -53,6 +53,11 @@ class WkPdfRenderer extends BaseRenderer */ private $isStreaming = false; + /** + * @var int + */ + private $length = 0; + /** * Inicializa uma nova instancia da classe WkPdfRenderer * @param IDatasource $datasource Uma instância de IDatasource @@ -94,14 +99,13 @@ public function setStreaming($isStreaming) public function render() { $htmlFile = $this->getHtmlPageContent(); - if ($this->isStreaming()) { $response = new StreamedResponse(); ob_start(); $self = $this; - $response->setCallback(function () use($htmlFile, $self) { - dump('lol'); + + $response->setCallback(function () use($htmlFile, $self, &$lenght) { $self->renderPdf($htmlFile); ob_flush(); flush(); @@ -114,6 +118,10 @@ public function render() $d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_INLINE, md5($this->output)); $response->headers->set('Content-Disposition', $d); $response->headers->set('Content-type', 'application/pdf'); + $response->headers->set('Cache-Control', 'max-age=0, must-revalidate'); + $response->headers->set('Pragma', 'public'); + ini_set('zlib.output_compression', '0'); + $response->send(); return $this; @@ -157,7 +165,7 @@ public function renderPdf($htmlFile) $this->setPermissions($htmlFile, $this->output); $this->unlinkFile($htmlFile); - readfile($this->output); + $this->length = readfile($this->output); } /**