DomPDF FONT ??? avec Symfony
Posté : 23 mai 2024, 22:28
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 :
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);
});
});
});