ReportLab SVG: बनाए गए PDF में लोगो पाथ साफ़ रखें
svglib से ReportLab PDF में SVG लोगो लगाएँ, उनके अनुपात बनाए रखें और तैयार फ़ाइल में वेक्टर पाथ, सही आकार और गायब विवरण जाँचें।
इस पेज पर
SVG को ReportLab Drawing में पढ़ने के लिए svglib.svg2rlg() इस्तेमाल करें, फिर renderPDF.draw() से वह चित्र लगाएँ। पृष्ठ पर उसके लिए मापी हुई जगह तय करें और दोनों अक्षों पर एक ही स्केल गुणक इस्तेमाल करें। इससे उपयुक्त लोगो ज्यामिति बिटमैप स्क्रीनशॉट के बजाय PDF चित्रण निर्देशों के रूप में रहती है।
दस्तावेज़ लेआउट के बिना अलग निर्यात के लिए CairoSVG आकार कार्यप्रवाह PNG पिक्सेल, PDF पृष्ठ आयाम और DPI की तुलना करता है।
असली जाँच तैयार PDF की है: क्या प्रतीक ने आपके दस्तावेज़ के लिए ज़रूरी आकार पर अपने अनुपात, रंग और छोटे खुले हिस्से बनाए रखे? सफल Python कॉल इन सवालों का जवाब नहीं देती। नीचे का उदाहरण एक ही मौलिक प्रतीक दो बार लगाता है और उससे बनी फ़ाइल जाँचता है।
यदि आपके पास पहले से संपादन योग्य वेक्टर लोगो है, तो उसी से शुरू करें। केवल PNG या JPG बचा हो तो दस्तावेज़ बनाने से पहले वेक्टर मूल फ़ाइल वापस तैयार करें। फ़ोटो और संख्यात्मक चार्ट के लिए स्रोत चुनने का तरीका अलग है।
चित्र को ड्रॉइंग के रूप में आयात करें
svglib का दस्तावेज़ित कार्यप्रवाह SVG को ReportLab ड्रॉइंग ऑब्जेक्ट में बदलता है। ReportLab की ग्राफ़िक्स मार्गदर्शिका बताती है कि ये चित्र कैनवस पर रेंडर किए जा सकते हैं या Platypus फ़्लोएबल के रूप में इस्तेमाल हो सकते हैं। इस उदाहरण में कैनवस हर स्थान के लिए स्पष्ट स्थिति और आकार देता है।
हमने उदाहरण Python 3.12, svglib 2.2.0 और ReportLab 4.4.9 से चलाया। अपने प्रोजेक्ट वातावरण में ये दो निश्चित संस्करण स्थापित करें:
python -m pip install "svglib==2.2.0" "reportlab==4.4.9"यह छोटा प्रतीक logo.svg के रूप में सहेजें। इसमें ठोस भरण वाले तीन पाथ हैं और लिंक की गई छवियाँ, फ़ॉन्ट या प्रभाव नहीं हैं। यह प्रदर्शन के लिए हाथ से लिखा चित्र है, 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>SVG का viewBox उसका आंतरिक निर्देशांक आयत बताता है। आयात की गई ड्रॉइंग की width और height PDF में लगाने के लिए इस्तेमाल होने वाले आयाम बताती हैं। उन्हें पढ़ें; यह न मानें कि एक SVG पिक्सेल एक PDF पॉइंट के बराबर है।
इस फ़ाइल के लिए svglib 2.2.0 ने 180 × 90 पॉइंट लौटाए। उसका वर्तमान इकाई दस्तावेज़ एक CSS पिक्सेल को 0.75 PDF पॉइंट में बदलता है। पुराने उदाहरणों की धारणाएँ अलग हो सकती हैं, इसलिए मौजूदा प्रक्रिया अपडेट करते समय आयाम जाँचें।
लोगो को खींचे बिना जगह में फिट करें
निम्न सामग्री SVG के पास place_logo.py के रूप में सहेजें और python place_logo.py चलाएँ। यहाँ पृष्ठ की सभी स्थितियाँ और बॉक्स आयाम PDF पॉइंट में हैं। एक इंच में 72 पॉइंट होते हैं; कैनवस का डिफ़ॉल्ट मूल बिंदु नीचे बाईं ओर होता है, जैसा 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() सीमित करने वाला आयाम चुनता है, इसलिए चित्र बॉक्स के अंदर फिट होता है। X और Y पर एक ही गुणक इस्तेमाल करने से अनुपात सुरक्षित रहते हैं। यह फ़ंक्शन चित्र को बॉक्स के निचले-बाएँ कोने पर रखता है; खाली जगह ऊपर या दाईं ओर रहती है। आपके लेआउट को आवश्यकता हो तो उसे अलग से बीच में रखें।
कैनवस रूपांतरण अस्थायी है। restoreState() लोगो की स्केलिंग को बाद के टेक्स्ट या पृष्ठ एलिमेंट बदलने से रोकता है, और मूल ड्रॉइंग दूसरी बार लगाने के लिए उपलब्ध रहती है।
परीक्षण में दोनों गुणक 0.8 और 1.6 थे, जिनसे 144 × 72 pt और 288 × 144 pt चित्र बने। पूर्वावलोकन उन्हीं दो स्थानों पर लेबल और पृष्ठभूमि जोड़ता है ताकि उनके आकारों की आसानी से तुलना की जा सके।

Platypus दस्तावेज़ में ड्रॉइंग फ़्लोएबल के रूप में स्टोरी में शामिल हो सकती है। drawing.scale(factor, factor) से उसकी सामग्री स्केल करने के बाद drawing.width और drawing.height को उसी गुणक से अपडेट करें ताकि लेआउट नया स्थान घेरने वाला आकार इस्तेमाल करे। अलग आकार लगाते समय नई ड्रॉइंग से काम करें। ऊपर का कैनवस उदाहरण ड्रॉइंग को स्वयं बदलने से बचता है।
ज्यामिति और दिखावट अलग-अलग जाँचें
हमने pypdf 6.10.0 से परीक्षण PDF की कंटेंट स्ट्रीम जाँची। उसमें 6 पाथ शुरू करने वाले ऑपरेशन थे, जो तीन प्रतीक पाथ दो बार बनाने से मेल खाते थे, और पृष्ठ में 0 छवियाँ थीं। हमने Poppler से पूरा पृष्ठ भी रेंडर किया और दोनों प्रतीक देखे। आकार, ओवरलैप, ऊर्ध्व पट्टी और अनुपात इच्छित स्थानों से मेल खाते थे।
ये अवलोकन इस सरल नमूने पर लागू हैं। केवल पाथ गिनना यह सिद्ध नहीं करता कि दूसरे SVG की हर सुविधा ठीक रेंडर हुई। इसी तरह स्क्रीन पर PDF ज़ूम करने से निश्चित रूप से नहीं पता चलता कि उसमें वेक्टर निर्देश हैं या बड़ा बिटमैप।
अपने दस्तावेज़ के लिए:
- तैयार PDF को ब्राउज़र या संपादक में SVG से मिलाएँ। गायब विवरण, बदले भरण, क्लिपिंग और अप्रत्याशित सफ़ेद हिस्से देखें।
- प्रतीक को इच्छित दस्तावेज़ आकार पर जाँचें, जहाँ संकरे अंतर और बारीक स्ट्रोक पठनीय रहने चाहिए।
- कार्यप्रवाह में वेक्टर चित्र ज़रूरी हो तो PDF छवि ऑब्जेक्ट जाँचें। पृष्ठ पर अन्यत्र जानबूझकर लगाई गई फ़ोटो का ध्यान रखें।
- SVG मूल फ़ाइल दस्तावेज़ बनाने वाले कोड के साथ रखें। चित्र या उसकी रेंडरिंग निर्भरताएँ बदलने के बाद PDF फिर जाँचें।
SVG के अंदर स्वयं रास्टर छवि हो सकती है। उस आवरण को पढ़ना उसके पिक्सेल से पाथ वापस नहीं बनाता। एम्बेड की गई छवि की पहचान वेक्टर मूल फ़ाइल और अब भी बिटमैप रखने वाले SVG में अंतर करने में मदद करती है।
जिन सुविधाओं को आयातक नहीं दोहरा सकता, उन्हें संभालें
वर्तमान svglib सीमाओं में असमर्थित मास्क और foreignObject एलिमेंट, अनदेखे स्टाइलशीट @import नियम तथा CSS और क्लिपिंग पर प्रतिबंध शामिल हैं। इसलिए ब्राउज़र पूर्वावलोकन PDF आयातक की जाँच का विकल्प नहीं है।
सरल करने से पहले मूल फ़ाइल की प्रति रखें। लोगो असमर्थित प्रभाव पर निर्भर हो तो उस हिस्से को साधारण ज्यामिति में दोबारा बनाने या ऐसे दूसरे निर्यात रास्ते पर विचार करें जिसे आप जाँच सकें। फ़ोटो जैसी दिखावट पाथ संपादन से अधिक ज़रूरी हो तो मूल रास्टर रखें। समतल की गई छवि दिखावट सुरक्षित रख सकती है, लेकिन इससे वेक्टर की आवश्यकता बदलती है।
अक्षरों के लिए दस्तावेज़ टेक्स्ट और आउटलाइन किए चित्र में सोच-समझकर चुनाव करें। शब्द टेक्स्ट में रखने से संपादन और खोज संभव हैं, लेकिन दस्तावेज़ कार्यप्रवाह में इच्छित फ़ॉन्ट उपलब्ध होना चाहिए। स्वीकृत लोगो अक्षरों को आउटलाइन में बदलने से उनका आकार सुरक्षित रहता है, लेकिन सामान्य टेक्स्ट संपादन नहीं रहता। केवल पाथ वाला हमारा प्रतीक फ़ॉन्ट संभालना नहीं जाँचता; उसी प्रक्रिया पर भरोसा करने से पहले अपनी टाइपोग्राफ़ी का वास्तविक नमूना लें।
Python के बजाय टाइपसेटिंग सिस्टम में दस्तावेज़ जोड़ रहे हों तो LaTeX में SVG कार्यप्रवाह ग्राफ़िक्स और लेबल के लिए अलग रास्ता समझाता है।
PDF में लगाने से पहले केवल रास्टर में बचे लोगो को वापस तैयार करें
इनवॉइस टेम्पलेट का पुराना PNG वेक्टर ज्यामिति वापस पाने के लिए एक उपयुक्त स्रोत है, जब मूल लोगो फ़ाइल गायब हो। PerfectVector के लोगो वेक्टराइज़र से रास्टर चित्र का SVG पूर्वावलोकन देखें, कंटूर और खुले हिस्से जाँचें तथा दस्तावेज़ प्रक्रिया के लिए एक प्रारंभिक SVG फ़ाइल डाउनलोड करें।
आयात से पहले छोटे अक्षर और बॉर्डर जाँचें। जिन एलिमेंट में सटीक टाइपोग्राफ़ी चाहिए, उन्हें दोबारा बनाएँ या टाइपसेट करें, और संपादक में अनचाही पृष्ठभूमि ज्यामिति हटाएँ। लोगो वेक्टराइज़ेशन मार्गदर्शिका स्रोत से मूल फ़ाइल तक के इस निर्णय को विस्तार से बताती है।
फिर ऊपर की वास्तविक ReportLab आयात और PDF जाँच चलाएँ। अच्छे ट्रेस को भी आयातक से सही निकलना और आपके दस्तावेज़ में फिट होना चाहिए। PerfectVector चित्र पाथ देता है; वह ReportLab निर्देशांक नहीं चुनता, दस्तावेज़ फ़ॉन्ट पंजीकृत नहीं करता और परिणामी PDF सत्यापित नहीं करता। चार्ट के लिए उनके लेबल या प्लॉट किए मान ट्रेस करने के बजाय डेटा और प्लॉटिंग स्रोत से दोबारा बनाएँ।
अक्सर पूछे जाने वाले प्रश्न
क्या मैं SVG को ReportLab में साधारण बिटमैप छवि की तरह दे सकता हूँ? इस वेक्टर कार्यप्रवाह के लिए svglib से Drawing बनाएँ और renderPDF से उसे रेंडर करें। पहले SVG को PNG में बदलने से इसके बजाय रास्टर छवि लगती है।
मेरा आयात किया SVG पुराने उदाहरण से छोटा क्यों है? परीक्षित svglib 2.2.0 CSS पिक्सेल को 0.75 गुणक से PDF पॉइंट में बदलता है। पुराने पिक्सेल-से-पॉइंट अनुमान पर निर्भर होने के बजाय लौटाए गए ड्रॉइंग आयाम पढ़ें और उन्हें स्पष्ट बॉक्स में फिट करें।
क्या इससे हर SVG प्रभाव सुरक्षित रहता है? नहीं। आयातक की दस्तावेज़ित सुविधा सीमाएँ हैं, जिनमें मास्क और foreignObject शामिल हैं। स्क्रिप्ट बिना त्रुटि पूरी होने पर भी निर्यात PDF को इच्छित चित्र से मिलाएँ।
क्या मुझे चार्ट के स्क्रीनशॉट को वेक्टराइज़ करना चाहिए? जहाँ संभव हो चार्ट उसके डेटा और प्लॉटिंग स्रोत से दोबारा बनाएँ। लोगो ट्रेसिंग केवल उपयुक्त सजावटी चित्र के लिए रखें, जिसका संपादन योग्य मूल गायब हो।
स्रोत
- svglib — पैकेज और इकाई दस्तावेज़ — SVG से Drawing रूपांतरण, स्थापना और PDF पॉइंट में आकार।
- ReportLab — ग्राफ़िक्स — Drawing ऑब्जेक्ट, PDF रेंडरिंग और Platypus फ़्लोएबल के रूप में इस्तेमाल।
- ReportLab — pdfgen से ग्राफ़िक्स और टेक्स्ट — कैनवस निर्देशांक, पॉइंट और रूपांतरण।
- svglib — ज्ञात सीमाएँ — आयात प्रतिबंध जिनके कारण तैयार PDF जाँचना ज़रूरी है।
संपादन योग्य मूल हो तो उसे सुरक्षित रखें। केवल रास्टर लोगो चित्र बचा हो तो एक प्रारंभिक SVG लोगो तैयार करें, उसके पाथ देखें, फिर ज़रूरी आकार पर लगाकर तैयार PDF जाँचें।
Blog से और

fpdf2 SVG इमेज: Python PDF में पाथ सुरक्षित रखें
fpdf2 से Python PDF में SVG लोगो रखें, आकार नियंत्रित करें, सेव किए पाथ जाँचें और रास्टर विकल्प से पहले गायब टेक्स्ट या आकृतियों की वजह खोजें।

PDFKit SVG: वेक्टर लोगो को पिक्सेल बनाए बिना रखें
PDFKit दस्तावेज़ में पूरा SVG लोगो डालें, पॉइंट में आकार सेट करें और सेव PDF में पाथ, खुले हिस्से, गायब सुविधाएँ तथा एम्बेडेड इमेज जाँचें।