diff --git a/composer.json b/composer.json
index b4faa3b0..b10325d8 100644
--- a/composer.json
+++ b/composer.json
@@ -8,6 +8,7 @@
"php": "^8.2",
"knplabs/knp-snappy-bundle": "^1.10",
"ramsey/uuid": "^4.7",
+ "sensiolabs/gotenberg-bundle": "^1.0",
"sylius/grid-bundle": "^1.13",
"sylius/resource-bundle": "^1.12",
"sylius/sylius": "^2.0",
diff --git a/config/services/generators.xml b/config/services/generators.xml
index cfca0642..541fe8dc 100644
--- a/config/services/generators.xml
+++ b/config/services/generators.xml
@@ -50,6 +50,7 @@
@SyliusInvoicingPlugin/shared/download/pdf.html.twig
%sylius_invoicing.template.logo_file%
+ %sylius_invoicing.pdf_generator.generate_with_gotenberg%
diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php
index c458f559..4e3897bb 100644
--- a/src/DependencyInjection/Configuration.php
+++ b/src/DependencyInjection/Configuration.php
@@ -173,6 +173,7 @@ private function addPdfGeneratorSection(ArrayNodeDefinition $node): void
->children()
->booleanNode('enabled')->defaultTrue()
->end()
+ ->booleanNode('generate_with_gotenberg')->defaultFalse()
->end()
->end()
;
diff --git a/src/DependencyInjection/SyliusInvoicingExtension.php b/src/DependencyInjection/SyliusInvoicingExtension.php
index 66981182..536c7682 100644
--- a/src/DependencyInjection/SyliusInvoicingExtension.php
+++ b/src/DependencyInjection/SyliusInvoicingExtension.php
@@ -15,11 +15,14 @@
use Sylius\Bundle\CoreBundle\DependencyInjection\PrependDoctrineMigrationsTrait;
use Sylius\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractResourceExtension;
+use Sylius\InvoicingPlugin\Generator\TwigToGotenbergPdfGenerator;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\Reference;
final class SyliusInvoicingExtension extends AbstractResourceExtension implements PrependExtensionInterface
{
@@ -35,6 +38,15 @@ public function load(array $configs, ContainerBuilder $container): void
$config = $this->processConfiguration($configuration, $configs);
$container->setParameter('sylius_invoicing.pdf_generator.allowed_files', $config['pdf_generator']['allowed_files']);
+ $container->setParameter('sylius_invoicing.pdf_generator.generate_with_gotenberg', $config['pdf_generator']['generate_with_gotenberg']);
+
+ if ($config['pdf_generator']['generate_with_gotenberg'] === true) {
+ $definition = new Definition(TwigToGotenbergPdfGenerator::class);
+ $definition->addArgument(new Reference('sensiolabs_gotenberg'));
+ $definition->setDecoratedService('sylius_invoicing.generator.twig_to_pdf');
+
+ $container->setDefinition('sylius_invoicing.gotenberg_generator.twig_to_pdf', $definition);
+ }
}
public function prepend(ContainerBuilder $container): void
diff --git a/src/Generator/InvoicePdfFileGenerator.php b/src/Generator/InvoicePdfFileGenerator.php
index b211caef..242ce862 100644
--- a/src/Generator/InvoicePdfFileGenerator.php
+++ b/src/Generator/InvoicePdfFileGenerator.php
@@ -25,6 +25,7 @@ public function __construct(
private readonly InvoiceFileNameGeneratorInterface $invoiceFileNameGenerator,
private readonly string $template,
private readonly string $invoiceLogoPath,
+ private readonly bool $generateWithGotenberg,
) {
}
@@ -38,6 +39,7 @@ public function generate(InvoiceInterface $invoice): InvoicePdf
'invoice' => $invoice,
'channel' => $invoice->channel(),
'invoiceLogoPath' => $this->fileLocator->locate($this->invoiceLogoPath),
+ 'generateWithGotenberg' => $this->generateWithGotenberg,
],
);
diff --git a/src/Generator/TwigToGotenbergPdfGenerator.php b/src/Generator/TwigToGotenbergPdfGenerator.php
new file mode 100644
index 00000000..18373c56
--- /dev/null
+++ b/src/Generator/TwigToGotenbergPdfGenerator.php
@@ -0,0 +1,50 @@
+gotenberg->pdf()
+ ->html()
+ ->content($templateName, $templateParams)
+ ->processor(
+ new class implements ProcessorInterface {
+ public function __invoke(?string $fileName): \Generator
+ {
+ $file = '';
+
+ do {
+ $chunk = yield;
+ $file .= $chunk->getContent();
+ } while (!$chunk->isLast());
+
+ return $file;
+ }
+ }
+ )
+ ;
+
+ return $builder->generate()->process();
+ }
+}
diff --git a/templates/shared/download/pdf_layout.html.twig b/templates/shared/download/pdf_layout.html.twig
index 78ad181a..e0f91fc9 100644
--- a/templates/shared/download/pdf_layout.html.twig
+++ b/templates/shared/download/pdf_layout.html.twig
@@ -113,7 +113,7 @@
-
+
|
{% block header %}{% endblock %}
|