PerfectVector
Par Irene Kim9 min de lecture

SVG ReportLab : garder les logos nets dans les PDF générés

Place des logos SVG dans des PDF ReportLab avec svglib, préserve leurs proportions et vérifie les tracés vectoriels, la taille et les détails du fichier final.

Sur cette page

Utilise svglib.svg2rlg() pour lire un SVG dans un Drawing ReportLab, puis place ce dessin avec renderPDF.draw(). Attribue-lui une boîte mesurée sur la page et utilise le même facteur d’échelle pour les deux axes. Une géométrie de logo adaptée reste ainsi des instructions de dessin PDF, au lieu d’insérer une capture matricielle.

Pour un export autonome sans mise en page de document, la procédure de dimensions CairoSVG compare pixels PNG, dimensions de page PDF et DPI.

Le test utile est le PDF final : l’emblème a-t-il gardé ses proportions, couleurs et petites ouvertures à la taille nécessaire au document ? Un appel Python réussi ne répond pas à ces questions. L’exemple ci-dessous place deux fois le même emblème original et vérifie le fichier produit.

Si tu as déjà le logo en dessin vectoriel éditable, pars de celui-ci. S’il ne reste qu’un PNG ou JPG, reconstruis un original vectoriel avant de créer le document. Photos et graphiques numériques nécessitent un autre choix de source.

Importer le dessin comme Drawing

La procédure documentée de svglib convertit les SVG en objets de dessin ReportLab. Le guide graphique de ReportLab explique que ces dessins peuvent être rendus sur un canvas ou utilisés comme éléments de mise en page Platypus. Pour cet exemple, un canvas donne à chaque placement une position et une taille explicites.

Nous avons exécuté l’exemple avec Python 3.12, svglib 2.2.0 et ReportLab 4.4.9. Installe les deux paquets à version fixée dans ton environnement de projet :

python -m pip install "svglib==2.2.0" "reportlab==4.4.9"

Enregistre ce petit emblème sous logo.svg. Il contient trois tracés avec des remplissages unis et aucune image liée, police ni aucun effet. C’est un dessin écrit à la main pour cette démonstration, pas un résultat de conversion PerfectVector.

<svg xmlns="http://www.w3.org/2000/svg"
     width="240" height="120" viewBox="0 0 240 120">
  <path fill="#1c625e" d="M0 120 L60 0 L120 120 Z"/>
  <path fill="#e5a340" d="M96 120 L156 24 L216 120 Z"/>
  <path fill="#163451" d="M228 12 L240 12 L240 108 L228 108 Z"/>
</svg>

Le viewBox du SVG décrit son rectangle de coordonnées interne. Les width et height du dessin importé indiquent les dimensions à utiliser pour le placement PDF. Lis-les au lieu de supposer qu’un pixel SVG égale un point PDF.

Pour ce fichier, svglib 2.2.0 a renvoyé 180 × 90 points. Sa documentation actuelle des unités fait correspondre un pixel CSS à 0.75 point PDF. Les anciens exemples peuvent utiliser d’autres hypothèses ; vérifie donc les dimensions lorsque tu mets à niveau une chaîne existante.

Ajuster le logo sans l’étirer

Enregistre ce qui suit sous place_logo.py à côté du SVG et lance python place_logo.py. Toutes les positions de page et dimensions de boîte sont ici en points PDF. Il y a 72 points dans un pouce ; l’origine par défaut du canvas est en bas à gauche, comme le décrit le guide canvas de ReportLab.

from reportlab.graphics import renderPDF
from reportlab.pdfgen import canvas
from svglib.svglib import svg2rlg
 
 
def draw_svg_in_box(pdf, drawing, x, y, box_w, box_h):
    if drawing.width <= 0 or drawing.height <= 0:
        raise ValueError("The SVG needs positive dimensions")
    factor = min(box_w / drawing.width, box_h / drawing.height)
    pdf.saveState()
    pdf.translate(x, y)
    pdf.scale(factor, factor)
    renderPDF.draw(drawing, pdf, 0, 0)
    pdf.restoreState()
 
 
drawing = svg2rlg("logo.svg")
if drawing is None:
    raise ValueError("SVG could not be loaded")
 
pdf = canvas.Canvas("logo.pdf", pagesize=(640, 360))
draw_svg_in_box(pdf, drawing, 40, 154, 144, 72)
draw_svg_in_box(pdf, drawing, 302, 126, 288, 144)
pdf.save()

min() choisit la dimension limitante pour que le dessin tienne dans la boîte. Utiliser le même facteur pour X et Y préserve les proportions. Cette fonction ancre le dessin au coin inférieur gauche de la boîte ; l’espace inutilisé reste au-dessus ou à droite. Centre-le séparément si ta mise en page le nécessite.

La transformation du canvas est temporaire. restoreState() empêche l’échelle du logo de changer le texte ou les éléments de page suivants, et le dessin original reste disponible pour le second placement.

Dans le test, les deux facteurs étaient 0.8 et 1.6, produisant des dessins de 144 × 72 pt et 288 × 144 pt. L’aperçu ajoute des libellés et un fond aux mêmes placements pour faciliter la comparaison de leurs tailles.

Le même emblème vert et doré placé à 144 sur 72 points et à 288 sur 144 points dans un PDF rendu
Capture du PDF de test rendu. Le logo se compose de trois tracés originaux dessinés à deux tailles. L’image web est un aperçu matriciel ; l’inspection du PDF a confirmé des tracés de dessin et aucune image intégrée.

Pour un document Platypus, un dessin peut rejoindre la séquence du document comme élément de mise en page. Après avoir mis son contenu à l’échelle avec drawing.scale(factor, factor), mets à jour drawing.width et drawing.height par le même facteur pour que la mise en page utilise la nouvelle emprise. Pars d’un nouveau dessin pour appliquer des tailles différentes. L’exemple canvas ci-dessus évite de modifier le dessin lui-même.

Vérifier séparément géométrie et apparence

Nous avons examiné le flux de contenu du PDF de test avec pypdf 6.10.0. Il contenait six opérations de début de tracé, correspondant aux trois tracés de l’emblème dessinés deux fois, et zéro image de page. Nous avons aussi rendu toute la page avec Poppler et examiné les deux emblèmes. Les formes, le chevauchement, la barre verticale et les proportions correspondaient aux placements prévus.

Ces observations s’appliquent à cet exemple simple. Compter les tracés seul ne prouve pas que chaque fonctionnalité d’un autre SVG a été correctement rendue. De même, zoomer dans un PDF à l’écran ne permet pas de conclure avec certitude s’il contient des instructions vectorielles ou une grande image matricielle.

Pour ton propre document :

  1. Compare le PDF final au SVG dans un navigateur ou éditeur. Cherche les détails manquants, les remplissages modifiés, le rognage et les zones blanches inattendues.
  2. Vérifie l’emblème à la taille prévue du document, où les espaces étroits et traits fins doivent rester lisibles.
  3. Examine les objets image du PDF si la procédure exige un dessin vectoriel. Tiens compte des photos intentionnelles ailleurs sur la page.
  4. Garde l’original SVG avec le code de génération du document. Revérifie le PDF après un changement du dessin ou de ses dépendances de rendu.

Un SVG peut lui-même contenir une image matricielle. Lire cette enveloppe ne reconstruit pas les tracés depuis ses pixels. Le diagnostic des images intégrées aide à distinguer un original vectoriel d’un SVG qui contient toujours une image matricielle.

Gérer les fonctionnalités que l’importateur ne reproduit pas

Les limites actuelles de svglib comprennent les masques et éléments foreignObject non pris en charge, les règles de feuille de style @import ignorées et des restrictions de CSS et de rognage. Un aperçu navigateur ne remplace donc pas le test de l’importateur PDF.

Garde une copie de l’original avant de le simplifier. Lorsqu’un logo dépend d’un effet non pris en charge, envisage de reconstruire cette partie en géométrie ordinaire ou d’utiliser une autre méthode d’export vérifiable. Conserve l’original matriciel lorsque l’apparence photographique compte davantage que l’édition des tracés. Une image aplatie peut préserver l’apparence, mais change l’exigence vectorielle.

Pour le lettrage, choisis délibérément entre texte du document et dessin converti en tracés. Garder les mots comme texte permet l’édition et la recherche, mais exige la police prévue dans la chaîne documentaire. Convertir un lettrage de logo approuvé en tracés préserve sa forme au prix de l’édition textuelle ordinaire. Notre emblème constitué seulement de tracés ne teste pas les polices ; utilise un échantillon réel de ton texte avant de compter sur la même chaîne.

Si tu assembles le document dans un système de composition plutôt qu’en Python, la procédure SVG dans LaTeX explique une méthode distincte pour graphismes et libellés.

Reconstruire un logo uniquement matriciel avant le placement PDF

Un ancien PNG dans un modèle de facture est un candidat raisonnable à la reconstruction vectorielle lorsque le fichier original du logo manque. Avec le vectoriseur de logos de PerfectVector, affiche le dessin matriciel en SVG, examine les contours et ouvertures et télécharge un candidat pour ta chaîne documentaire.

Vérifie les petits caractères et bordures avant l’import. Redessine ou recompose les éléments nécessitant une typographie exacte et retire les géométries de fond indésirables dans un éditeur. Le guide de vectorisation de logos détaille ce choix de passage de la source à l’original vectoriel.

Exécute ensuite l’import ReportLab réel et les vérifications PDF ci-dessus. Une bonne vectorisation doit toujours survivre à l’importateur et tenir dans ton document. PerfectVector fournit les tracés du dessin ; il ne choisit pas les coordonnées ReportLab, n’enregistre pas les polices du document et ne vérifie pas le PDF obtenu. Pour les graphiques, régénère depuis les données et le code source plutôt que de vectoriser les libellés ou valeurs représentées.

FAQ

Puis-je transmettre un SVG à ReportLab comme une image matricielle ordinaire ? Utilise svglib pour produire un Drawing et rends-le avec renderPDF pour cette procédure vectorielle. Convertir d’abord le SVG en PNG produit plutôt une insertion matricielle.

Pourquoi mon SVG importé est-il plus petit que dans un ancien exemple ? La version svglib 2.2.0 testée convertit les pixels CSS en points PDF avec un facteur de 0.75. Lis les dimensions du dessin renvoyé et ajuste-les à une boîte explicite au lieu de compter sur d’anciennes hypothèses pixel-point.

Cela préserve-t-il tous les effets SVG ? Non. L’importateur a des limites documentées, dont les masques et foreignObject. Compare le PDF exporté au dessin prévu, même si le script se termine sans erreur.

Dois-je vectoriser une capture d’écran de graphique ? Régénère le graphique depuis ses données et son code source chaque fois que possible. Réserve la vectorisation de logos aux dessins décoratifs adaptés dont l’original éditable manque.

Sources

  1. svglib — Documentation du paquet et des unités — Conversion SVG vers Drawing, installation et dimensions en points PDF.
  2. ReportLab — Graphismes — Objets Drawing, rendu PDF et utilisation comme éléments Platypus.
  3. ReportLab — Graphismes et texte avec pdfgen — Coordonnées canvas, points et transformations.
  4. svglib — Limites connues — Restrictions d’import nécessitant de vérifier le PDF final.

Garde l’original éditable lorsque tu en as un. S’il ne reste qu’un logo matriciel, prépare un logo SVG candidat, examine ses tracés, puis place-le à la taille requise et vérifie le PDF final.

Plus depuis le blog

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