ReportLab SVG: loghi nitidi nei PDF generati
Inserisci loghi SVG nei PDF ReportLab con svglib, conservane le proporzioni e controlla tracciati vettoriali, dimensioni corrette e dettagli mancanti nel file finale.
In questa pagina
Usa svglib.svg2rlg() per leggere un SVG in un Drawing ReportLab, poi inserisci quel disegno con renderPDF.draw(). Assegnagli un riquadro misurato sulla pagina e usa un solo fattore di scala per entrambi gli assi. Questo conserva la geometria compatibile del logo sotto forma di istruzioni di disegno PDF invece di inserire uno screenshot bitmap.
Per un'esportazione autonoma senza impaginazione del documento, la procedura di dimensionamento CairoSVG confronta pixel PNG, dimensioni delle pagine PDF e DPI.
La prova utile è il PDF finale: l'emblema ha mantenuto proporzioni, colori e piccole aperture alle dimensioni richieste dal documento? Una chiamata Python riuscita non risponde a queste domande. L'esempio seguente inserisce due volte lo stesso emblema originale e controlla il file prodotto.
Se hai già il logo come grafica vettoriale modificabile, inizia da quello. Se rimane soltanto un PNG o JPG, recupera un originale vettoriale prima di costruire il documento. Foto e grafici numerici richiedono una scelta diversa del sorgente.
Importa la grafica come disegno
La procedura documentata di svglib converte SVG in oggetti di disegno ReportLab. La guida grafica di ReportLab spiega che questi disegni possono essere renderizzati su un canvas o usati come oggetti impaginabili Platypus. Per questo esempio, un canvas dà a ogni inserimento posizione e dimensioni esplicite.
Abbiamo eseguito l'esempio con Python 3.12, svglib 2.2.0 e ReportLab 4.4.9. Installa i due pacchetti nelle versioni fissate nell'ambiente del progetto:
python -m pip install "svglib==2.2.0" "reportlab==4.4.9"Salva questo piccolo emblema come logo.svg. Contiene tre tracciati con riempimenti pieni e nessuna immagine collegata, carattere o effetto. È grafica scritta a mano per questa dimostrazione, non un risultato di conversione 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>Il viewBox dell'SVG descrive il rettangolo di coordinate interno. I valori width e height del disegno importato indicano le dimensioni da usare per il posizionamento nel PDF. Leggili invece di presumere che un pixel SVG equivalga a un punto PDF.
Per questo file, svglib 2.2.0 ha restituito 180 × 90 punti. La sua attuale documentazione sulle unità associa un pixel CSS a 0.75 punti PDF. Gli esempi meno recenti potrebbero usare ipotesi diverse, quindi controlla le dimensioni quando aggiorni una procedura esistente.
Adatta il logo senza deformarlo
Salva il codice seguente come place_logo.py accanto all'SVG ed esegui python place_logo.py. Tutte le posizioni sulla pagina e le dimensioni dei riquadri sono in punti PDF. Ci sono 72 punti in un pollice; l'origine predefinita del canvas è in basso a sinistra, come descritto nella guida al canvas di 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() sceglie la dimensione limitante, così il disegno rientra nel riquadro. Usare lo stesso fattore per X e Y conserva le proporzioni. Questa funzione ancora il disegno all'angolo inferiore sinistro del riquadro; lo spazio inutilizzato rimane sopra o a destra. Centralo separatamente se la disposizione lo richiede.
La trasformazione del canvas è temporanea. restoreState() evita che la scala del logo cambi testo o elementi della pagina successivi, e il disegno originale rimane disponibile per il secondo inserimento.
Nella prova, i due fattori erano 0.8 e 1.6, producendo grafica di 144 × 72 pt e 288 × 144 pt. L'anteprima aggiunge etichette e uno sfondo agli stessi due posizionamenti per rendere facile il confronto delle dimensioni.

Per un documento Platypus, un disegno può entrare nella sequenza del documento come oggetto impaginabile. Dopo averne ridimensionato il contenuto con drawing.scale(factor, factor), aggiorna drawing.width e drawing.height con lo stesso fattore affinché l'impaginazione usi il nuovo ingombro. Parti da un nuovo disegno quando applichi dimensioni diverse. L'esempio canvas sopra evita di cambiare il disegno stesso.
Controlla separatamente geometria e aspetto
Abbiamo ispezionato il flusso di contenuto del PDF di prova con pypdf 6.10.0. Conteneva sei operazioni di inizio tracciato, corrispondenti ai tre tracciati dell'emblema disegnati due volte, e zero immagini nella pagina. Abbiamo anche renderizzato l'intera pagina con Poppler e ispezionato i due emblemi. Forme, sovrapposizione, barra verticale e proporzioni corrispondevano ai posizionamenti previsti.
Queste osservazioni riguardano questo semplice esempio. Il solo conteggio dei tracciati non dimostra che ogni caratteristica di un altro SVG sia stata renderizzata correttamente. Analogamente, ingrandire un PDF sullo schermo non può stabilire con certezza se contenga istruzioni vettoriali o una bitmap grande.
Per il tuo documento:
- Confronta il PDF finale con l'SVG in un browser o editor. Cerca dettagli mancanti, riempimenti cambiati, ritagli e aree bianche inattese.
- Controlla l'emblema alle dimensioni previste nel documento, dove spazi stretti e tratti fini devono rimanere leggibili.
- Ispeziona gli oggetti immagine PDF se la procedura richiede grafica vettoriale. Tieni conto delle foto intenzionali altrove nella pagina.
- Mantieni l'originale SVG accanto al codice di generazione del documento. Ricontrolla il PDF dopo aver cambiato grafica o dipendenze di rendering.
Un SVG può contenere esso stesso un'immagine raster. Leggere quel contenitore non recupera tracciati dai suoi pixel. La diagnosi delle immagini incorporate aiuta a distinguere un originale vettoriale da un SVG che contiene ancora una bitmap.
Gestisci le funzionalità che l'importatore non può riprodurre
Gli attuali limiti di svglib includono maschere ed elementi foreignObject non supportati, regole @import dei fogli di stile ignorate e restrizioni su CSS e ritaglio. Un'anteprima nel browser non può quindi sostituire la verifica dell'importatore PDF.
Conserva una copia dell'originale prima di semplificarlo. Quando un logo dipende da un effetto non supportato, valuta di ricostruire quella parte come geometria ordinaria o di usare un'altra procedura di esportazione verificabile. Mantieni il raster originale quando l'aspetto fotografico conta più della modifica dei tracciati. Un'immagine rasterizzata può conservare l'aspetto, ma cambia il requisito vettoriale.
Per le scritte, scegli deliberatamente tra testo del documento e grafica convertita in contorni. Mantenere le parole come testo consente modifica e ricerca, ma richiede che il carattere previsto sia disponibile nella procedura del documento. Convertire in contorni le scritte approvate del logo ne conserva la forma rinunciando alla normale modifica del testo. Il nostro emblema composto soltanto da tracciati non verifica la gestione dei caratteri; usa un campione reale del tuo testo prima di affidarti alla stessa procedura.
Se assembli il documento in un sistema di composizione tipografica invece di Python, la procedura SVG in LaTeX spiega un metodo separato per grafica ed etichette.
Recupera un logo solo raster prima di inserirlo nel PDF
Un vecchio PNG in un modello di fattura è un candidato ragionevole per il recupero vettoriale quando manca il file originale del logo. Con il vettorializzatore di loghi di PerfectVector, visualizza la grafica raster come SVG, ispeziona contorni e aperture e scarica un candidato per la procedura del documento.
Controlla scritte piccole e bordi prima di importarlo. Ridisegna o ricomponi gli elementi che richiedono tipografia esatta e rimuovi la geometria di sfondo indesiderata in un editor. La guida alla vettorializzazione dei loghi tratta più in dettaglio questa decisione dal sorgente all'originale vettoriale.
Esegui poi l'importazione ReportLab effettiva e i controlli PDF sopra. Anche un buon ricalco deve sopravvivere all'importatore e adattarsi al documento. PerfectVector fornisce tracciati grafici; non sceglie le coordinate ReportLab, non registra i caratteri del documento e non verifica il PDF risultante. Per i grafici, rigenera dai dati e dal sorgente di rappresentazione invece di ricalcare etichette o valori tracciati.
FAQ
Posso passare un SVG a ReportLab come normale immagine bitmap? Usa svglib per produrre un Drawing e renderizzalo con renderPDF per questa procedura vettoriale. Convertire prima l'SVG in PNG produce invece un inserimento raster.
Perché il mio SVG importato è più piccolo che in un esempio precedente? La versione verificata svglib 2.2.0 associa pixel CSS e punti PDF con un fattore di 0.75. Leggi le dimensioni del disegno restituito e adattale a un riquadro esplicito invece di affidarti alle vecchie ipotesi pixel-punti.
Questo conserva ogni effetto SVG? No. L'importatore ha limiti documentati delle funzionalità, incluse maschere e foreignObject. Confronta il PDF esportato con la grafica prevista, anche quando lo script termina senza errori.
Devo vettorializzare uno screenshot di un grafico? Rigenera un grafico dai dati e dal sorgente di rappresentazione ogni volta che è possibile. Riserva il ricalco dei loghi a grafica decorativa adatta il cui originale modificabile è mancante.
Fonti
- svglib — Documentazione del pacchetto e delle unità — Conversione da SVG a Drawing, installazione e dimensionamento in punti PDF.
- ReportLab — Grafica — Oggetti Drawing, rendering PDF e utilizzo come oggetti impaginabili Platypus.
- ReportLab — Grafica e testo con pdfgen — Coordinate canvas, punti e trasformazioni.
- svglib — Limiti noti — Restrizioni di importazione che richiedono il controllo del PDF finale.
Conserva l'originale modificabile quando lo possiedi. Se rimane soltanto grafica raster del logo, prepara un candidato SVG del logo, ispeziona i tracciati, poi inseriscilo alle dimensioni richieste e controlla il PDF finale.
Altro dal blog

Immagini SVG con fpdf2: tracciati nel PDF Python
Inserisci un logo SVG in un PDF Python con fpdf2, controllane le dimensioni e i tracciati salvati e diagnostica testo o forme mancanti prima di usare un raster.

PDFKit SVG: inserisci un logo senza rasterizzarlo
Inserisci un logo SVG completo in un documento PDFKit, impostane le dimensioni in punti e verifica tracciati, aperture, funzionalità mancanti e immagini nel PDF salvato.