ReportLab-SVG: Scharfe Logopfade in erzeugten PDFs
Platziere SVG-Logos mit svglib in ReportLab-PDFs, erhalte ihre Proportionen und prüfe die fertige Datei auf Vektorpfade, richtige Größe und fehlende Details.
Auf dieser Seite
Lies ein SVG mit svglib.svg2rlg() in ein ReportLab-Drawing ein und platziere diese Zeichnung dann mit renderPDF.draw(). Weise ihr einen Bereich mit festgelegten Abmessungen zu auf der Seite und verwende für beide Achsen denselben Skalierungsfaktor. So bleibt geeignete Logogeometrie als PDF-Zeichenanweisungen erhalten, statt einen Bitmap-Screenshot einzufügen.
Für einen eigenständigen Export ohne Dokumentlayout vergleicht der CairoSVG-Ablauf zur Ausgabegröße PNG-Pixel, PDF-Seitenabmessungen und DPI.
Der nützliche Test ist die fertige PDF: Hat das Emblem seine Proportionen, Farben und kleinen Aussparungen in der benötigten Dokumentgröße behalten? Ein erfolgreicher Python-Aufruf beantwortet diese Fragen nicht. Das folgende Beispiel platziert dasselbe eigene Emblem zweimal und prüft die erzeugte Datei.
Wenn du das Logo bereits als bearbeitbare Vektorgrafik hast, beginne damit. Wenn nur ein PNG oder JPG erhalten ist, rekonstruiere eine Vektorvorlage, bevor du das Dokument aufbaust. Fotos und numerische Diagramme benötigen eine andere Quellenentscheidung.
Die Grafik als Zeichnung importieren
Der dokumentierte svglib-Ablauf konvertiert SVG in ReportLab-Zeichnungsobjekte. ReportLabs Grafikleitfaden erklärt, dass diese Zeichnungen auf ein Canvas gerendert oder als Platypus-Flowables verwendet werden können. In diesem Beispiel gibt ein Canvas jeder Platzierung eine ausdrückliche Position und Größe.
Wir haben das Beispiel mit Python 3.12, svglib 2.2.0 und ReportLab 4.4.9 ausgeführt. Installiere die beiden festgelegten Paketversionen in deiner Projektumgebung:
python -m pip install "svglib==2.2.0" "reportlab==4.4.9"Speichere dieses kleine Emblem als logo.svg. Es enthält drei Pfade mit einfarbigen Füllungen und keine verknüpften Bilder, Schriften oder Effekte. Es ist für diese Demonstration von Hand erstellte Grafik, kein PerfectVector-Konvertierungsergebnis.
<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>Die viewBox des SVG beschreibt sein internes Koordinatenrechteck. Die Werte width und height der importierten Zeichnung nennen die Abmessungen, die du für die PDF-Platzierung verwenden solltest. Lies sie aus, statt anzunehmen, dass ein SVG-Pixel einem PDF-Punkt entspricht.
Für diese Datei lieferte svglib 2.2.0 180 × 90 Punkte. Seine aktuelle Einheitendokumentation bildet ein CSS-Pixel auf 0.75 PDF-Punkte ab. Ältere Beispiele können andere Annahmen verwenden. Prüfe deshalb die Abmessungen, wenn du eine bestehende Verarbeitungskette aktualisierst.
Das Logo ohne Strecken einpassen
Speichere Folgendes als place_logo.py neben dem SVG und führe python place_logo.py aus. Alle Seitenpositionen und Feldabmessungen sind hier PDF-Punkte. Ein Zoll hat 72 Punkte; der standardmäßige Canvas-Ursprung liegt unten links, wie in ReportLabs Canvas-Leitfaden beschrieben.
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() wählt die begrenzende Dimension, damit die Zeichnung in das Feld passt. Derselbe Faktor für X und Y erhält die Proportionen. Diese Funktion verankert die Zeichnung an der unteren linken Feldecke; ungenutzter Raum bleibt oben oder rechts. Zentriere sie separat, wenn dein Layout das erfordert.
Die Canvas-Transformation ist vorübergehend. restoreState() verhindert, dass die Logoskalierung späteren Text oder Seitenelemente verändert, und die Originalzeichnung bleibt für die zweite Platzierung verfügbar.
Im Test betrugen die beiden Faktoren 0.8 und 1.6, wodurch 144 × 72 pt und 288 × 144 pt große Grafiken entstanden. Die Vorschau ergänzt Beschriftungen und einen Hintergrund zu denselben zwei Platzierungen, damit ihre Größen leicht vergleichbar sind.

In einem Platypus-Dokument kann eine Zeichnung als Flowable in die Story aufgenommen werden. Nachdem du ihren Inhalt mit drawing.scale(factor, factor) skaliert hast, aktualisiere drawing.width und drawing.height mit demselben Faktor, damit das Layout den neuen Platzbedarf berücksichtigt. Beginne beim Anwenden unterschiedlicher Größen mit einer frischen Zeichnung. Das Canvas-Beispiel oben vermeidet Änderungen an der Zeichnung selbst.
Geometrie und Erscheinungsbild getrennt prüfen
Wir haben den Inhaltsstream der Test-PDF mit pypdf 6.10.0 untersucht. Er enthielt sechs Pfadstartoperationen, entsprechend den drei zweimal gezeichneten Emblempfaden, und null Seitenbilder. Außerdem haben wir die gesamte Seite mit Poppler gerendert und beide Embleme geprüft. Formen, Überlappung, vertikaler Balken und Proportionen entsprachen den vorgesehenen Platzierungen.
Diese Beobachtungen gelten für dieses einfache Testbeispiel. Pfade allein zu zählen beweist nicht, dass jede Funktion eines anderen SVG korrekt dargestellt wurde. Ebenso lässt sich durch Vergrößern einer PDF auf dem Bildschirm nicht eindeutig feststellen, ob sie Vektoranweisungen oder eine große Bitmap enthält.
Für dein eigenes Dokument:
- Vergleiche die fertige PDF mit dem SVG in einem Browser oder Editor. Suche nach fehlenden Details, geänderten Füllungen, Beschneidung und unerwarteten weißen Bereichen.
- Prüfe das Emblem in der vorgesehenen Dokumentgröße, in der enge Zwischenräume und feine Konturen lesbar bleiben müssen.
- Untersuche PDF-Bildobjekte, wenn der Ablauf Vektorgrafik erfordert. Berücksichtige beabsichtigte Fotos an anderer Stelle der Seite.
- Behalte die SVG-Vorlage neben dem Code zur Dokumenterzeugung. Prüfe die PDF erneut nach Änderungen an Grafik oder Rendering-Abhängigkeiten.
Ein SVG kann selbst ein Rasterbild enthalten. Das Einlesen dieser Hülle rekonstruiert keine Pfade aus den Pixeln des eingebetteten Bildes. Die Diagnose eingebetteter Bilder hilft, eine Vektorvorlage von einem SVG zu unterscheiden, das weiterhin eine Bitmap trägt.
Mit Funktionen umgehen, die der Importer nicht nachbildet
Die aktuellen svglib-Einschränkungen umfassen nicht unterstützte Masken und foreignObject-Elemente, ignorierte Stylesheet-Regeln mit @import sowie Einschränkungen bei CSS und Beschneidung. Eine Browservorschau kann deshalb den Test des PDF-Importers nicht ersetzen.
Behalte eine Kopie der Vorlage, bevor du sie vereinfachst. Wenn ein Logo von einem nicht unterstützten Effekt abhängt, erwäge, diesen Teil als gewöhnliche Geometrie neu aufzubauen oder einen anderen überprüfbaren Exportweg zu verwenden. Behalte das originale Rasterbild, wenn das fotografische Erscheinungsbild wichtiger ist als Pfadbearbeitung. Ein gerastertes Bild kann das Erscheinungsbild erhalten, verändert aber die Vektoranforderung.
Wähle bei Schriftzügen bewusst zwischen Dokumenttext und Grafik in Pfaden. Wörter als Text zu behalten ermöglicht Bearbeiten und Suchen, erfordert aber die vorgesehene Schrift im Dokumentablauf. Freigegebene Logoschrift in Pfade umzuwandeln erhält ihre Form und gibt normale Textbearbeitung auf. Unser reines Pfademblem testet keine Schriftverarbeitung; verwende ein echtes Muster deiner Schrift, bevor du dich auf dieselbe Verarbeitungskette verlässt.
Wenn du das Dokument statt in Python in einem Satzsystem zusammenstellst, erklärt der SVG-in-LaTeX-Ablauf einen separaten Weg für Grafik und Beschriftungen.
Ein reines Rasterlogo vor der PDF-Platzierung rekonstruieren
Ein altes PNG auf einer Rechnungsvorlage ist ein plausibler Kandidat für eine Vektorrekonstruktion, wenn die ursprüngliche Logodatei fehlt. Sieh dir die Rastergrafik mit PerfectVectors Logo-Vektorisierer als SVG an, prüfe Konturen und Aussparungen und lade einen Kandidaten für deine Dokumentverarbeitung herunter.
Prüfe kleine Schrift und Ränder vor dem Import. Zeichne oder setze Elemente, die exakte Typografie benötigen, neu und entferne unerwünschte Hintergrundgeometrie in einem Editor. Der Leitfaden zur Logo-Vektorisierung behandelt diese Entscheidung von Quelle zu Vorlage ausführlicher.
Führe dann den tatsächlichen ReportLab-Import und die PDF-Prüfungen oben aus. Auch eine gute Nachzeichnung muss den Importer überstehen und in dein Dokument passen. PerfectVector liefert Grafikpfade; es wählt keine ReportLab-Koordinaten, registriert keine Dokumentschriften und prüft nicht die resultierende PDF. Erzeuge Diagramme neu aus Daten und Diagrammquelle, statt ihre Beschriftungen oder dargestellten Werte nachzuzeichnen.
FAQ
Kann ich ein SVG als gewöhnliches Bitmap-Bild an ReportLab übergeben? Verwende bei diesem Vektorablauf svglib, um ein Drawing zu erzeugen, und rendere es mit renderPDF. Wenn du das SVG zuerst in PNG konvertierst, entsteht stattdessen eine Rastereinfügung.
Warum ist mein importiertes SVG kleiner als in einem älteren Beispiel? Das getestete svglib 2.2.0 bildet CSS-Pixel mit dem Faktor 0.75 auf PDF-Punkte ab. Lies die zurückgegebenen Zeichnungsabmessungen und passe sie in ein ausdrücklich festgelegtes Feld ein, statt dich auf ältere Pixel-zu-Punkt-Annahmen zu verlassen.
Erhält das jeden SVG-Effekt? Nein. Der Importer hat dokumentierte Funktionsgrenzen, darunter Masken und foreignObject. Vergleiche die exportierte PDF mit der vorgesehenen Grafik, auch wenn das Skript fehlerfrei abgeschlossen wird.
Sollte ich einen Diagramm-Screenshot vektorisieren? Erzeuge ein Diagramm wann immer möglich neu aus seinen Daten und seiner Diagrammquelle. Nutze Logo-Nachzeichnung für geeignete dekorative Grafik, deren bearbeitbares Original fehlt.
Quellen
- svglib — Paket- und Einheitendokumentation — SVG-zu-Drawing-Konvertierung, Installation und Größen in PDF-Punkten.
- ReportLab — Grafik — Zeichnungsobjekte, PDF-Rendering und Verwendung als Platypus-Flowables.
- ReportLab — Grafik und Text mit pdfgen — Canvas-Koordinaten, Punkte und Transformationen.
- svglib — Bekannte Einschränkungen — Importbeschränkungen, die eine Prüfung der fertigen PDF erfordern.
Behalte das bearbeitbare Original, wenn du eines hast. Wenn nur Rasterlogografik übrig ist, erstelle einen SVG-Logokandidaten, prüfe seine Pfade, platziere ihn dann in der erforderlichen Größe und prüfe die fertige PDF.
Mehr aus dem Blog

fpdf2-SVG-Bilder: Pfade in deiner Python-PDF erhalten
Platziere ein SVG-Logo mit fpdf2 in einer Python-PDF, bestimme seine Größe, prüfe gespeicherte Pfade und untersuche fehlenden Text oder Formen vor einem Rasterersatz.

PDFKit-SVG: Ein Vektorlogo ohne Rasterisierung platzieren
Füge ein vollständiges SVG-Logo in ein PDFKit-Dokument ein, bestimme seine Größe in Punkten und prüfe die gespeicherte PDF auf Pfade, Aussparungen, fehlende Merkmale und eingebettete Bilder.