Page 1 sur 1

DomPDF FONT ??? avec Symfony

Posté : 23 mai 2024, 22:28
par yyy666
Bonjour à tous,

J'utilise domPDF et je tente de récupérer une police afin que lors de l'export PDF, mon PDF hérite de cette police, mais cela ne fonctionne pas... C'est toujours la font de base...

Mon PDF s'exporte sans problème avec les couleurs et les images, mais la police ne passe pas. J'utilise une police de Google Fonts, quelque chose de classique.

Auriez-vous une idée svp ? ou un module plus puissant et plus simple sinon ? Merci d'avance

Voici la route "telecharger pdf" dans mon GuideController :
<?php

namespace App\Controller;

use App\Entity\Article;
use App\Entity\Categorie;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Dompdf\Dompdf;
use Symfony\Component\HttpKernel\KernelInterface;


class GuideController extends AbstractController
{
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    #[Route('/guide', name: 'guide_index')]
    public function index(): Response
    {
        $categories = $this->entityManager->getRepository(Categorie::class)->findAll();

        $article = $this->entityManager->getRepository(Article::class)->findAll();

        return $this->render('guide/index.html.twig', [
            'categories' => $categories,
            'article' => $article,

        ]);
    }

    #[Route('/guide/{article}', name: 'detail_guide')]
    public function getArticle(Article $article): Response
    {
        // Récupérez toutes les catégories
        $categories = $this->entityManager->getRepository(Categorie::class)->findAll();

        // Vérifiez si l'article est privé et si l'utilisateur est connecté
        if ($article->isIsPrive() && !$this->getUser()) {
            // Renvoyer une réponse avec le template d'erreur 404
            return new Response($this->renderView('bundles/TwigBundle/Exception/error403.html.twig'), 403);
        }

        // Affichez l'article normalement
        return $this->render('guide/view.html.twig', [
            'article' => $article,
            'categories' => $categories,
        ]);
    }


    #[Route('/telecharger-pdf', name: 'telecharger_pdf')]
    public function test(Request $request, KernelInterface $kernel): Response
    {
        $dompdf = new Dompdf();

        $imgPath = $kernel->getProjectDir() . '/public/img/';
        $data = json_decode($request->getContent(), true);
        $contenuHtml = $data['contenuHtml'] ?? '';

        $html = '<html><head><style>
        .article-content{
            font-family: "Jost-Regular", sans-serif;
        }
        .article-date{
            font-family: "Jost-Medium", sans-serif;
        }
        .article-title{
            font-family: "Jost-Medium", sans-serif;
        }
        html, body {
            margin: 10px;
        }
        </style></head>
        <body>
        <img src="' . $imgPath . 'gtitop222.png" alt="Example Image" style="width: 100%; margin:0">
        ' . $contenuHtml . '
        </body></html>';

        $options = $dompdf->getOptions();
        $options->set('isRemoteEnabled', true);
        $options->setFontCache($kernel->getProjectDir() . '/public/assets/fonts');
        $options->setFontDir($kernel->getProjectDir() . '/public/assets/fonts');
        $options->set('pdfBackend', 'CPDF');
        $options->setChroot($kernel->getProjectDir() . '/public/img/');

        $dompdf->setOptions($options);

        $dompdf->getFontMetrics()->registerFont(
            ['family' => 'Jost-Regular', 'style' => 'normal', 'weight' => 'normal'],
            $kernel->getProjectDir() . '/public/assets/fonts/Jost-Regular.ttf'
        );

        $dompdf->getFontMetrics()->registerFont(
            ['family' => 'Jost-Medium', 'style' => 'medium', 'weight' => 'normal'],
            $kernel->getProjectDir() . '/public/assets/fonts/Jost-Medium.ttf'
        );

        $dompdf->loadHtml($html);
        $dompdf->setPaper('A4', 'portrait');
        $dompdf->render();

        // Renvoyer le PDF en réponse
        $response = new Response($dompdf->output());
        $response->headers->set('Content-Type', 'application/pdf');
        $response->headers->set('Content-Disposition', 'attachment; filename="contenu.pdf"');

        return $response;
    }
}
Voici mon JS qui se trouve dans ma page HTML qui fonctionne :

document.addEventListener('DOMContentLoaded', function () {
const btnDownloadPdf = document.querySelector('.btn-download-pdf');

btnDownloadPdf.addEventListener('click', function () {
const mainContent = document.querySelector('.main-content1');

const contenuSansBouton = mainContent.cloneNode(true);
// Suppression du bouton de la copie
const bouton = contenuSansBouton.querySelector('button');
bouton.parentNode.removeChild(bouton);

const contenuHtml = contenuSansBouton.innerHTML;

fetch('{{ path('telecharger_pdf') }}', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(
{contenuHtml: contenuHtml}
)
}).then(response => {
if (!response.ok) {
throw new Error('Erreur lors de la génération du PDF');
}
return response.blob();
}).then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = 'contenu.pdf';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
}).catch(error => {
console.error('Erreur:', error);
});
});
});


Re: DomPDF FONT ??? avec Symfony

Posté : 24 mai 2024, 11:59
par Saian
Salut, j'ai jamais utilisé cette librairie mais de ce que j'ai lu et des exemples que j'ai vu, le dossier des fonts devrait aussi être passé au setChroot. Tu peux passer les deux dossiers avec un tableau.

Je sais pas si ça fera la différence mais ça se tente.

    /**
     * dompdf's "chroot"
     *
     * Utilized by Dompdf's default file:// protocol URI validation rule.
     * All local files opened by dompdf must be in a subdirectory of the directory
     * or directories specified by this option.
     * DO NOT set this value to '/' since this could allow an attacker to use dompdf to
     * read any files on the server.  This should be an absolute path.
     *
     * ==== IMPORTANT ====
     * This setting may increase the risk of system exploit. Do not change
     * this settings without understanding the consequences. Additional
     * documentation is available on the dompdf wiki at:
     * https://github.com/dompdf/dompdf/wiki
     *
     * @var array
     */
    private $chroot;

Re: DomPDF FONT ??? avec Symfony

Posté : 24 mai 2024, 14:40
par yyy666
Merci beaucoup monsieur !!! ça marche !!