ReportLab SVG: PDF'lerde logo yollarını net tutun
SVG logolarını svglib ile ReportLab PDF'lerine yerleştirin, oranlarını koruyun ve bitmiş dosyada vektör yollarını, doğru boyutu ve eksik ayrıntıları kontrol edin.
Bu sayfada
Bir SVG'yi ReportLab Drawing nesnesine okumak için svglib.svg2rlg() kullanın, ardından çizimi renderPDF.draw() ile yerleştirin. Sayfada ölçüleri belirlenmiş bir kutu ayırın ve her iki eksen için tek bir ölçek katsayısı kullanın. Böylece uygun logo geometrisi, bir bitmap ekran görüntüsü eklemek yerine PDF çizim talimatları olarak korunur.
Belge yerleşimi olmadan bağımsız bir dışa aktarım için CairoSVG boyutlandırma iş akışı, PNG piksellerini, PDF sayfa boyutlarını ve DPI'ı karşılaştırır.
Asıl yararlı test, bitmiş PDF'dir: amblem, belgenizin gerektirdiği boyutta oranlarını, renklerini ve küçük boşluklarını korudu mu? Başarılı bir Python çağrısı bu soruları yanıtlamaz. Aşağıdaki örnek aynı özgün amblemi iki kez yerleştirir ve ürettiği dosyayı kontrol eder.
Logo zaten düzenlenebilir vektör çizimi olarak elinizdeyse onunla başlayın. Yalnızca PNG veya JPG hali kaldıysa belgeyi oluşturmadan önce bir vektör ana dosyası elde edin. Fotoğraflar ve sayısal grafikler için farklı bir kaynak kararı gerekir.
Çizimi bir Drawing nesnesi olarak içe aktarın
svglib'nin belgelenmiş iş akışı, SVG'yi ReportLab çizim nesnelerine dönüştürür. ReportLab'ın grafik kılavuzu, bu çizimlerin canvas üzerine render edilebileceğini veya Platypus flowable nesneleri olarak kullanılabileceğini açıklar. Bu örnekte canvas, her yerleştirme için açıkça belirlenmiş bir konum ve boyut sağlar.
Örneği Python 3.12, svglib 2.2.0 ve ReportLab 4.4.9 ile çalıştırdık. Sürümleri sabitlenmiş iki paketi proje ortamınıza kurun:
python -m pip install "svglib==2.2.0" "reportlab==4.4.9"Bu küçük amblemi logo.svg olarak kaydedin. Düz renk dolgulu üç yol içerir; bağlantılı görsel, yazı tipi veya efekt içermez. Bu gösterim için elle hazırlanmış bir çizimdir; PerfectVector dönüştürme sonucu değildir.
<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>SVG'nin viewBox değeri, iç koordinat dikdörtgenini tanımlar. İçe aktarılan çizimin width ve height değerleri, PDF yerleşimi için kullanmanız gereken boyutları belirtir. Bir SVG pikselinin bir PDF puntosuna eşit olduğunu varsaymak yerine bu değerleri okuyun.
Bu dosya için svglib 2.2.0, 180 × 90 punto döndürdü. Güncel birim belgesi, bir CSS pikselini 0,75 PDF puntosuyla eşleştirir. Eski örnekler farklı varsayımlar kullanabilir; dolayısıyla mevcut bir işlem hattını yükseltirken boyutları kontrol edin.
Logoyu esnetmeden sığdırın
Aşağıdakini SVG'nin yanına place_logo.py olarak kaydedin ve python place_logo.py çalıştırın. Buradaki tüm sayfa konumları ve kutu boyutları PDF punto birimindedir. Bir inçte 72 punto bulunur; ReportLab'ın canvas kılavuzunda açıklandığı gibi varsayılan canvas orijini sol alttadır.
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(), sınırlayıcı boyutu seçer; böylece çizim kutunun içine sığar. X ve Y için aynı katsayıyı kullanmak oranları korur. Bu işlev, çizimi kutunun sol alt köşesine sabitler; kullanılmayan alan üstte veya sağda kalır. Yerleşiminiz gerektiriyorsa çizimi ayrıca ortalayın.
Canvas dönüşümü geçicidir. restoreState(), logonun ölçeklenmesinin daha sonra eklenen metinleri veya sayfa öğelerini değiştirmesini önler; özgün çizim ikinci yerleştirmede kullanılabilir durumda kalır.
Testte iki katsayı 0.8 ve 1.6 oldu; 144 × 72 pt ve 288 × 144 pt boyutunda çizimler üretildi. Önizleme, boyutlarını kolayca karşılaştırabilmeniz için aynı iki yerleştirmeye etiketler ve bir arka plan ekler.

Bir Platypus belgesinde çizim, story listesine bir flowable nesnesi olarak eklenebilir. İçeriğini drawing.scale(factor, factor) ile ölçekledikten sonra, yerleşimin yeni kaplanan alanı kullanması için drawing.width ve drawing.height değerlerini de aynı katsayıyla güncelleyin. Farklı boyutlar uygularken yeni yüklenmiş bir çizimle çalışın. Yukarıdaki canvas örneği, çizimin kendisini değiştirmez.
Geometriyi ve görünümü ayrı ayrı kontrol edin
Test PDF'sinin içerik akışını pypdf 6.10.0 ile inceledik. İki kez çizilen üç amblem yoluna karşılık gelen altı yol başlangıç işlemi ve sıfır sayfa görseli içeriyordu. Ayrıca tüm sayfayı Poppler ile render edip iki amblemi inceledik. Şekiller, örtüşme, dikey çubuk ve oranlar hedeflenen yerleşimlerle eşleşti.
Bu gözlemler bu basit test çizimi için geçerlidir. Yalnızca yolları saymak, başka bir SVG'nin her özelliğinin doğru render edildiğini kanıtlamaz. Benzer şekilde, ekranda bir PDF'ye yakınlaştırmak da vektör talimatları mı yoksa büyük bir bitmap mi içerdiğini kesin olarak söyleyemez.
Kendi belgeniz için:
- Bitmiş PDF'yi, tarayıcıda veya düzenleyicide açılmış SVG ile karşılaştırın. Eksik ayrıntıları, değişmiş dolguları, kırpmayı ve beklenmedik beyaz alanları arayın.
- Amblemi, dar aralıkların ve ince konturların okunabilir kalması gereken hedef belge boyutunda kontrol edin.
- İş akışı vektör çizimi gerektiriyorsa PDF görsel nesnelerini inceleyin. Sayfanın başka yerlerinde bilinçli olarak kullanılan fotoğrafları hesaba katın.
- SVG ana dosyasını belge oluşturma kodunun yanında tutun. Çizimi veya render bağımlılıklarını değiştirdikten sonra PDF'yi yeniden kontrol edin.
Bir SVG'nin kendisi de raster görüntü içerebilir. Bu kapsayıcıyı okumak, piksellerinden yollar elde etmez. Gömülü görsel teşhisi, vektör ana dosyasını hâlâ bitmap taşıyan bir SVG'den ayırt etmenize yardımcı olur.
İçe aktarıcının yeniden üretemediği özellikleri ele alın
Güncel svglib sınırlamaları, desteklenmeyen maskeleri ve foreignObject öğelerini, yok sayılan stil sayfası @import kurallarını ve CSS ile kırpmaya ilişkin kısıtlamaları içerir. Bu nedenle tarayıcı önizlemesi, PDF içe aktarıcısını test etmenin yerini tutamaz.
Sadeleştirmeden önce ana dosyanın bir kopyasını saklayın. Logo desteklenmeyen bir efekte dayanıyorsa o bölümü sıradan geometriyle yeniden oluşturmayı veya doğrulayabileceğiniz farklı bir dışa aktarım yolunu kullanmayı düşünün. Fotoğraf görünümü, yol düzenlemeden daha önemliyse özgün raster görüntüyü koruyun. Tek bir görsele indirgenmiş çıktı görünümü koruyabilir; ancak vektör gerekliliğini değiştirir.
Yazılarda belge metni ile yollara dönüştürülmüş çizim arasında bilinçli seçim yapın. Sözcükleri metin olarak tutmak düzenlemeyi ve aramayı mümkün kılar; ancak amaçlanan yazı tipinin belge iş akışında kullanılabilir olmasını gerektirir. Onaylanmış logo yazısını yollara dönüştürmek, normal metin düzenlemesinden vazgeçerek şeklini korur. Yalnızca yollardan oluşan amblemimiz yazı tipi işlemlerini test etmez; aynı işlem hattına güvenmeden önce kullanacağınız yazının gerçek bir örneğini deneyin.
Belgeyi Python yerine bir dizgi sisteminde oluşturuyorsanız LaTeX'te SVG iş akışı, grafikler ve etiketler için ayrı bir yolu açıklar.
Yalnızca raster hali kalan logoyu PDF'ye yerleştirmeden önce geri kazanın
Özgün logo dosyası kayıpsa bir fatura şablonundaki eski PNG, vektör olarak geri kazanmak için makul bir adaydır. PerfectVector'ın logo vektörleştirme aracıyla raster çizimi SVG olarak önizleyin, konturları ve boşlukları inceleyin ve belge işlem hattınız için bir aday indirin.
İçe aktarmadan önce küçük yazıları ve kenarlıkları kontrol edin. Kesin tipografi gerektiren öğeleri yeniden çizin veya yeniden dizin; bir düzenleyicide istenmeyen arka plan geometrisini kaldırın. Logo vektörleştirme kılavuzu, kaynaktan ana dosyaya geçiş kararını daha ayrıntılı ele alır.
Ardından yukarıdaki gerçek ReportLab içe aktarımını ve PDF kontrollerini uygulayın. İyi bir vektörleştirme sonucu da içe aktarıcıdan sorunsuz geçmeli ve belgenize sığmalıdır. PerfectVector çizim yollarını sağlar; ReportLab koordinatlarını seçmez, belge yazı tiplerini kaydetmez veya ortaya çıkan PDF'yi doğrulamaz. Grafiklerde etiketleri veya çizilmiş değerleri vektörleştirmek yerine verilerden ve grafik oluşturma kaynağından yeniden üretin.
Sık sorulan sorular
SVG'yi ReportLab'a sıradan bir bitmap görsel gibi aktarabilir miyim? Bu vektör iş akışı için svglib ile bir Drawing oluşturun ve renderPDF ile render edin. SVG'yi önce PNG'ye dönüştürmek ise raster olarak eklenmesine yol açar.
İçe aktardığım SVG neden eski bir örnekten daha küçük? Test edilen svglib 2.2.0, CSS piksellerini 0,75 katsayısıyla PDF puntosuna eşler. Eski piksel-punto varsayımlarına güvenmek yerine döndürülen çizim boyutlarını okuyun ve ölçüleri açıkça belirlenmiş bir kutuya sığdırın.
Bu yöntem her SVG efektini korur mu? Hayır. İçe aktarıcının maskeler ve foreignObject dahil belgelenmiş özellik sınırlamaları vardır. Betik hatasız tamamlansa bile dışa aktarılan PDF'yi amaçlanan çizimle karşılaştırın.
Bir grafiğin ekran görüntüsünü vektörleştirmeli miyim? Mümkün olduğunda grafiği verilerinden ve grafik oluşturma kaynağından yeniden üretin. Logo vektörleştirmeyi, düzenlenebilir orijinali kayıp olan uygun dekoratif çizimler için kullanın.
Kaynaklar
- svglib — Package and units documentation — SVG'den Drawing'e dönüştürme, kurulum ve PDF punto biriminde boyutlandırma.
- ReportLab — Graphics — Drawing nesneleri, PDF render işlemi ve Platypus flowable nesneleri olarak kullanım.
- ReportLab — Graphics and text with pdfgen — Canvas koordinatları, punto birimi ve dönüşümler.
- svglib — Known limitations — Bitmiş PDF'yi kontrol etmeyi gerektiren içe aktarım kısıtlamaları.
Elinizde varsa düzenlenebilir orijinali koruyun. Yalnızca raster logo görüntüsü kaldıysa bir SVG logo adayı hazırlayın, yollarını inceleyin; ardından gereken boyutta yerleştirin ve bitmiş PDF'yi kontrol edin.
Bloga daha fazlası

fpdf2 ile SVG: Python PDF'nizde yolları koruyun
fpdf2 ile Python PDF'nize SVG logo yerleştirin, boyutunu ayarlayın, kaydedilen yolları inceleyin ve raster seçeneğine geçmeden eksik metin veya şekilleri teşhis edin.

PDFKit SVG: Vektör logoyu rasterleştirmeden yerleştirin
Tam bir SVG logoyu PDFKit belgesine ekleyin, boyutunu punto olarak ayarlayın; kaydedilen PDF'de yolları, açık şekilleri, eksik özellikleri ve gömülü görüntüleri inceleyin.