我正在尝试创建一个具有可从Canvas中获得已定义布局的框架的文档,然后对多个框架使用相同的格式。
因此,理想情况下,该框架将能够根据框架内部可流动段落的大小而增长。因此,每帧中都会有各种标题,后跟一段大小不一的段落。我一直在反对试图解决这个问题的文档。我的框架也应该一个堆叠在另一个之上。因此,根据大小,如果页面上有一个框架,而段落中的文本很多,则页面上可能只有一个框架。但是,如果有两个具有足够小的段落的框架,则这两个框架将适合一页。
关于它的价值,这是我开始的一些代码:
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.NextPageTemplate('chapter-{}'.format(chapter))
可流动的,通常紧接着是一个platypus.PageBreak()
,它使您可以切换PageTemplate
在下一页上使用。
在我的情况下,NextPageTemplate
有一些画布级别的绘图(在可流动对象的外部),以便在外页叶子下方生成彩色标记,突出显示当前章节。它的工作方式如下:
doc = platypus.BaseDocTemplate()
文档模板。platypus.PageTemplate(frames=..., id=..., onPage=..)
,其中onPage
是可调用的,它使适当的标记在画布上处于活动状态,并部分应用了相同的ID。doc.addPageTemplates(templates)
中注册PageTemplate
的ID是platypus.NextPageTemplate(id)
的参数也许您可以通过测量文本并预先设置模板来创建所需的布局。否则,您可能希望保持框架固定(整页),并在Paragraph流动对象周围尝试填充/边距来获得所需的外观。
或者,它可能是如此专业,以至于您自己将新页面扔到画布上,并手工进行框架布局,一次将一个段落追加到新框架上,然后将其绘制在画布上。