2025, Nov 01 06:31

Python ReportLab में PDF के हर पेज पर लोगो को स्केल करें

इस गाइड में जानें कि Python ReportLab में drawImage के width और height पैरामीटर्स से PDF के पेज पर लोगो/PNG को सही आकार में स्केल करें, aspect ratio सुरक्षित रखें.

रिपोर्ट तैयार करते समय PDF के हर पेज पर छोटा लोगो या बैज जोड़ना आम बात है। परेशानी तब आती है जब स्रोत PNG बड़ा हो और ड्रॉइंग कॉल के भीतर उसे छोटा करने की सीधी कोशिश असर न करे—नतीजतन हर पेज पर स्केल किए हुए संस्करण की बजाय पूरा आकार वाला चित्र छप जाता है।

समस्या को दिखाने वाला उदाहरण

नीचे दिखाया गया है कि लोगो हर पेज पर कैसे जोड़ा जाता है, लेकिन उसके आकार पर पाबंदी लगाने की कोशिश टिकती नहीं। छवि अपने मूल आयामों में ही रेंडर होती रहती है।

def paint_sheet(sheet, dossier, pagesize=A4):
    pg_no = sheet.getPageNumber()
    emblem = Image('/opt/rspro/home/e8409/projects/CRAMM logo.png')
    emblem._restrictSize(1 * inch, 2 * inch)
    sheet.drawImage(emblem, 0, 0)
    sheet.showPage()
from reportlab.platypus import PageTemplate
upright_tpl = PageTemplate(
  id='upright', 
  frames=upright_frame,
  onPage=paint_sheet, 
  pagesize=A4)
from reportlab.platypus import BaseDocTemplate
pdf_doc = BaseDocTemplate(
  'report.pdf',
  pageTemplates=[
    upright_tpl
  ]
)

पर्दे के पीछे क्या हो रहा है

री-साइज़ करने की कोशिश आकार-सीमा के जरिए की गई है, लेकिन छवि को ऐसे मेथड से बनाया जा रहा है जो उस सीमा को अपनाता नहीं। जब तक चौड़ाई और ऊंचाई स्पष्ट रूप से न दी जाएं, draw कॉल मूल छवि के आयामों का ही सम्मान करती है। नतीजा यह कि हर पेज पर लोगो फिर से पूर्ण आकार में दिखाई देता है।

समाधान

लक्ष्य आयाम सीधे ड्रॉइंग कॉल में बताइए। जरूरत पड़े तो पहले छवि पढ़कर उसके आयाम देख लें; फिर रेंडर करते समय इच्छित आकार पास करें ताकि वह मनचाहे तरीके से स्केल हो।

from reportlab.lib.utils import ImageReader
def render_stamp(canvas_ctx, doc_ctx, pagesize=A4):
    logo_path = '/opt/rspro/home/e8409/projects/CRAMM logo.png'
    img_reader = ImageReader(logo_path)
    orig_w, orig_h = img_reader.getSize()
    target_w = desired_width
    target_h = desired_height
    canvas_ctx.drawImage(
        logo_path,
        0,
        0,
        width=target_w,
        height=target_h,
        preserveAspectRatio=True
    )

यह तरीका छवि हैंडलिंग को उसी प्रवाह में रखता है जहाँ PDF तैयार हो रही होती है। PNG को कहीं और पहले से प्रोसेस करने की जरूरत नहीं। व्यवहार से जुड़ा एक अतिरिक्त निष्कर्ष: यदि आप इसे ऐसे वातावरण में चला रहे हैं जहाँ निष्पादनीय सेल/स्टेप होते हैं, तो चरणों को गलत क्रम में चलाने से आपके बदलावों का असर छिप सकता है।

यह क्यों महत्वपूर्ण है

कई पेजों पर ब्रांडिंग तत्व या कोई भी स्थिर ग्राफिक्स रखते समय सुसंगत और पूर्वानुमेय स्केलिंग जरूरी है। स्पष्ट आकार न देने पर एक बड़ा स्रोत एसेट कैनवास पर हावी हो जाता है, पेज लेआउट बिगाड़ देता है और सामग्री को धकेल देता है। ड्रॉ कॉल पर ही आयाम नियंत्रित करने से रिपोर्ट के हर पेज पर आउटपुट एक जैसा और भरोसेमंद रहता है।

निष्कर्ष

जब PDF में दोहराए जाने वाले चित्र लगाएँ, तो स्केल नियंत्रित करने के लिए ड्रॉ मेथड के width और height पैरामीटर्स पर भरोसा करें, और जरूरत हो तो aspect ratio बनाए रखें। मूल आकार देखना चाहें तो पहले छवि पढ़ लें, फिर हर पेज पर उसे स्पष्ट आयामों के साथ रेंडर करें। अगर कुछ अब भी गलत लगे, तो जाँचें कि संबंधित कोड पाथ सही क्रम में चल रहे हैं।

यह लेख StackOverflow पर प्रश्न (लेखक: vashts85) और RCDevs Security के उत्तर पर आधारित है।