SVG ReportLab: Jaga Path Logo Tetap Tajam dalam PDF yang Dibuat
Tempatkan logo SVG dalam PDF ReportLab dengan svglib, pertahankan proporsinya, dan periksa file akhir untuk path vektor, ukuran yang benar, dan detail yang hilang.
Di halaman ini
Gunakan svglib.svg2rlg() untuk membaca SVG menjadi Drawing ReportLab, lalu tempatkan drawing tersebut dengan renderPDF.draw(). Berikan kotak terukur pada halaman dan gunakan satu faktor skala untuk kedua sumbu. Ini menjaga geometri logo yang sesuai sebagai instruksi gambar PDF alih-alih menyisipkan tangkapan layar bitmap.
Untuk ekspor mandiri tanpa tata letak dokumen, alur kerja ukuran CairoSVG membandingkan piksel PNG, dimensi halaman PDF, dan DPI.
Pengujian yang berguna adalah PDF akhir: apakah lambang mempertahankan proporsi, warna, dan bukaan kecilnya pada ukuran yang dibutuhkan dokumen Anda? Pemanggilan Python yang berhasil tidak menjawab pertanyaan tersebut. Contoh di bawah menempatkan lambang orisinal yang sama dua kali dan memeriksa file yang dihasilkan.
Jika Anda sudah memiliki logo sebagai artwork vektor yang dapat diedit, mulailah dari sana. Jika hanya PNG atau JPG yang tersisa, pulihkan master vektor sebelum membangun dokumen. Foto dan grafik numerik membutuhkan keputusan sumber yang berbeda.
Impor artwork sebagai drawing
Alur kerja svglib yang didokumentasikan mengonversi SVG menjadi objek drawing ReportLab. Panduan graphics ReportLab menjelaskan bahwa drawing tersebut dapat dirender ke canvas atau digunakan sebagai flowable Platypus. Untuk contoh ini, canvas memberikan posisi dan ukuran eksplisit pada setiap penempatan.
Kami menjalankan contoh dengan Python 3.12, svglib 2.2.0, dan ReportLab 4.4.9. Instal kedua paket dengan versi yang dikunci dalam lingkungan proyek Anda:
python -m pip install "svglib==2.2.0" "reportlab==4.4.9"Simpan lambang kecil ini sebagai logo.svg. Lambang berisi tiga path dengan isian solid dan tanpa gambar tertaut, font, atau efek. Ini adalah artwork buatan tangan untuk demonstrasi ini, bukan hasil konversi 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>viewBox SVG menjelaskan persegi panjang koordinat internalnya. width dan height drawing yang diimpor memberi tahu dimensi yang sebaiknya Anda gunakan untuk penempatan PDF. Baca nilainya alih-alih menganggap satu piksel SVG sama dengan satu poin PDF.
Untuk file ini, svglib 2.2.0 mengembalikan 180 × 90 poin. Dokumentasi unit saat ini memetakan satu piksel CSS ke 0.75 poin PDF. Contoh lama mungkin menggunakan asumsi berbeda, jadi periksa dimensi ketika meningkatkan versi pipeline yang sudah ada.
Sesuaikan logo tanpa meregangkannya
Simpan yang berikut sebagai place_logo.py di samping SVG dan jalankan python place_logo.py. Semua posisi halaman dan dimensi kotak di sini menggunakan poin PDF. Ada 72 poin dalam satu inci; titik asal canvas default berada di kiri bawah, seperti yang dijelaskan dalam panduan canvas 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() memilih dimensi pembatas, sehingga drawing muat di dalam kotak. Menggunakan faktor yang sama untuk X dan Y mempertahankan proporsi. Fungsi ini menambatkan drawing di sudut kiri bawah kotak; ruang yang tidak digunakan tetap di atas atau di kanan. Pusatkan secara terpisah jika tata letak Anda memerlukannya.
Transformasi canvas bersifat sementara. restoreState() mencegah penskalaan logo mengubah teks atau elemen halaman berikutnya, dan drawing asli tetap tersedia untuk penempatan kedua.
Dalam pengujian, kedua faktornya adalah 0.8 dan 1.6, menghasilkan artwork 144 × 72 pt dan 288 × 144 pt. Pratinjau menambahkan label dan latar belakang pada dua penempatan yang sama agar ukurannya mudah dibandingkan.

Untuk dokumen Platypus, drawing dapat bergabung dalam story sebagai flowable. Setelah menskalakan kontennya dengan drawing.scale(factor, factor), perbarui drawing.width dan drawing.height dengan faktor yang sama agar tata letak menggunakan ukuran baru. Gunakan drawing baru ketika menerapkan ukuran berbeda. Contoh canvas di atas menghindari perubahan drawing itu sendiri.
Periksa geometri dan tampilan secara terpisah
Kami memeriksa content stream PDF pengujian dengan pypdf 6.10.0. Stream berisi enam operasi awal path, sesuai dengan tiga path lambang yang digambar dua kali, dan nol gambar halaman. Kami juga merender seluruh halaman dengan Poppler dan memeriksa kedua lambang. Bentuk, tumpang tindih, batang vertikal, dan proporsinya sesuai dengan penempatan yang dimaksudkan.
Pengamatan itu berlaku untuk fixture sederhana ini. Menghitung path saja tidak membuktikan bahwa setiap fitur SVG lain dirender dengan benar. Demikian pula, memperbesar PDF di layar tidak dapat secara pasti memberi tahu apakah PDF berisi instruksi vektor atau bitmap besar.
Untuk dokumen Anda sendiri:
- Bandingkan PDF akhir dengan SVG di browser atau editor. Cari detail hilang, isian berubah, clipping, dan area putih tak terduga.
- Periksa lambang pada ukuran dokumen yang dimaksudkan, ketika celah sempit dan stroke halus harus tetap terbaca.
- Periksa objek gambar PDF jika alur kerja membutuhkan artwork vektor. Perhitungkan foto yang sengaja ada di tempat lain pada halaman.
- Simpan master SVG bersama kode pembuatan dokumen. Periksa kembali PDF setelah mengubah artwork atau dependensi rendering-nya.
SVG sendiri dapat berisi gambar raster. Membaca pembungkus tersebut tidak memulihkan path dari pikselnya. Diagnosis gambar tertanam membantu membedakan master vektor dari SVG yang masih membawa bitmap.
Tangani fitur yang tidak dapat direproduksi importer
Keterbatasan svglib saat ini mencakup mask dan elemen foreignObject yang tidak didukung, aturan stylesheet @import yang diabaikan, serta pembatasan CSS dan clipping. Karena itu, pratinjau browser tidak dapat menggantikan pengujian importer PDF.
Simpan salinan master sebelum menyederhanakannya. Ketika logo bergantung pada efek yang tidak didukung, pertimbangkan membangun ulang bagian tersebut sebagai geometri biasa atau menggunakan jalur ekspor berbeda yang dapat Anda verifikasi. Pertahankan raster asli ketika tampilan fotografis lebih penting daripada pengeditan path. Gambar yang diratakan dapat mempertahankan tampilan, tetapi mengubah pemenuhan persyaratan vektor.
Untuk tulisan, pilih secara sengaja antara teks dokumen dan artwork ber-outline. Menjaga kata sebagai teks memungkinkan pengeditan dan pencarian, tetapi mengharuskan font yang dimaksudkan tersedia dalam alur kerja dokumen. Mengubah tulisan logo yang diterima menjadi outline mempertahankan bentuknya sambil mengorbankan pengeditan teks normal. Lambang kami yang hanya berupa path tidak menguji penanganan font; gunakan sampel nyata tulisan Anda sebelum mengandalkan pipeline yang sama.
Jika Anda merangkai dokumen dalam sistem typesetting alih-alih Python, alur kerja SVG dalam LaTeX menjelaskan jalur gambar dan label yang terpisah.
Pulihkan logo yang hanya berupa raster sebelum penempatan PDF
PNG lama pada template faktur merupakan kandidat yang masuk akal untuk pemulihan vektor ketika file logo asli hilang. Dengan alat vektorisasi logo PerfectVector, lihat pratinjau artwork raster sebagai SVG, periksa kontur dan bukaan, dan unduh kandidat untuk pipeline dokumen Anda.
Periksa tulisan kecil dan batas sebelum mengimpornya. Gambar ulang atau ketik ulang elemen yang membutuhkan tipografi tepat, dan hapus geometri latar belakang yang tidak diinginkan di editor. Panduan vektorisasi logo membahas keputusan dari sumber ke master itu secara lebih terperinci.
Kemudian jalankan impor ReportLab dan pemeriksaan PDF sebenarnya di atas. Hasil penelusuran yang baik tetap harus bertahan melewati importer dan sesuai dengan dokumen Anda. PerfectVector menyediakan path artwork; alat ini tidak memilih koordinat ReportLab, mendaftarkan font dokumen, atau memverifikasi PDF yang dihasilkan. Untuk grafik, buat ulang dari data dan sumber plot alih-alih menelusuri label atau nilai yang diplot.
FAQ
Dapatkah saya memberikan SVG ke ReportLab sebagai gambar bitmap biasa? Gunakan svglib untuk menghasilkan Drawing dan render dengan renderPDF untuk alur kerja vektor ini. Mengonversi SVG ke PNG terlebih dahulu menghasilkan penyisipan raster.
Mengapa SVG impor saya lebih kecil daripada contoh lama? svglib 2.2.0 yang diuji memetakan piksel CSS ke poin PDF dengan faktor 0.75. Baca dimensi drawing yang dikembalikan dan sesuaikan ke kotak eksplisit alih-alih mengandalkan asumsi piksel-ke-poin lama.
Apakah ini mempertahankan setiap efek SVG? Tidak. Importer memiliki batas fitur yang didokumentasikan, termasuk mask dan foreignObject. Bandingkan PDF hasil ekspor dengan artwork yang dimaksudkan, meskipun skrip selesai tanpa error.
Haruskah saya memvektorisasi tangkapan layar grafik? Buat ulang grafik dari data dan sumber plotnya bila memungkinkan. Gunakan penelusuran logo untuk artwork dekoratif yang sesuai dan kehilangan sumber asli yang dapat diedit.
Sources
- svglib — Dokumentasi paket dan unit — Konversi SVG-ke-Drawing, instalasi, dan ukuran dalam poin PDF.
- ReportLab — Graphics — Objek drawing, rendering PDF, dan penggunaan sebagai flowable Platypus.
- ReportLab — Gambar dan teks dengan pdfgen — Koordinat canvas, poin, dan transformasi.
- svglib — Keterbatasan yang diketahui — Pembatasan impor yang memerlukan pemeriksaan PDF akhir.
Pertahankan sumber asli yang dapat diedit ketika Anda memilikinya. Jika hanya artwork logo raster yang tersisa, siapkan kandidat logo SVG, periksa path-nya, lalu tempatkan pada ukuran yang diperlukan dan periksa PDF akhir.
Lebih banyak dari blog

Gambar SVG fpdf2: Pertahankan Path dalam PDF Python
Tempatkan logo SVG dalam PDF Python dengan fpdf2, atur ukurannya, periksa path tersimpan, dan diagnosiskan teks atau bentuk yang hilang sebelum memakai alternatif raster.

SVG PDFKit: Tempatkan Logo Vektor Tanpa Rasterisasi
Masukkan logo SVG lengkap ke dokumen PDFKit, tetapkan ukuran dalam point, dan periksa path, bukaan, fitur hilang, serta gambar tertanam dalam PDF tersimpan.