Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Reportlab框架中输入静态画布布局_Python_Python 3.x_Canvas_Pdf Generation_Reportlab - Fatal编程技术网

Python 如何在Reportlab框架中输入静态画布布局

Python 如何在Reportlab框架中输入静态画布布局,python,python-3.x,canvas,pdf-generation,reportlab,Python,Python 3.x,Canvas,Pdf Generation,Reportlab,我正在尝试创建一个文档,该文档包含可以从画布中定义布局的框架,然后对多个框架使用相同的格式 因此,理想情况下,该框架将能够根据框架内的可流动段落大小进行增长。因此,在每一帧中都会有一个排序标题,后面是一个大小不同的段落。我一直在和医生们较劲,试图弄明白这一点。我的相框也应该一个叠在另一个上面。因此,根据大小,如果页面上有一个框架,段落中有大量文本,那么页面上可能只适合一个框架。但如果有两个框架的段落足够小,那么这两个框架就可以放在一页上 值得一提的是,以下是我开始编写的一些代码: from re

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

因此,理想情况下,该框架将能够根据框架内的可流动段落大小进行增长。因此,在每一帧中都会有一个排序标题,后面是一个大小不同的段落。我一直在和医生们较劲,试图弄明白这一点。我的相框也应该一个叠在另一个上面。因此,根据大小,如果页面上有一个框架,段落中有大量文本,那么页面上可能只适合一个框架。但如果有两个框架的段落足够小,那么这两个框架就可以放在一页上

值得一提的是,以下是我开始编写的一些代码:

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)

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

框架通常位于给定页面布局类型中的固定位置,并且使用的页面布局针对偶数/奇数/第一/最后/章节页面进行切换。该机制主要由DocTemplate操作,而不知道流动物本身

有一次我改变了这一点,插入了一个
platypus.nextPagetTemplate('chapter-{}.format(chapter))
flowable,通常紧接着是一个
platypus.PageBreak()
,它允许您切换
PageTemplate
,以便在下一页上使用

在我的例子中,
nextPagetTemplate
有一些画布级别的绘图(在flowables之外),以在外部页面叶下生成一个彩色标记,突出显示当前章节。它的工作如下:

  • 使用
    doc=platypus.BaseDocTemplate()
    文档模板
  • 为列表中的每个章节创建一个
    platypus.PageTemplate(frames=…,id=…,onPage=…)
    ,其中
  • onPage
    是一个可调用函数,用于在画布上呈现适当的活动标记,部分标记使用相同的id应用
  • 将所有页面模板添加到列表中,并将其注册到
    doc.addPageTemplates(模板)
  • 用于所有后续页面的
    PageTemplate的id是
    platypus.NextPageTemplate(id)
也许您可以通过测量文本和预先设置模板来创建所需的布局。否则,您可能希望保持框架固定(整页),并尝试在段落流动性周围添加填充/边距,以获得所需的外观

或者,它可能是如此专业,你自己把新的页面扔到画布上,用手做框架的布局,一次在一个新的框架上附加一个段落,然后在画布上绘制