Jérémy
Jérémy

Reputation: 370

Reporlab change hAline with the class PDFImage

Hello allI'm a beginner to python so i don't understand all yet but here is the context of my problem.

i'm using reportlab to make an automatique report. In this I use PDF images. To make it compatible I use this classe (there is an exemple with it)

enter code here 
class PdfImage(Flowable):

def __init__(self, filename_or_object, width=None, height=None, kind='direct'):
    from reportlab.lib.units import inch
    # If using StringIO buffer, set pointer to begining
    if hasattr(filename_or_object, 'read'):
        filename_or_object.seek(0)
    page = PdfReader(filename_or_object, decompress=False).pages[0]
    self.xobj = pagexobj(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, aW, aH):
    return self.drawWidth, self.drawHeight

def drawOn(self, canv, x, y, _sW=0):
    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 = self.xobj
    xobj_name = makerl(canv._doc, xobj)

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

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

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

Title = "Hello world"
pageinfo = "platypus example"
def myFirstPage(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Bold',16)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
canvas.restoreState()


def myLaterPages(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page,    pageinfo))
    canvas.restoreState()

def go():
    fig = plt.figure(figsize=(4, 3))
    plt.plot([1,2,3,4])
    plt.ylabel('some numbers')
    imgdata = io.BytesIO()
    fig.savefig(imgdata,format='PDF')
    doc = SimpleDocTemplate("document.pdf")
    Story = [Spacer(1,2*inch)]
    style = styles["Normal"]

    for i in range(5):
        bogustext = ("This is Paragraph number %s.  " % i) *20
        p = Paragraph(bogustext, style)
        Story.append(p)
        Story.append(Spacer(1,0.2*inch))
        pi = PdfImage(imgdata)

        Story.append(pi)
        Story.append(Spacer(1,0.2*inch))
    doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
go()

My question is very simple but i can't manage to do it properly, how do i change hAlin value? it seems when you look at the code that it os possible.

thank you all! Very simle but quite annoying

Upvotes: 0

Views: 58

Answers (1)

Becky
Becky

Reputation: 26


I just saw your question, I guess you have already solved your issue. Otherwise, you should just add an argument linked to hAlign in the init function of the PdfImage class (I don't know if this is the best solution, but it worked for me), which should look something like this:

class PdfImage(Flowable):
    def __init__(self, img_data, width=200, height=200, align='LEFT'):
        self.img_width = width
        self.img_height = height
        self.img_data = img_data
        self.hAlign = align

(all other lines of the original code remain the same). When you use PdfImage, you just set align as Reportlab's hAlign and it should work. Hope this answer helps!

Upvotes: 1

Related Questions