使用ReportLab 2.7,Python 2.7:

我可以在目录(toc)中创建带有可点击书签的pdf,或者我可以创建一个带有“x of y”页码的pdf,但当我尝试同时执行这两个时,书签页(键)似乎会中断。

示例代码:

class MyDocTemplate(BaseDocTemplate):  
    def __init__(self, filename, **kw):
        self.allowSplitting = 0
        BaseDocTemplate.__init__(self, filename, **kw)
        template = PageTemplate('normal', [Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm)]) #, id='F1'
        self.addPageTemplates(template)

def afterFlowable(self, flowable):
    if isinstance(flowable, Paragraph):
        txt = flowable.getPlainText()
        style = flowable.style.name
        if style == 'Heading1':
            key = 'h1-%s' % self.seq.nextf('heading1')
            self.canv.bookmarkPage(key)                
            self.notify('TOCEntry', (0, txt, self.page))
        elif style == 'Heading2':
            key = 'h2-%s' % self.seq.nextf('heading2')
            print key
            self.canv.bookmarkPage(key)
            self.notify('TOCEntry', (1, txt, self.page, key))

class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        canvas.Canvas.__init__(self, *args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        """add page info to each page (page x of y)"""
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_page_number(num_pages)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_page_number(self, page_count):
        self.setFont('Times-Bold',14)
        self.drawRightString(7.6*inch,.5*inch,
        "Page %d of %d" % (self._pageNumber, page_count))

    h1 = PS(name = 'Heading1',
    fontSize = 14,
    leading = 16)
    h2 = PS(name = 'Heading2',
    fontSize = 12,
    leading = 14,
    leftIndent = 25)

    #Build story.
    story = []
    toc = TableOfContents()

    #For conciseness, using the same styles for headings and TOC entries
    toc.levelStyles = [h1, h2]
    story.append(toc)
    story.append(PageBreak())
    story.append(Paragraph('First heading', h1))
    story.append(Paragraph('Text in first heading', PS('body')))
    story.append(Paragraph('First sub heading', h2))
    story.append(Paragraph('Text in first sub heading', PS('body')))
    story.append(PageBreak())
    story.append(Paragraph('Second sub heading', h2))
    story.append(Paragraph('Text in second sub heading', PS('body')))
    story.append(Paragraph('Last heading', h1))
    doc = MyDocTemplate("mypdf.pdf")
    doc.multiBuild(story, canvasmaker=NumberedCanvas)

任何评论将不胜感激。

===============>>#1 票数:0

发现这最初寻找一个无济于事的解决方案,然而,想出一些对我有用的东西,并希望分享如下:

关于创建包含toc的文档的reportlab示例的起点 - 我假设您首先使用 - 请按以下步骤操作。

修改init函数中的模板赋值,方法是添加onPage和onPageEnd选项,定义调用函数,将页眉和页脚绘制到页面上,如下所示,猜测你只能在一个函数中做同样的事情,但是,我按顺序使用了两个在我的用例中分隔页眉/页脚部分:

template = PageTemplate('normal', [Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')],onPage=header,onPageEnd=footer)

将命名的页眉/页脚函数添加到您的类中,如下所示,并说明一些澄清选项,包括页脚函数中的页码,以确保回答问题:

def header(canvas, doc):
    canvas.saveState()
    canvas.drawImage('some_image.gif', 5,780, width=None,height=None,mask=None)
    canvas.setLineWidth(1)
    canvas.line(5,780,120,780)
    canvas.setFont('Times-Bold',16)
    canvas.drawString(108, 108, 'blah')
    canvas.restoreState()

def footer(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman',9)
    canvas.drawImage('py.jpg', inch,inch, width=None,height=None,mask=None)
    canvas.drawString(inch, 0.75 * inch, "Page %d " % doc.page)
    canvas.restoreState()   

无论你使用添加的'编号画布类'做了什么以及为什么它会中断我都不知道,但是因为你提供的代码让我想起了reportlab toc的例子,我想你可以从那开始,应用我建议的更改/添加并看到怎么回事。

应该做的伎俩,希望有所帮助!

  ask by Alex Revelos translate from so

未解决问题?本站智能推荐:

1回复

Python Reportlab分页符

我正在尝试使用python中的reportlab生成pdf报告。 我的目标是让我的pdf文件的第一页只有一个简单的标题和一个没有实际内容的表。 实际内容将从第二页开始。 在查看了一些SO帖子之后,我发现可以使用afterPage()命令来破解页面。 所以,我提出了这样的事情:
1回复

Reportlab:如何在pdf文件中添加页脚

我已经问过这个问题但是还没有答案,所以我想看一下似乎积极开发并比fpdf python库更好的Reportlab。 我已经看过这个问题给出的答案似乎与这篇博文大致相同。 无论如何,显示的剧本充满了错误,但我不想投票,OP接受它,似乎解决了他的问题,我是谁争辩,我宁愿问另一个问题。
1回复

reportlab canvas.showPage在循环条件下不起作用

我正在使用python reportlab生成pdf,在我的程序中,如果用户想要继续,则使用while循环生成多个pdf,但不是生成多个pdf,我需要包含多个页面的单个pdf。 我的代码:
2回复

Python ReportLab —表太宽,无法容纳页面

我正在使用ReportLab包(用于python)在PDF文件中创建表格,但该表格对于页面而言太宽,第一列和最后一列都被截断。 这是我正在使用的代码示例。 我试过使用splitbyRow和类似的参数,但似乎都没有用。 如何轻松使表格适合页面大小?
4回复

Python Reportlab PDF - 在页面上居中文本

我正在使用ReportLab使用python动态生成pdf。 我想在页面上居中一行文字。 这是我目前的具体代码,但不知道如何水平居中文本。 文本显示,我可以手动移动左侧位置,使文本看起来居中,但我需要以编程方式居中,因为文本将是动态的,我不知道会有多少文本。
2回复

ReportLab LayoutError:页面太大

我正在使用ReportLab进行我的第一个程序,我不知道预先在哪里分页会掉线而且我遇到了麻烦。 为了简单SimpleDocTemplate我正在使用SimpleDocTemplate 。 我的flowables看起来像这样: 当我构建我的PDF时,只要我的n或m或多个正文段落适合一页
1回复

Python Reportlab中的动态帧大小

我尝试使用Python中的reportlab生成一个发货清单。 我试图通过使用Platypus Frames将所有部件(如发件人地址,接收器地址,表格)放置到位。 我遇到的第一个问题是我需要很多Frames来正确定位所有内容,使用Platypus有更好的方法吗? 因为我希望发件人地址和
1回复

Reportlab,如何更改页面方向?

我正在创建包含许多页面的pdf文件。 我希望第一页为纵向,其余页面为横向。 我试过了, story.append(NextPageTemplate('landscape')) refererence 但是我知道了 ValueError: can't find template
1回复

当我想使用python reportlab保存pdf时,使用带有非ASCII字符的路径时会遇到麻烦吗?

我写了一些简单的函数来从reportlab生成pdf,但是当路径为非ASCII(例如中文)时,会出现UnicodeDecodeError: 'utf8' codec can't decode byte 0xd0 in position 3: invalid continuation byte问题
1回复

Python:使用Reportlab Canvas在PDF中打印Html

对于我的一个python项目,我使用reportlab的canvas功能来生成pdf文档。 任何人都可以帮我在reportlab画布上打印html(p,strong,ul,ol,li,img,alignments)的小部分吗? 提前致谢...