WeasyPrint SVG इमेज: PDF में गायब लोगो ठीक करें
सही बेस URL और स्पष्ट CSS आकार से WeasyPrint PDF के गायब SVG लोगो ठीक करें, फिर सेव किए PDF में वेक्टर पाथ, अनुपात और चित्र जाँचें।
इस पेज पर
WeasyPrint, HTML के image तत्व से PDF में SVG रख सकता है। HTML को स्ट्रिंग के रूप में देने पर लोगो गायब हो तो पहले इमेज URL जाँचें: सापेक्ष पाथ के लिए बेस URL चाहिए। फ़ाइल लोड होने के बाद CSS में उसका प्रिंट आकार सेट करें और सेव किया PDF जाँचें। वर्तमान WeasyPrint API संदर्भ यह base_url आवश्यकता बताता है।
नीचे का उदाहरण मूल फ़्रेम आकार के लोगो से उसी गायब इमेज मामले को दोहराता है। वह यह भी जाँचता है कि ठीक किए गए PDF में माँगे गए आकार पर वेक्टर आरेखन ज्यामिति है। अगर SVG पहले से है, तो उसी फ़ाइल से शुरू करें। वेक्टराइज़ेशन इस प्रक्रिया में केवल तब आता है जब मूल चित्र पिक्सेल में हो।
चित्र बदलने से पहले लोडिंग जाँचें
लोगो गायब होने पर भी PDF बन सकता है। संसाधन चेतावनी जाँचें, इमेज पाथ ठीक करें और आकृतियाँ संपादित करने या दूसरे फ़ॉर्मैट में बदलने से पहले उसी SVG को फिर रेंडर करें।
छोटे दस्तावेज़ में गायब SVG समस्या दोहराएँ
हमने Python 3.13.9 और WeasyPrint 70.0 से परीक्षण किया। प्रोजेक्ट परिवेश इस्तेमाल करें और तय संस्करण इंस्टॉल करें:
python -m pip install "weasyprint==70.0"
python -m weasyprint --infoWeasyPrint को Pango सहित नेटिव सिस्टम लाइब्रेरी भी चाहिए। इंपोर्ट या संस्करण कमांड विफल हो तो उसके ऑपरेटिंग सिस्टम इंस्टॉलेशन निर्देश अपनाएँ। गायब नेटिव लाइब्रेरी, गायब लोगो से अलग समस्या है।
यह फ़ोल्डर संरचना बनाएँ:
example/
render.py
assets/
logo.svgइस मूल प्रदर्शन चित्र को assets/logo.svg नाम से सेव करें। बीच का छेद ठोस आयत से अधिक उपयोगी चीज़ देता है जिसे आप जाँच सकें। यह हाथ से बनाई ज्यामिति है, PerfectVector रूपांतरण नहीं।
<svg xmlns="http://www.w3.org/2000/svg"
width="120" height="60" viewBox="0 0 120 60">
<path fill="#087f8c" fill-rule="evenodd"
d="M0 0H120V60H0Z M20 15V45H100V15Z"/>
</svg>यह कोड render.py में रखें:
from pathlib import Path
import logging
from weasyprint import HTML
logging.basicConfig(level=logging.WARNING)
root = Path(__file__).resolve().parent
html = """<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
@page { size: A4; margin: 20mm; }
body { margin: 0; }
.logo { display: block; width: 60mm; height: auto; }
</style>
</head>
<body>
<img class="logo" src="assets/logo.svg" alt="Frame logo">
</body>
</html>
"""
HTML(string=html).write_pdf(root / "missing-base.pdf")
HTML(
string=html,
base_url=root.as_uri() + "/",
).write_pdf(root / "resolved.pdf")python render.py चलाएँ। हमारे पहले PDF में फ़्रेम गायब था और इमेज का वैकल्पिक टेक्स्ट दिखा। लॉग में यह था:
Relative URI reference without a base URI: assets/logo.svgदूसरे PDF में नीला-हरा फ़्रेम और उसका छेद सही दिखाई दिए। दोनों कॉल ने फ़ाइल बनाई, इसलिए केवल PDF का मौजूद होना सफलता की उपयोगी जाँच नहीं था।
सापेक्ष पाथ को स्थिर शुरुआती फ़ोल्डर दें
assets/logo.svg किसी दूसरे स्थान के सापेक्ष फ़ाइल बताता है। दूसरे कॉल का base_url वह शुरुआती स्थान देता है। root.as_uri() निरपेक्ष फ़ाइल URI बनाता है; आखिर का स्लैश उसे डायरेक्टरी का बेस बनाता है। लोगो उसी assets फ़ोल्डर में रहता है और SVG सामग्री नहीं बदलती।
Path(__file__) इस्तेमाल करने से दूसरे कार्य फ़ोल्डर से चलाने पर भी उदाहरण स्क्रिप्ट के फ़ोल्डर से जुड़ा रहता है। नोटबुक में इसके बजाय स्पष्ट प्रोजेक्ट फ़ोल्डर इस्तेमाल करें, क्योंकि वहाँ सामान्यतः __file__ उपलब्ध नहीं होता।

एक और उपयोगी नियंत्रण परीक्षण है। HTML को render.py के साथ invoice.html नाम से सेव करें और सीधे फ़ाइल लोड करें:
HTML(filename=str(root / "invoice.html")).write_pdf(
root / "from-file.pdf"
)WeasyPrint इनपुट फ़ाइल नाम या URL से बेस निकाल सकता है। हमारे फ़ाइल-आधारित परीक्षण में स्पष्ट बेस वाले मामले जैसा फ़्रेम बना। HTML स्ट्रिंग का कोई संबंधित फ़ाइल नाम नहीं होता जिससे यह अनुमान निकले। ये इनपुट तरीके और उनके बेस निर्धारित करने के नियम HTML कंस्ट्रक्टर में दिए हैं।
लॉगिन के पीछे होस्ट की गई इमेज के लिए सही URL भी पर्याप्त नहीं हो सकता। URL फ़ेचर दस्तावेज़ के अनुसार डिफ़ॉल्ट HTTP क्लाइंट कुकी या प्रमाणीकरण नहीं देता। अपने ऐप की स्वीकृत संसाधन लाने की व्यवस्था इस्तेमाल करें और PDF बनाने वाले परिवेश में जाँचें। यह न मानें कि आपके लॉगिन वाले ब्राउज़र में दिखने वाला लोगो PDF प्रक्रिया को भी उपलब्ध होगा।
इमेज का आकार PDF पेज से अलग सेट करें
उदाहरण A4 शीट और मार्जिन के लिए @page इस्तेमाल करता है, जबकि .logo इमेज को 60 mm चौड़ा करता है। मूल का 2:1 अनुपात height: auto के साथ उसे 30 mm ऊँचा बनाता है। हमारे सेव किए PDF में फ़्रेम 60 × 30 mm मापा गया और वह पेज के ऊपर तथा बाएँ किनारों से 20 mm दूर शुरू हुआ।
यहाँ आरेख पूरा viewBox भरता है। आपके लोगो में उस आयत के अंदर खाली जगह हो सकती है, इसलिए 60 mm का इमेज बॉक्स दिखाई देने वाला निशान उससे संकरा रख सकता है। मनमाने बड़े CSS width से भरपाई करने से पहले SVG कैनवास जाँचें। SVG इंपोर्ट आकार मार्गदर्शिका यह अंतर विस्तार से समझाती है।
भौतिक आयाम जाँचते समय write_pdf() का डिफ़ॉल्ट zoom=1 रखें। WeasyPrint का PDF आउटपुट संदर्भ चेताता है कि zoom बदलने से भौतिक CSS इकाइयाँ और नामित पेज आकार भी स्केल होते हैं।
| क्या दिखाई देता है | पहली जाँच | अगला कदम |
|---|---|---|
| लोगो की जगह वैकल्पिक टेक्स्ट | इमेज URL और संसाधन लॉग | मान्य बेस URL या पहुँच योग्य निरपेक्ष URL दें |
| लोगो गलत आकार में दिखता है | CSS चौड़ाई और मूल आस्पेक्ट अनुपात | भौतिक चौड़ाई सेट करें और SVG कैनवास जाँचें |
| चित्र का हिस्सा गायब | मूल सीमाएँ और संबंधित SVG सुविधा | छोटा विफल उदाहरण बनाएँ और एक्सपोर्ट किए PDF से तुलना करें |
| स्थानीय रेंडरिंग चलती है, सर्वर पर नहीं | उपलब्ध फ़ाइलें, फ़ॉन्ट और URL पहुँच | तैनात प्रक्रिया के संसाधनों के साथ परीक्षण करें |
PDF की सामग्री और रूप जाँचें
वर्तमान WeasyPrint फ़ॉर्मैट दस्तावेज़ के अनुसार SVG इमेज PDF आउटपुट में वेक्टर के रूप में रेंडर होती हैं। इसका मतलब यह नहीं कि .svg पर समाप्त हर फ़ाइल पूरी तरह वेक्टर चित्र है: SVG में बिटमैप एम्बेड हो सकता है। परिणाम पिक्सेलयुक्त दिखता रहे तो एम्बेडेड इमेज पहचान मार्गदर्शिका से जाँचें।
इस सरल परीक्षण उदाहरण के लिए हमने सेव किए PDF को PyMuPDF 1.26.7 से जाँचा:
| इनपुट मामला | आरेखन रिकॉर्ड | एम्बेड की गई इमेज | दिखाई देने वाला फ़्रेम |
|---|---|---|---|
| बेस के बिना HTML स्ट्रिंग | 0 | 0 | गायब; वैकल्पिक टेक्स्ट दिखा |
| फ़ोल्डर बेस के साथ HTML स्ट्रिंग | 1 | 0 | 60 × 30 mm, छेद सुरक्षित |
| फ़ाइल नाम से लोड किया HTML | 1 | 0 | ठीक की गई स्ट्रिंग जैसा परिणाम |
ये परिणाम दिए गए फ़्रेम पर लागू होते हैं, हर SVG सुविधा पर नहीं। एक संयुक्त पाथ का मतलब एक दिखाई देने वाली आकृति भी नहीं: उसका अंदरूनी उपपाथ छेद बनाता है।
अपने resolved.pdf को जाँचने के लिए pymupdf==1.26.7 इंस्टॉल करें और चलाएँ:
import pymupdf
with pymupdf.open("resolved.pdf") as document:
page = document[0]
print("Drawing records:", len(page.get_drawings()))
print("Embedded images:", len(page.get_images()))
for drawing in page.get_drawings():
box = drawing["rect"]
print("Bounds in mm:", box.width * 25.4 / 72,
box.height * 25.4 / 72)PyMuPDF का पेज संदर्भ आरेखन और इमेज निरीक्षण विधियाँ बताता है। ये संख्याएँ समस्या पहचानने में मदद करती हैं, समानता का प्रमाणपत्र नहीं हैं। PDF खोलकर भी देखें: वास्तविक वितरण आकार पर छेद, रंग, अनुपात और अक्षर जाँचें। जटिल चित्र की हर सुविधा अलग जाँचें और रेंडरर अपग्रेड करने पर परीक्षण दोहराएँ।
पहले नया SVG कब तैयार करें
जब उपलब्ध लोगो केवल PNG या JPG हो, तब PerfectVector का लोगो वेक्टराइज़र उसे HTML दस्तावेज़ में रखने से पहले संभावित SVG तैयार कर सकता है। एडिटर में कंटूर, छोटे छेद और अक्षर जाँचें, फिर उसी WeasyPrint प्रक्रिया में SVG परखें। इमेज वेक्टराइज़ेशन मार्गदर्शिका बताती है कि पिक्सेल पाथ बनने पर क्या बदलता है।
मूल संपादन योग्य SVG उपलब्ध हो तो उसे रखें। उसे फिर ट्रेस करने के बजाय फ़ाइल संदर्भ या लेआउट ठीक करें। फ़ोटो रास्टर इमेज रह सकते हैं और ब्रांड के हूबहू अक्षरों के लिए मूल फ़ॉन्ट या हाथ से फिर बनाना ज़रूरी हो सकता है। वेक्टराइज़ेशन गायब सर्वर फ़ाइल, प्रमाणीकरण या असमर्थित रेंडरिंग सुविधा ठीक नहीं करता।
अगर केवल SVG को उसके अपने PDF पेज में बदलना हो, तो CairoSVG एक्सपोर्ट प्रक्रिया उस छोटे काम को समझाती है। WeasyPrint HTML दस्तावेज़ वाले मामले के लिए उपयुक्त है, जहाँ चित्र दूसरी सामग्री के साथ पेज पर रहता है।
अक्सर पूछे जाने वाले सवाल
WeasyPrint मेरे SVG लोगो के बिना PDF क्यों बनाता है? इमेज लोड करने में विफलता होने पर भी बाकी दस्तावेज़ रेंडर हो सकता है। संसाधन लॉग और इमेज URL जाँचें। दिए गए परीक्षण में सापेक्ष इमेज पाथ वाली HTML स्ट्रिंग को स्पष्ट बेस URL चाहिए था।
क्या पहले SVG को PNG में बदलना होगा? नहीं। WeasyPrint SVG इमेज स्वीकार करता है। इच्छित आउटपुट के लिए समर्थित वेक्टर चित्र SVG में रखें और सेव किया PDF जाँचें। जब आप जानबूझकर वेक्टर ज्यामिति के बजाय रूप चुनते हैं, तब रास्टर एक्सपोर्ट एक विकल्प है।
क्या base_url लोगो का प्रिंट आकार बदलता है? नहीं। वह सापेक्ष संसाधन URL तय करने का बेस देता है। CSS से इमेज रखने का आकार सेट करें और SVG के आयाम तथा viewBox अलग जाँचें।
स्रोत
- WeasyPrint API संदर्भ — HTML इनपुट, बेस URL, SVG आउटपुट और PDF ज़ूम व्यवहार बताता है।
- WeasyPrint के शुरुआती कदम — इंस्टॉलेशन और प्रमाणीकरण सीमाओं सहित संसाधन लाने की प्रक्रिया समझाता है।
- PyMuPDF पेज संदर्भ — उदाहरण में इस्तेमाल आरेखन और एम्बेडेड इमेज निरीक्षण विधियाँ बताता है।
क्या केवल रास्टर लोगो है? PerfectVector से SVG तैयार करें, उसकी आकृतियाँ और अक्षर जाँचें, फिर HTML में रखें और सेव किए PDF में उसका रूप तथा भौतिक आकार सत्यापित करें।
Blog से और

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

Matplotlib SVG: प्लॉट और लोगो को पाथ के रूप में रखें
Matplotlib प्लॉट को SVG में एक्सपोर्ट करें, svgutils से अलग लोगो पाथ जोड़ें और वितरण फ़ाइल में एम्बेड किए गए पिक्सेल, स्थिति तथा फ़ॉन्ट बदलाव जाँचें।