PerfectVector
Par Irene Kim9 min de lecture

Images SVG fpdf2 : garder les tracés dans ton PDF Python

Place un logo SVG dans un PDF Python avec fpdf2, règle sa taille, examine les tracés enregistrés et diagnostique les éléments manquants avant une solution de repli matricielle.

Sur cette page

Utilise pdf.image("logo.svg", x=20, y=20, w=60) pour placer un SVG dans un document fpdf2. La géométrie SVG prise en charge devient des tracés de dessin PDF. Tu n’as pas besoin de rendre d’abord le logo en PNG. La documentation SVG officielle décrit cette méthode directe et ses limites.

Si tu découvres ce format, le guide des fichiers SVG explique les tracés et les conteneurs d’images. Un import réussi doit quand même être vérifié. Le fichier peut contenir des pixels intégrés, dépendre de fonctionnalités que l’importateur ne reproduit pas ou présenter de l’espace vide autour du dessin. Ce guide crée un petit logo original, le place à une taille explicite et vérifie le PDF obtenu. Garde un original vectoriel existant si tu en as un ; reconstruire un dessin depuis un PNG ou JPG est une étape distincte en amont.

Commencer avec un SVG connu et une version fpdf2 fixée

Nous avons exécuté l’exemple avec Python 3.12 et fpdf2 2.8.8. C’est la version testée, pas une garantie que chaque version ultérieure se comporte de façon identique. La page PyPI officielle du paquet décrit l’installation sous le nom de distribution fpdf2 ; l’import Python est fpdf.

Utilise un environnement neuf pour que l’exemple soit indépendant des paquets d’un autre projet :

python3 -m venv .venv
source .venv/bin/activate
python -m pip install "fpdf2==2.8.8"

Sur Windows, active plutôt l’environnement avec .venv\Scripts\activate. Enregistre cet emblème rectangulaire original sous logo.svg :

<svg xmlns="http://www.w3.org/2000/svg"
     width="120" height="80" viewBox="0 0 120 80">
  <path fill="#137d89" fill-rule="evenodd"
        d="M10 10H110V70H10Z M30 25H90V55H30Z"/>
</svg>

Il comporte deux sous-tracés fermés. Le rectangle extérieur est rempli et le rectangle intérieur devient une ouverture grâce à la règle de remplissage evenodd. Aucune police, image ni aucun effet n’intervient, ce qui facilite le diagnostic du premier test.

Enregistre ce qui suit sous place_logo.py, à côté du SVG :

from pathlib import Path
from fpdf import FPDF
 
folder = Path(__file__).resolve().parent
pdf = FPDF(unit="mm")
pdf.add_page()
pdf.image(str(folder / "logo.svg"), x=20, y=20, w=60)
pdf.output(str(folder / "logo.pdf"))

Exécute python place_logo.py. Ouvre logo.pdf et vérifie la présence d’un cadre rectangulaire bleu-vert près du coin supérieur gauche, avec la page visible à travers son centre.

Distinguer le canevas SVG du logo peint

Le canevas source a un rapport de 3:2 : 120 unités de large et 80 de haut. Avec w=60, cet exemple occupe un canevas de 60 × 40 mm. Le dessin commence à 10 unités source à l’intérieur de ce canevas ; son rectangle extérieur peint mesure donc 50 × 30 mm, à partir de 25, 25 mm sur la page. Ces valeurs sont calculées à partir des coordonnées et de l’échelle de cet exemple.

Cette marge explique pourquoi mesurer la forme colorée ne donne pas le même résultat que mesurer le canevas de placement. Si le logo d’un client semble trop petit, examine les marges source avant d’augmenter sa largeur PDF.

Le guide des images fpdf2 explique la gestion des dimensions et l’option de maintien des proportions dans une boîte donnée. Pour ce premier exemple, règle seulement la largeur. Si tu fournis ensuite les deux dimensions, teste volontairement l’ajustement souhaité au lieu de supposer que chaque source aura les mêmes proportions.

Illustration d’un logo rectangulaire dans son canevas plus grand, puis placé sur une page de document
Le canevas de placement inclut de l’espace vide autour du dessin. Cette illustration explique les deux limites ; examine le PDF exporté pour vérifier tes dimensions réelles.

Vérifier que le PDF enregistré contient des tracés

L’aperçu PDF montre l’apparence, mais une image peut sembler nette à un zoom modéré. Examine aussi le fichier. Nous avons vérifié l’exemple isolé avec pypdf 6.1.1 :

python -m pip install "pypdf==6.1.1"
from pathlib import Path
from pypdf import PdfReader
 
folder = Path(__file__).resolve().parent
page = PdfReader(folder / "logo.pdf").pages[0]
print("Page images:", len(page.images))
print(page.get_contents().get_data().decode("latin-1"))

Notre sortie indiquait zéro image de page. Le contenu décodé contenait des contours rectangulaires exprimés par des opérations de déplacement, ligne et fermeture de tracé, suivies de f*, l’opération de remplissage pair-impair. Avec l’ouverture visible au rendu, cela étaye la conclusion que cet exemple sans image est resté de la géométrie de dessin dans le PDF enregistré.

N’applique pas cette conclusion à une autre entrée sans la vérifier. Un rapport peut légitimement contenir des photos ailleurs ; un SVG peut lui-même contenir une image. Le diagnostic des images matricielles intégrées aide à distinguer un logo à tracés d’une image matricielle enveloppée dans du balisage SVG. Les PDF plus complexes peuvent aussi placer du contenu de dessin dans des objets référencés ; le petit script ci-dessus est donc un point de départ pour cet exemple isolé, pas un audit PDF universel.

Diagnostiquer le dessin manquant avec ta version installée

Commence par exécuter le petit emblème ci-dessus. S’il fonctionne alors que ton logo de production échoue, tu as réduit le problème au dessin source ou aux fonctionnalités qu’il utilise. Préserve l’original et simplifie une copie, une fonctionnalité à la fois.

SymptômePremière vérificationÉtape suivante utile
La page est videChemin du fichier, placement, dimensions et avertissements de l’importateurTester l’emblème simple à des coordonnées explicites
Le logo paraît trop petitEspace vide dans le canevas sourceComparer les limites peintes au viewBox
Le centre se remplitStructure du tracé composé et règle de remplissagePréserver l’ouverture pendant l’édition ou l’export
Le lettrage manque ou diffèreVersion installée, choix de police et fonctionnalités textuellesTester un texte distinct ou utiliser un lettrage de logo approuvé converti en tracés
Une décoration disparaîtFonctionnalités SVG non prises en chargeRetirer cette fonctionnalité d’une copie et comparer le résultat
Le PDF est net mais pourrait contenir des pixelsImages intégrées dans la source et le PDFExaminer la structure du fichier ainsi que l’aperçu

Les réponses anciennes demandent de la prudence ici. Notre test distinct en 2.8.8, contenant un simple élément <text>, a produit le texte extractible HELLO, et un rectangle à dégradé linéaire basique s’est exporté correctement. Ces vérifications limitées n’établissent pas une compatibilité complète du texte SVG, des polices, du CSS ou des dégradés. Elles montrent néanmoins pourquoi une vieille affirmation selon laquelle aucun texte SVG ou aucun dégradé n’est pris en charge peut te pousser à une pixellisation inutile.

La liste actuelle des fonctionnalités SVG mentionne toujours des limites comme les marqueurs, les motifs, le texte sur un tracé et le CSS complexe ou externe. Garde les avertissements de l’importateur visibles pendant le diagnostic et compare la page enregistrée à la source. Un journal sans avertissement ne prouve pas à lui seul que toutes les fonctionnalités visuelles ont survécu.

Utiliser une solution de repli matricielle quand le résultat le demande

Si un effet ne peut pas être reproduit dans la chaîne choisie, décide si préserver son apparence compte davantage que garder sa géométrie. Un PNG rendu peut convenir pour cette partie d’un document. Vérifie-le à la taille physique finale et décris la sortie avec exactitude ; intégrer un rendu matriciel ne préserve pas les tracés originaux.

Pour un logo de marque, un lettrage approuvé converti en tracés ou un export vectoriel plus simple peut être préférable. Pour du texte de document éditable, garde la gestion des polices et du texte dans la procédure du document. Vectoriser une capture d’écran d’une phrase ne retrouve pas sa typographie et ne la rend pas sélectionnable.

Si ton code PDF existant utilise une autre bibliothèque Python, la procédure SVG ReportLab possède ses propres vérifications d’import et de dimensions. Changer de bibliothèque est une décision d’implémentation distincte ; teste donc la fonctionnalité réellement problématique avant de reconstruire le document.

Préparer le dessin uniquement matriciel avant l’étape PDF

Lorsqu’il ne reste qu’un logo PNG ou JPG, le vectoriseur de logos de PerfectVector peut préparer un SVG candidat avant son import avec fpdf2. Compare les contours, les petites ouvertures et les zones colorées à la source, puis soumets le candidat aux mêmes vérifications de placement et de PDF.

Utilise le vectoriel original s’il est disponible. Le lettrage exact d’une marque peut demander une nouvelle saisie ou une correction manuelle ; le guide de vectorisation de logos explique ce choix. L’emblème de cet article est un SVG original écrit à la main, pas un résultat de conversion PerfectVector mesuré. PerfectVector prépare le dessin, tandis que fpdf2 contrôle son placement dans le PDF.

FAQ

fpdf2 peut-il insérer directement un SVG ? Oui. Transmets le fichier SVG à la méthode image et règle son placement et sa taille. La géométrie prise en charge peut devenir des tracés PDF, mais examine le fichier exporté et l’apparence de ton propre dessin.

fpdf2 prend-il en charge le texte SVG ? Notre test de texte basique a fonctionné avec fpdf2 2.8.8. Cela ne garantit pas toutes les polices, fonctionnalités de mise en page ou constructions de texte sur un tracé. Vérifie ta version installée et teste le lettrage réellement utilisé par ton document.

Pourquoi une image de 60 mm semble-t-elle plus étroite que 60 mm ? La taille demandée s’applique au canevas de placement. Les marges vides dans le SVG restent une partie de ce canevas ; la forme peinte peut donc être plus étroite.

Dois-je convertir mon logo PNG en SVG avant de l’ajouter ? Seulement si tu as besoin de tracés éditables et si le dessin se prête à la vectorisation. Garde les photographies comme images matricielles et utilise un logo vectoriel original lorsqu’il existe. Vérifie un candidat vectorisé avant de l’insérer.

Sources

  1. fpdf2 — SVG — Décrit l’insertion SVG directe, la prise en charge des fonctionnalités et les journaux d’avertissement.
  2. fpdf2 — Images — Explique le placement des images, les dimensions et l’ajustement du rapport hauteur/largeur.
  3. fpdf2 — Paquet PyPI — Identifie la distribution installable et sa convention d’import Python.

Tu n’as qu’un logo matriciel ? Prépare un SVG candidat avec PerfectVector, examine ses contours et ses ouvertures, puis place-le à la taille requise avec fpdf2 et vérifie le PDF enregistré.

Plus depuis le blog

Repartez d’un SVG plus net
et plus facile à modifier