diff --git a/src/Invoice/Renderer/DocxRenderer.php b/src/Invoice/Renderer/DocxRenderer.php index 7fbdf519..8ed22f3a 100644 --- a/src/Invoice/Renderer/DocxRenderer.php +++ b/src/Invoice/Renderer/DocxRenderer.php @@ -12,33 +12,13 @@ namespace App\Invoice\Renderer; use App\Entity\InvoiceDocument; use App\Invoice\RendererInterface; use App\Model\InvoiceModel; -use PhpOffice\PhpWord\PhpWord; +use PhpOffice\PhpWord\Escaper\Xml; use PhpOffice\PhpWord\TemplateProcessor; use Symfony\Component\HttpFoundation\File\Stream; use Symfony\Component\HttpFoundation\Response; class DocxRenderer extends AbstractRenderer implements RendererInterface { - /* - protected function setPhpWordOptions(PhpWord $phpWord) - { - if (!extension_loaded('zip')) { - \PhpOffice\PhpWord\Settings::setZipClass(\PhpOffice\PhpWord\Settings::PCLZIP); - } - - // \PhpOffice\PhpWord\Settings::setPdfRendererPath(__DIR__ . '/../../vendor/tecnickcom/tcpdf/'); - // \PhpOffice\PhpWord\Settings::setPdfRendererName(\PhpOffice\PhpWord\Settings::PDF_RENDERER_TCPDF); - // \PhpOffice\PhpWord\Settings::setOutputEscapingEnabled(true); - // $phpWord->getSettings()->setThemeFontLang(new Language(Language::EN_US)); - - $properties = $phpWord->getDocInfo(); - $properties->setCreator('Kimai 2'); - $properties->setDescription('Created with Kimai 2, the open-source time-tracking software! Get more information at www.kimai.org.'); - $properties->setCreated(time()); - $properties->setModified(time()); - } - */ - /** * @param InvoiceDocument $document * @param InvoiceModel $model @@ -46,11 +26,18 @@ class DocxRenderer extends AbstractRenderer implements RendererInterface */ public function render(InvoiceDocument $document, InvoiceModel $model): Response { + \PhpOffice\PhpWord\Settings::setOutputEscapingEnabled(false); + $filename = basename($document->getFilename()); + $xmlEscaper = new Xml(); $template = new TemplateProcessor($document->getFilename()); - foreach ($this->modelToReplacer($model) as $key => $value) { - $template->setValue($key, $value); + + foreach ($this->modelToReplacer($model) as $search => $replace) { + $replace = $xmlEscaper->escape($replace); + $replace = str_replace(PHP_EOL, '', $replace); + + $template->setValue($search, $replace); } $template->cloneRow('entry.description', count($model->getCalculator()->getEntries())); @@ -58,6 +45,9 @@ class DocxRenderer extends AbstractRenderer implements RendererInterface foreach ($model->getCalculator()->getEntries() as $entry) { $values = $this->timesheetToArray($entry); foreach ($values as $search => $replace) { + $replace = $xmlEscaper->escape($replace); + $replace = str_replace(PHP_EOL, '', $replace); + $template->setValue($search . '#' . $i, $replace); } $i++;