2010-08-10 7 views
8

का उपयोग करके पीडीएफ दस्तावेज़ में पीडीएफ छवि मैंने मैटलप्लिब से कुछ प्लॉट को पीडीएफ प्रारूप में सहेजा क्योंकि यह एक बेहतर गुणवत्ता प्रदान करता है। रिपोर्टबैब का उपयोग करके पीडीएफ छवि में पीडीएफ छवि में मैं कैसे शामिल करूं? सुविधा विधि छवि (filepath) इस प्रारूप के लिए काम नहीं करती है।रिपोर्टबैब (पायथन)

धन्यवाद।

reportlab.graphics से

उत्तर

-3

उपयोग आयात renderPDF

+3

यह गलत है। रेंडर पीडीएफ मौजूदा दस्तावेज लेता है और एक पीडीएफ उत्पन्न करता है। पोस्टर क्या चाहता है के ठीक विपरीत। –

2

ReportLab's FAQ के अनुसार इस ReportLab प्लस के साथ ही संभव है:

मैं अपने पीडीएफ़ में वेक्टर ग्राफिक्स का उपयोग कर सकते हैं?

नहीं, ओपन सोर्स पैकेज ऐसा नहीं करता है। PageCatcher (पिछले उत्तर देखें) आप आसानी से एक PDF के रूप बचत यह और फिर वास्तव में आप एक छवि फ़ाइल होगा के रूप में यह उपयोग करके किसी भी वेक्टर छवि को शामिल करने की अनुमति देता है, और रिपोर्ट मार्कअप लैंग्वेज जेपीजी के साथ पीडीएफ फाइलों स्वीकार करता है, जीआईएफ और पीएनजी।

अद्यतन: मैं थोड़ी देर के लिए इस में देखा है नहीं लेकिन on the page of pdfrw यह कहते हैं:

pdfrw पढ़ सकते हैं और पीडीएफ फाइलों में लिख सकते हैं, और यह भी पीडीएफ़ जो कर सकते हैं में पढ़ने के लिए इस्तेमाल किया जा सकता तो reportlab के अंदर इस्तेमाल किया जाना चाहिए।

+0

यह सही है। पीडीएफडब्लू पेज पर दोनों के लिए पीडीएफआरडब्ल्यू का उपयोग करके कुछ उदाहरण हैं, और कुछ [प्रश्न] (http://stackoverflow.com/questions/31712386/loading-matplotlib-object-into-reportlab/) यहां –

1

आप reportlab के साथ एक साथ अद्भुत pdfrw पैकेज का उपयोग करें और इसका इस्तेमाल सीधे एक flowable में matplotlib आंकड़ों की फ़ाइल की तरह वस्तुओं पारित करने के लिए कर सकते हैं:

इस से पहले उत्तर दिया था, लेकिन मैं एक न्यूनतम उदाहरण देना चाहता हूँ यहाँ, कृपया यह भी इधर देखो: https://stackoverflow.com/a/13870512/4497962

from io import BytesIO 
import matplotlib.pyplot as plt 
from pdfrw import PdfReader, PdfDict 
from pdfrw.buildxobj import pagexobj 
from pdfrw.toreportlab import makerl 
from reportlab.platypus import Flowable 
from reportlab.lib.enums import TA_JUSTIFY,TA_LEFT,TA_CENTER,TA_RIGHT 

class PdfImage(Flowable): 
    """ 
    PdfImage wraps the first page from a PDF file as a Flowable 
    which can be included into a ReportLab Platypus document. 
    Based on the vectorpdf extension in rst2pdf (http://code.google.com/p/rst2pdf/) 

    This can be used from the place where you want to return your matplotlib image 
    as a Flowable: 

     img = BytesIO() 

     fig, ax = plt.subplots(figsize=(canvaswidth,canvaswidth)) 

     ax.plot([1,2,3],[6,5,4],antialiased=True,linewidth=2,color='red',label='a curve') 

     fig.savefig(img,format='PDF') 

     return(PdfImage(img)) 

    """ 

    def __init__(self, filename_or_object, width=None, height=None, kind='direct'): 
     # If using StringIO buffer, set pointer to begining 
     if hasattr(filename_or_object, 'read'): 
      filename_or_object.seek(0) 
      #print("read") 
     self.page = PdfReader(filename_or_object, decompress=False).pages[0] 
     self.xobj = pagexobj(self.page) 

     self.imageWidth = width 
     self.imageHeight = height 
     x1, y1, x2, y2 = self.xobj.BBox 

     self._w, self._h = x2 - x1, y2 - y1 
     if not self.imageWidth: 
      self.imageWidth = self._w 
     if not self.imageHeight: 
      self.imageHeight = self._h 
     self.__ratio = float(self.imageWidth)/self.imageHeight 
     if kind in ['direct','absolute'] or width==None or height==None: 
      self.drawWidth = width or self.imageWidth 
      self.drawHeight = height or self.imageHeight 
     elif kind in ['bound','proportional']: 
      factor = min(float(width)/self._w,float(height)/self._h) 
      self.drawWidth = self._w*factor 
      self.drawHeight = self._h*factor 

    def wrap(self, availableWidth, availableHeight): 
     """ 
     returns draw- width and height 

     convenience function to adapt your image 
     to the available Space that is available 
     """ 
     return self.drawWidth, self.drawHeight 

    def drawOn(self, canv, x, y, _sW=0): 
     """ 
     translates Bounding Box and scales the given canvas 
     """ 
     if _sW > 0 and hasattr(self, 'hAlign'): 
      a = self.hAlign 
      if a in ('CENTER', 'CENTRE', TA_CENTER): 
       x += 0.5*_sW 
      elif a in ('RIGHT', TA_RIGHT): 
       x += _sW 
      elif a not in ('LEFT', TA_LEFT): 
       raise ValueError("Bad hAlign value " + str(a)) 

     #xobj_name = makerl(canv._doc, self.xobj) 
     xobj_name = makerl(canv, self.xobj) 

     xscale = self.drawWidth/self._w 
     yscale = self.drawHeight/self._h 

     x -= self.xobj.BBox[0] * xscale 
     y -= self.xobj.BBox[1] * yscale 

     canv.saveState() 
     canv.translate(x, y) 
     canv.scale(xscale, yscale) 
     canv.doForm(xobj_name) 
     canv.restoreState() 
+0

है बिल्कुल मुझे क्या चाहिए! कोड के लिए बहुत बहुत धन्यवाद! – desa

+0

यदि आपको यह पसंद आया तो आप इसे भी देखना चाहेंगे: https://pypi.python.org/pypi/autobasedoc/ – skidzo

1

आप matplotlib से svg निर्यात का उपयोग करें और svglib अजगर लाइब्रेरी का उपयोग reportlab पीडीएफ फाइलों उत्पन्न में वेक्टर ग्राफिक्स शामिल करने के लिए कर सकते हैं। svglib एक svg फ़ाइल लेता है और एक ड्रॉइंग ऑब्जेक्ट बनाता है जिसे सीधे रिपोर्टलैब में उपयोग किया जा सकता है।

अधिक जानकारी के लिए यह प्रश्न भी देखें: Generating PDFs from SVG input