# .manala.yamlmanala:system:apt:packages:-libxrender1# Required by wkhtmltopdf-libxext6# Required by wkhtmltopdf-fontconfig# Required by wkhtmltopdf-libjpeg62-turbo# Required by wkhtmltopdf-xfonts-base# Required by wkhtmltopdf-xfonts-75dpi# Required by wkhtmltopdf-https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.stretch_amd64.deb
Laisser ansible gérer la version de l'OS pour wkhtmltopdf avec {{ ansible_distribution_release }}
1
2
3
4
5
6
7
8
9
10
# ansible/group_vars/app.ymlapp_patterns:apt_packages:-libxrender1# Required by wkhtmltopdf-libxext6# Required by wkhtmltopdf-fontconfig# Required by wkhtmltopdf-libjpeg62-turbo# Required by wkhtmltopdf-xfonts-base# Required by wkhtmltopdf-xfonts-75dpi# Required by wkhtmltopdf-https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.{{ ansible_distribution_release }}_amd64.deb
Se placer dans votre VM ou sur votre serveur pour récupérer le path pour wkhtmltopdf
1
which wkhtmltopdf
Le path sera très probablement /usr/local/bin/wkhtmltopdf
<?phpuseKnp\Snappy\Pdf;classPdfGenerator{/** @var Pdf */private$KnpSnappy;privatestring$outputDir;publicfunction__construct(Pdf$KnpSnappy,string$outputDir){$this->KnpSnappy=$KnpSnappy;$this->outputDir=$outputDir;}privatefunctiongetPath(string$filename):string{returnrtrim($this->outputDir,'/').'/'.$filename.'.pdf';}publicfunctiongenerate($content,$filename){$outputPath=$this->getPath($filename);$this->KnpSnappy->generateFromHtml($content,$outputPath);return$outputPath;}}
Si vous générez un pdf à partir d'une url de votre application Symfony, vous pouvez avoir besoin de rendre cette url non public tout en permettant à wkhtmltopdf d'y accéder.
La solution la plus simple est de n'autoriser l'accès à cette url qu'en local grâce un access control sur les IP locales :
class FoobarController{ /** * @Route("/local/foobar/print", name="foobar_print") */ public function printAction(): Response { return new Reponse($this->render('foobar.html.twig')); } /** * @Route("/foobar.pdf", name="foobar_pdf") */ public function pdfAction(Pdf $pdfGenerator): Response { $url = $this->generateUrl('foobar_print', [], RouterInterface::ABSOLUTE_URL); return new PdfResponse($pdfGenerator->getOutput($url), 'foobar.pdf'); }}
L'action pdfAction sera sécurisé comme le reste de l'application si besoin (firewall, authentification, ...) et l'actions printAction ne sera accessible que par le serveur.
Si vous exposez des urls destinées à l'impression uniquement, vous souhaitez peut-être ne les rendre accessibles qu'à wkhtmltopdf.
Une solution est de n'autoriser que les IPs locales à accéder à vos pages. Utilisez pour cela une règle d'access control sur un préfix d'url que vous utilisez sur les contrôleurs concernés.
Il faut pour cela que le nom de domaine utilisé dans vos URLs soit résolu par une IP locale. Normalement, sur nos serveurs, le nom de domaine racine est résolut en 127.0.0.1, mais cela peut ne pas être le cas, notamment pour les sous-domaines ou sur une autre infra.
Vous pouvez alors associer votre nom de domaine à l'ip 127.0.0.1 sur le serveur (/etc/hosts) ou utiliser le décorateur suivant pour forcer wkhtmltopdf à requêter Symfony en local (solution recommandée sur les infra Elao/Rix) :