diff --git a/src/Utils/MPdfConverter.php b/src/Utils/MPdfConverter.php index a703ec95..e0c9bc8e 100644 --- a/src/Utils/MPdfConverter.php +++ b/src/Utils/MPdfConverter.php @@ -34,7 +34,21 @@ class MPdfConverter implements HtmlToPdfConverter { $mpdf = new Mpdf(['tempDir' => $this->cacheDirectory]); $mpdf->creator = Constants::SOFTWARE; - $mpdf->WriteHTML($html); + + // some OS do not follow the PHP default settings + if ((int) ini_get('pcre.backtrack_limit') < 1000000) { + @ini_set('pcre.backtrack_limit', 1000000); + } + + // reduce the size of content parts that are passed to MPDF, to prevent + // https://mpdf.github.io/troubleshooting/known-issues.html#blank-pages-or-some-sections-missing + $parts = explode('', $html); + for ($i = 0; $i < count($parts); $i++) { + $mpdf->WriteHTML($parts[$i]); + if ($i < count($parts) - 1) { + $mpdf->WriteHTML(''); + } + } return $mpdf->Output('', Destination::STRING_RETURN); } diff --git a/templates/export/renderer/pdf.html.twig b/templates/export/renderer/pdf.html.twig index 89be4501..3dfffc7b 100644 --- a/templates/export/renderer/pdf.html.twig +++ b/templates/export/renderer/pdf.html.twig @@ -10,20 +10,32 @@ @@ -82,14 +97,14 @@ mpdf-->

{{ 'export.summary'|trans }}

- +
- - - + + + {% if showRateColumn %} - + {% endif %} @@ -149,17 +164,17 @@ mpdf--> {% set duration = 0 %} {% set rate = 0 %} {% set currency = false %} -
{{ 'label.customer'|trans }}{{ 'label.project'|trans }}{{ 'label.duration'|trans }}{{ 'label.customer'|trans }}{{ 'label.project'|trans }}{{ 'label.duration'|trans }}{{ 'label.rate'|trans }}{{ 'label.rate'|trans }}
+
- + {% if showUserColumn %} - + {% endif %} - - + + {% if showRateColumn %} - + {% endif %} @@ -173,7 +188,7 @@ mpdf--> {% set currency = null %} {% endif %} -
{{ 'label.date'|trans }}{{ 'label.date'|trans }}{{ 'label.user'|trans }}{{ 'label.user'|trans }}{{ 'label.description'|trans }}{{ 'label.duration'|trans }}{{ 'label.description'|trans }}{{ 'label.duration'|trans }}{{ 'label.rate'|trans }}{{ 'label.rate'|trans }}
+ {{ entry.begin|date_time }} {% if entry.end %}
diff --git a/tests/Controller/ExportControllerTest.php b/tests/Controller/ExportControllerTest.php index 3473a128..bc7c60ac 100644 --- a/tests/Controller/ExportControllerTest.php +++ b/tests/Controller/ExportControllerTest.php @@ -217,7 +217,7 @@ class ExportControllerTest extends ControllerBaseTest // poor mans assertions ;-) $this->assertStringContainsString('export_print', $node->getIterator()[0]->getAttribute('class')); - $this->assertStringContainsString('

List of expenses

', $response->getContent()); + $this->assertStringContainsString('

', $response->getContent()); $this->assertStringContainsString('

Summary

', $response->getContent()); $node = $client->getCrawler()->filter('section.export div#export-records table.dataTable tbody tr'); diff --git a/tests/Export/Renderer/HtmlRendererTest.php b/tests/Export/Renderer/HtmlRendererTest.php index f6ae3c24..5fac2184 100644 --- a/tests/Export/Renderer/HtmlRendererTest.php +++ b/tests/Export/Renderer/HtmlRendererTest.php @@ -50,7 +50,7 @@ class HtmlRendererTest extends AbstractRendererTest $content = $response->getContent(); - $this->assertStringContainsString('

List of expenses

', $content); + $this->assertStringContainsString('

', $content); $this->assertStringContainsString('

Summary

', $content); $this->assertEquals(1, substr_count($content, 'id="export-summary"')); $this->assertEquals(1, substr_count($content, 'id="export-records"')); diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf index 4ab47ba9..fab75abf 100644 --- a/translations/messages.de.xlf +++ b/translations/messages.de.xlf @@ -970,7 +970,7 @@ export.document_title - Aufstellung zu Aufwänden + Export von Zeiten export.full_list diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 33e0464f..7a60dddb 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -970,7 +970,7 @@ export.document_title - List of expenses + Export of timesheets export.full_list