Reporlab使用类PDFImage更改hAline

时间:2018-07-10 12:11:00

标签: python python-3.x image pdf reportlab

大家好我是python的初学者,所以我还不了解所有内容,但这是我的问题所在。

我正在使用reportlab制作自动报告。在此,我使用PDF图像。为了使其兼容,我使用了此类(有一个例子)

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()

我的问题很简单,但我无法正确处理,如何更改hAlin值?当您查看代码时,似乎是可能的。

谢谢大家!很简单但是很烦人

1 个答案:

答案 0 :(得分:0)


我刚刚看到您的问题,我想您已经解决了您的问题。否则,您应该只在PdfImage类的 init 函数中添加一个链接到hAlign的参数(我不知道这是否是最好的解决方案,但是对我有用),它看起来应该是像这样:

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

(原始代码的所有其他行均保持不变)。 使用PdfImage时,只需将align设置为Reportlab的hAlign即可。 希望这个答案有帮助!