PerfectVector
Oleh Irene Kim7 menit baca

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.

Di halaman ini

Gunakan pdf.image("logo.svg", x=20, y=20, w=60) untuk menempatkan SVG dalam dokumen fpdf2. Geometri SVG yang didukung menjadi path gambar PDF. Anda tidak perlu merender logo ke PNG terlebih dahulu. Dokumentasi SVG resmi menjelaskan jalur langsung ini beserta batasannya.

Jika formatnya sendiri masih baru bagi Anda, panduan file SVG menjelaskan path dan wadah gambar. Impor yang berhasil tetap perlu diperiksa. File dapat berisi piksel tertanam, bergantung pada fitur yang tidak direproduksi pengimpor, atau memiliki ruang kosong di sekitar karyanya. Panduan ini membuat logo asli kecil, menempatkannya pada ukuran eksplisit, dan memeriksa PDF yang dihasilkan. Pertahankan master vektor yang ada jika Anda memilikinya; merekonstruksi karya dari PNG atau JPG adalah langkah terpisah sebelumnya.

Mulai dengan SVG yang diketahui dan versi fpdf2 tetap

Kami menjalankan contoh dengan Python 3.12 dan fpdf2 2.8.8. Itu adalah versi yang diuji, bukan janji bahwa setiap rilis berikutnya berperilaku identik. Halaman PyPI resmi paket mendokumentasikan instalasi dengan nama distribusi fpdf2; impor Python-nya adalah fpdf.

Gunakan lingkungan baru agar contoh independen dari paket proyek lain:

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

Pada Windows, aktifkan lingkungan dengan .venv\Scripts\activate sebagai gantinya. Simpan lambang persegi panjang asli ini sebagai 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>

Ada dua subpath tertutup. Persegi panjang luar terisi, dan persegi panjang dalam menjadi bukaan melalui aturan isian evenodd. Tidak ada font, image, atau efek, sehingga pengujian pertama mudah didiagnosis.

Simpan kode berikut sebagai place_logo.py di samping 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"))

Jalankan python place_logo.py. Buka logo.pdf dan periksa bingkai persegi panjang hijau kebiruan dekat sudut kiri atas, dengan halaman terlihat melalui bagian tengahnya.

Pisahkan kanvas SVG dari logo yang berwarna

Kanvas sumber memiliki rasio 3:2: lebar 120 satuan dan tinggi 80. Pada w=60, contoh ini menempati kanvas 60 × 40 mm. Karya dimulai 10 satuan sumber di dalam kanvas itu, sehingga persegi panjang luar yang berwarna berukuran 50 × 30 mm, dimulai pada 25, 25 mm di halaman. Itu adalah perhitungan dari koordinat dan skala contoh ini.

Margin tersebut menjelaskan mengapa pengukuran bentuk berwarna memberikan jawaban berbeda dari pengukuran kanvas penempatan. Jika logo pelanggan tampak terlalu kecil, periksa margin sumber sebelum memperbesar lebar PDF-nya.

Panduan image fpdf2 menjelaskan penanganan dimensi dan opsi mempertahankan proporsi di dalam kotak yang ditentukan. Untuk contoh pertama ini, tetapkan hanya lebarnya. Jika kemudian Anda memberikan kedua dimensi, uji secara sengaja penyesuaian yang diinginkan alih-alih menganggap setiap sumber memiliki proporsi yang sama.

Ilustrasi logo persegi panjang di dalam kanvasnya yang lebih besar, lalu ditempatkan pada halaman dokumen
Kanvas penempatan mencakup ruang kosong di sekitar karya. Ilustrasi ini menjelaskan kedua batas; periksa PDF yang diekspor untuk memverifikasi dimensi Anda yang sebenarnya.

Verifikasi PDF tersimpan berisi path

Pratinjau PDF memperlihatkan tampilan, tetapi image dapat terlihat tajam pada pembesaran sedang. Periksa juga filenya. Kami memeriksa contoh terisolasi dengan 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"))

Keluaran kami melaporkan nol image pada halaman. Konten yang didekode berisi kontur persegi panjang yang dinyatakan melalui operasi move, line, dan close-path, diikuti f*, operasi isian even-odd. Bersama bukaan yang terlihat dalam render, itu mendukung kesimpulan bahwa contoh tanpa image ini tetap berupa geometri gambar dalam PDF tersimpan.

Jangan menerapkan kesimpulan itu pada masukan berbeda tanpa memeriksanya. Laporan dapat memang berisi foto di tempat lain; SVG sendiri dapat berisi image. Diagnosis raster tertanam membantu membedakan logo berbasis path dari bitmap yang dibungkus dalam markup SVG. PDF lebih rumit juga dapat menempatkan konten gambar dalam objek yang dirujuk, sehingga skrip singkat di atas adalah titik awal untuk contoh terisolasi ini, bukan audit PDF universal.

Diagnosiskan karya yang hilang dengan rilis yang Anda instal

Mulai dengan menjalankan lambang kecil di atas. Jika contoh itu bekerja sementara logo produksi Anda gagal, Anda telah mempersempit masalah ke karya sumber atau fitur yang dipakainya. Pertahankan asli dan sederhanakan salinan satu fitur setiap kali.

GejalaPemeriksaan pertamaLangkah berikutnya yang berguna
Halaman kosongPath file, penempatan, dimensi, dan peringatan pengimporUji lambang sederhana pada koordinat eksplisit
Logo tampak terlalu kecilRuang kosong di dalam kanvas sumberBandingkan batas area berwarna dengan viewBox
Bagian tengah terisiStruktur path majemuk dan aturan isianPertahankan bukaan saat menyunting atau mengekspor
Tulisan hilang atau berbedaRilis yang diinstal, pilihan font, dan fitur teksUji sampel teks terpisah atau gunakan tulisan logo outline yang disetujui
Dekorasi hilangFitur SVG yang tidak didukungHapus fitur itu dari salinan dan bandingkan hasil
PDF tajam tetapi mungkin berisi pikselImage tertanam dalam sumber dan PDFPeriksa struktur file selain pratinjau

Jawaban lama perlu disikapi hati-hati di sini. Pengujian 2.8.8 terpisah kami yang berisi elemen <text> sederhana menghasilkan teks HELLO yang dapat diekstrak, dan persegi panjang dengan gradasi linear dasar berhasil diekspor. Pemeriksaan terbatas ini tidak membuktikan kompatibilitas penuh teks SVG, font, CSS, atau gradasi. Namun, hasilnya menunjukkan mengapa pernyataan lama bahwa semua teks SVG atau semua gradasi tidak didukung dapat mengarahkan Anda pada rasterisasi yang tidak diperlukan.

Daftar fitur SVG saat ini masih menyebut batasan seperti marker, pattern, teks pada path, serta CSS kompleks atau eksternal. Biarkan peringatan pengimpor terlihat selama diagnosis dan bandingkan halaman tersimpan dengan sumber. Log bersih saja bukan bukti bahwa setiap fitur visual bertahan.

Gunakan alternatif raster ketika sesuai dengan hasil yang dibutuhkan

Jika efek tidak dapat direproduksi dalam pipeline yang dipilih, putuskan apakah mempertahankan tampilannya lebih penting daripada mempertahankan geometri. PNG hasil render mungkin sesuai untuk bagian dokumen itu. Periksa pada ukuran fisik akhir dan jelaskan keluaran secara akurat; menyematkan render raster tidak mempertahankan path asli.

Untuk logo merek, tulisan outline yang disetujui atau ekspor vektor yang lebih sederhana mungkin merupakan pilihan lebih baik. Untuk teks dokumen yang bisa diedit, pertahankan penanganan font dan teks dalam alur dokumen. Men-trace tangkapan layar sebuah kalimat tidak memulihkan tipografinya atau menjadikannya teks yang dapat dipilih.

Jika kode PDF Anda yang ada memakai pustaka Python lain, alur SVG ReportLab memiliki pemeriksaan impor dan ukurannya sendiri. Mengganti pustaka adalah keputusan implementasi terpisah, jadi uji fitur yang benar-benar bermasalah sebelum membuat ulang dokumen.

Siapkan karya yang hanya berupa raster sebelum tahap PDF

Ketika logo yang tersisa hanya PNG atau JPG, vektorisasi logo PerfectVector dapat menyiapkan kandidat SVG sebelum diimpor dengan fpdf2. Bandingkan kontur, bukaan kecil, dan wilayah warna dengan sumber, lalu jalankan kandidat melalui pemeriksaan penempatan dan PDF yang sama.

Gunakan vektor asli jika tersedia. Tulisan merek yang persis mungkin memerlukan pengetikan ulang atau koreksi manual; panduan vektorisasi logo menjelaskan pilihan itu. Lambang dalam artikel ini adalah SVG asli yang dibuat manual, bukan hasil konversi PerfectVector yang diukur. PerfectVector menyiapkan karya, sementara fpdf2 mengendalikan penempatannya dalam PDF.

FAQ

Bisakah fpdf2 memasukkan SVG secara langsung? Ya. Berikan file SVG ke metode image dan tetapkan penempatan serta ukurannya. Geometri yang didukung dapat menjadi path PDF, tetapi periksa file ekspor dan tampilannya untuk karya Anda sendiri.

Apakah fpdf2 mendukung teks SVG? Pengujian teks dasar kami bekerja dengan fpdf2 2.8.8. Itu tidak menjamin setiap font, fitur tata letak, atau konstruksi teks pada path. Periksa rilis yang Anda instal dan uji tulisan yang benar-benar dipakai dokumen.

Mengapa gambar 60 mm terlihat lebih sempit dari 60 mm? Ukuran yang diminta berlaku pada kanvas penempatan. Margin kosong di dalam SVG tetap menjadi bagian kanvas itu, sehingga bentuk berwarna bisa lebih sempit.

Haruskah saya mengonversi logo PNG ke SVG sebelum menambahkannya? Hanya jika Anda memerlukan path yang bisa diedit dan karyanya cocok untuk tracing. Pertahankan foto sebagai gambar raster, dan gunakan logo vektor asli jika tersedia. Periksa kandidat hasil tracing sebelum memasukkannya.

Sources

  1. fpdf2 — SVG — Mendokumentasikan penyisipan SVG langsung, dukungan fitur, dan log peringatan.
  2. fpdf2 — Images — Menjelaskan penempatan gambar, dimensi, dan penyesuaian rasio aspek.
  3. fpdf2 — Paket PyPI — Mengidentifikasi distribusi yang dapat diinstal dan konvensi impor Python-nya.

Hanya punya logo raster? Siapkan kandidat SVG dengan PerfectVector, periksa kontur dan bukaannya, lalu tempatkan pada ukuran yang diperlukan dengan fpdf2 dan periksa PDF tersimpan.

Lebih banyak dari blog

Mulai dengan SVG yang lebih rapi
dan lebih mudah diedit