From 770a2b83f040d2fef9dd431e4a2becefb26b11e0 Mon Sep 17 00:00:00 2001 From: yuri Date: Thu, 4 Feb 2016 17:29:21 +0200 Subject: [PATCH] Pdf service --- application/Espo/Core/Utils/Util.php | 7 +- application/Espo/EntryPoints/Pdf.php | 42 +-------- application/Espo/Services/Pdf.php | 123 +++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 43 deletions(-) create mode 100644 application/Espo/Services/Pdf.php diff --git a/application/Espo/Core/Utils/Util.php b/application/Espo/Core/Utils/Util.php index 6fc0c5bd4e..970c90658b 100644 --- a/application/Espo/Core/Utils/Util.php +++ b/application/Espo/Core/Utils/Util.php @@ -527,7 +527,10 @@ class Util return uniqid() . substr(md5(rand()), 0, 4); } + public static function sanitizeFileName($fileName) + { + return preg_replace("/([^\w\s\d\-_~,;:\[\]\(\).])/u", '_', $fileName); + } + } - -?> diff --git a/application/Espo/EntryPoints/Pdf.php b/application/Espo/EntryPoints/Pdf.php index 6a116f88c3..588f5b7b6c 100644 --- a/application/Espo/EntryPoints/Pdf.php +++ b/application/Espo/EntryPoints/Pdf.php @@ -32,8 +32,6 @@ namespace Espo\EntryPoints; use \Espo\Core\Exceptions\NotFound; use \Espo\Core\Exceptions\Forbidden; use \Espo\Core\Exceptions\BadRequest; -use \Espo\Core\Htmlizer\Htmlizer; - class Pdf extends \Espo\Core\EntryPoints\Base { @@ -52,49 +50,11 @@ class Pdf extends \Espo\Core\EntryPoints\Base $entity = $this->getEntityManager()->getEntity($entityType, $entityId); $template = $this->getEntityManager()->getEntity('Template', $templateId); - $this->getContainer()->get('serviceFactory')->create($entityType)->loadAdditionalFields($entity); - if (!$entity || !$template) { throw new NotFound(); } - if ($template->get('entityType') !== $entityType) { - throw new Forbidden(); - } - - if (!$this->getAcl()->check($entity, 'read') || !$this->getAcl()->check($template, 'read')) { - throw new Forbidden(); - } - - $fileName = $entity->get('name') . '.pdf'; - - $htmlizer = new Htmlizer($this->getFileManager(), $this->getDateTime(), $this->getNumber()); - - $pdf = new \Espo\Core\Pdf\Tcpdf(); - $pdf->setFont('freesans', '', 12, '', true); - $pdf->setPrintHeader(false); - - $pdf->setAutoPageBreak(true, $template->get('bottomMargin')); - $pdf->setMargins($template->get('leftMargin'), $template->get('topMargin'), $template->get('rightMargin')); - - - if ($template->get('printFooter')) { - $htmlFooter = $htmlizer->render($entity, $template->get('footer')); - $pdf->setFooterPosition($template->get('footerPosition')); - $pdf->setFooterHtml($htmlFooter); - } else { - $pdf->setPrintFooter(false); - } - - $pdf->addPage(); - - $htmlHeader = $htmlizer->render($entity, $template->get('header')); - $pdf->writeHTML($htmlHeader, true, false, true, false, ''); - - $htmlBody = $htmlizer->render($entity, $template->get('body')); - $pdf->writeHTML($htmlBody, true, false, true, false, ''); - - $pdf->output($fileName); + $this->getContainer()->get('serviceFactory')->create('Pdf')->buildFromTemplate($entity, $template, true); exit; } diff --git a/application/Espo/Services/Pdf.php b/application/Espo/Services/Pdf.php new file mode 100644 index 0000000000..893c638056 --- /dev/null +++ b/application/Espo/Services/Pdf.php @@ -0,0 +1,123 @@ +addDependency('fileManager'); + $this->addDependency('acl'); + $this->addDependency('metadata'); + $this->addDependency('serviceFactory'); + } + + protected function getAcl() + { + return $this->getInjection('acl'); + } + + protected function getMetadata() + { + return $this->getInjection('metadata'); + } + + protected function getServiceFactory() + { + return $this->getInjection('serviceFactory'); + } + + public function buildFromTemplate(Entity $entity, Entity $template, $displayInline = false) + { + $entityType = $entity->getEntityType(); + + $this->getServiceFactory()->create($entityType)->loadAdditionalFields($entity); + + if ($template->get('entityType') !== $entityType) { + throw new Forbidden(); + } + + if (!$this->getAcl()->check($entity, 'read') || !$this->getAcl()->check($template, 'read')) { + throw new Forbidden(); + } + + $htmlizer = new Htmlizer($this->getFileManager(), $this->getDateTime(), $this->getNumber()); + + $pdf = new \Espo\Core\Pdf\Tcpdf(); + + $pdf->setFont($this->fontFace, '', $this->fontSize, '', true); + $pdf->setPrintHeader(false); + + $pdf->setAutoPageBreak(true, $template->get('bottomMargin')); + $pdf->setMargins($template->get('leftMargin'), $template->get('topMargin'), $template->get('rightMargin')); + + + if ($template->get('printFooter')) { + $htmlFooter = $htmlizer->render($entity, $template->get('footer')); + $pdf->setFooterPosition($template->get('footerPosition')); + $pdf->setFooterHtml($htmlFooter); + } else { + $pdf->setPrintFooter(false); + } + + $pdf->addPage(); + + $htmlHeader = $htmlizer->render($entity, $template->get('header')); + $pdf->writeHTML($htmlHeader, true, false, true, false, ''); + + $htmlBody = $htmlizer->render($entity, $template->get('body')); + $pdf->writeHTML($htmlBody, true, false, true, false, ''); + + if ($displayInline) { + $name = $entity->get('name'); + $name = \Espo\Core\Utils::sanitizeFileName($name); + $fileName = $name . '.pdf'; + + $pdf->output($fileName, 'F'); + return; + } + + return $pdf->output('', 'S'); + } +} +