0

我的文档有几个纵向和几个横向 A4 页面。基本上我希望我的所有页面都采用相同的纵向布局,但对于那些横向布局,我想将框架方向旋转 90 度,所以最后我将在所有页面上拥有相同的页眉/页脚(只有正文有些页面会旋转)。我怎样才能做到这一点?

下面是我的第一个布局草稿,我使用自定义画布制作器,因为我想要总页数 x。 https://pastebin.com/jip0Pb61

_margin_top = 10*mm
_margin_bottom = 30*mm
_margin_left = 20*mm
_margin_right = 50*mm
_footer_height = 30*mm
_header_height = 20*mm

class PageNumCanvas(canvas.Canvas):
    """
    http://code.activestate.com/recipes/546511-page-x-of-y-with-reportlab/
    http://code.activestate.com/recipes/576832/
    """
    #----------------------------------------------------------------------
    def __init__(self, *args, **kwargs):
        """Constructor"""
        canvas.Canvas.__init__(self, *args, **kwargs)
        self.pages = []

    #----------------------------------------------------------------------
    def showPage(self):
        """
        On a page break, add information to the list
        """
        self.pages.append(dict(self.__dict__))
        self._startPage()

    #----------------------------------------------------------------------
    def save(self):
        """
        Add the page number to each page (page x of y)
        """
        page_count = len(self.pages)

        for page in self.pages:
            self.__dict__.update(page)
            self.draw_page_number(page_count)
            canvas.Canvas.showPage(self)

        canvas.Canvas.save(self)

    #----------------------------------------------------------------------
    def draw_page_number(self, page_count):
        """
        Add the page number
        """
        page = "Page %s of %s" % (self._pageNumber, page_count)
        self.setFont("Helvetica", 9)
        self.drawCentredString(210*mm/2, 10*mm, page)


class FrontCoverTemplate(PageTemplate):
    def __init__(self):
        frame  = Frame( _margin_left, _margin_bottom+_footer_height, 210*mm-(_margin_left+_margin_right), 297*mm-(_margin_top+_margin_bottom+_header_height+_footer_height), id='main_frame', showBoundary=1,rightPadding=0, leftPadding=0, topPadding=0, bottomPadding=0)
        PageTemplate.__init__(self, id='first',frames=[frame], pagesize=A4)

    def beforeDrawPage(self,canvas,doc):
        styles = getSampleStyleSheet()
        canvas.saveState()
        #header
        #draw header border
        canvas.setFillColorRGB(1,0,1)
        canvas.rect(_margin_left,297*mm-_margin_top-_header_height,210*mm-_margin_left-_margin_right,_header_height, fill=1)

        #footer
        canvas.setFillColorRGB(1,0,1)
        canvas.rect(_margin_left,_margin_bottom,210*mm-_margin_left-_margin_right,_footer_height, fill=1)
        canvas.drawString(_margin_left,_margin_bottom-10*mm, "My address")
        canvas.restoreState()


#to be updated
class LaterTemplate(PageTemplate):
    def __init__(self):

        frame  = Frame( 20*mm, 20*mm, 297*mm-40*mm, 210*mm-40*mm, id='main_frame', showBoundary=1,rightPadding=0, leftPadding=0, topPadding=0, bottomPadding=0)
        PageTemplate.__init__(self, id='later',frames=[frame],pagesize=landscape(A4))



class DeviceMontageOrder():

    def __init__(self):

        self.buffer = BytesIO()
        pdfmetrics.registerFont(TTFont('Roboto', 'Roboto-Regular.ttf'))
        self.styles = getSampleStyleSheet()####styles
        self.moj_styl=ParagraphStyle('moj_styl',
                                alignment=TA_LEFT,
                                fontSize=8,
                                fontName="Roboto")
        self.maly_styl=ParagraphStyle('maly_styl',
                                alignment=TA_LEFT,
                                fontSize=6,
                                fontName="Roboto")
        margin = 0.8*cm
        self.doc = BaseDocTemplate(self.buffer)
        self.doc.addPageTemplates(
                [
                    FrontCoverTemplate(),
                    LaterTemplate(),
                    ])



    def get_info_page(self):
        elements =[]
        elements.append(Paragraph("Jedziemy gdzieśtam",self.moj_styl))
        return elements

    def get_device_page(self):
        elements =[]
        elements.append(Paragraph("Montujemy sobie cośtam",self.moj_styl))
        return elements

    def print_single_order(self):

        elements=[]
        elements.append(NextPageTemplate('first'))
        elements = elements + self.get_info_page()
        elements.append(PageBreak())
        elements.append(NextPageTemplate('later'))

        elements = elements + self.get_device_page()
        elements.append(PageBreak())
        elements = elements + self.get_device_page()
        print(elements)
        self.doc.build(elements,canvasmaker=PageNumCanvas)

        # Get the value of the BytesIO buffer and write it to the response.
        pdf = self.buffer.getvalue()
        self.buffer.close()
        return pdf
4

0 回答 0