【问题标题】:How to enter static canvas layout in Reportlab Frame如何在 Reportlab Frame 中输入静态画布布局
【发布时间】:2020-05-23 20:33:44
【问题描述】:

我正在尝试创建一个包含框架的文档,该框架可以从 Canvas 中获得定义的布局,然后对多个框架使用相同的格式。

因此,理想情况下,该框架将能够根据框架内的可流动段落大小而增长。因此,每一帧中都会有一个不同类型的标题,然后是一个不同大小的段落。我一直在反对试图解决这个问题的文档。我的框架也应该堆叠一个在另一个之上。因此,根据大小,如果页面上有一个 Frame 并且段落中有很多文本,则可能只有一个 Frame 适合页面。但是,如果有两个 Frames 的段落足够小,那么这两个 Frames 将适合一页。

对于它的价值,这是我开始的一些代码:

from reportlab.platypus import BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageBreak, \
    PageTemplate, NextFrameFlowable
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import landscape, letter
from reportlab.rl_config import defaultPageSize
from reportlab.lib.units import mm, inch
from reportlab.lib.colors import *
from reportlab.platypus import Paragraph, Frame, Spacer, SimpleDocTemplate

styles = getSampleStyleSheet()
logo_image = r'C:\Users\user\Desktop\FlaskReportApp\application\static\images\logo.JPG'


doc = BaseDocTemplate('basedoc.pdf', defaultPageSize=letter, showBoundary=1)


def foot1(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman', 14)
    canvas.drawString(inch, 0.75 * inch, "Page %d" % doc.page)
    canvas.drawImage(logo_image, 45, 685, width=150, preserveAspectRatio=True)
    canvas.restoreState()


# Two Columns
frame1 = Frame(doc.leftMargin, inch*8, doc.width, inch*2, id='col1', showBoundary=1)

frame2 = Frame(doc.leftMargin, inch*5.5, doc.width, inch*2, id='col2', showBoundary=1)

template = PageTemplate(id='TwoBoxKeystroke', frames=[frame1, frame2], onPage=foot1)

doc.addPageTemplates([template])

story = []
story.append(Paragraph("Frame one box,  " * 20, styles['Normal']))
story.append(Paragraph("Frame two box,  " * 20, styles['Normal']))

doc.build(story)

您如何根据框架内不同的段落大小等因素准确地使框架的大小动态变化?

【问题讨论】:

    标签: python python-3.x canvas pdf-generation reportlab


    【解决方案1】:

    框架通常位于给定类型的页面布局中的固定位置,并且正在使用的页面布局切换为偶数/奇数/第一/最后/章节页面。这种机制主要由 DocTemplate 操作,而无需了解 flowables 本身。

    有一次我改变了这个是通过插入一个platypus.NextPageTemplate('chapter-{}'.format(chapter)) flowable,通常紧跟一个platypus.PageBreak(),它可以让你切换PageTemplate以在下一页使用。

    在我的例子中,NextPageTemplate 有一些画布级别的绘图(在可流动对象之外),以在外页叶下方生成一个彩色标记,突出当前章节。它的工作原理如下:

    • 使用doc = platypus.BaseDocTemplate() 文档模板。
    • 为列表中的每个章节创建一个platypus.PageTemplate(frames=..., id=..., onPage=..),其中
    • onPage 是一个可调用函数,可在画布上呈现适当的活动标记,部分应用相同的 ID。
    • 将所有 PageTemplates 添加到列表中并使用doc.addPageTemplates(templates) 注册
    • 用于所有后续页面的PageTemplate 的ID 是platypus.NextPageTemplate(id) 的参数

    也许您可以通过测量文本并提前设置模板来创建所需的布局。否则,您可能希望保持 Frames 固定(整页),并尝试在 Paragraph flowables 周围使用 padding/margin 来实现您想要的外观。

    或者,它可能非常专业,以至于您自己将新页面扔到画布上并手动进行框架布局,并一次将一个段落附加到新框架并在画布上绘制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多