Reportlab header 无法流动 Table
Reportlab header out of flowable Table
我正在尝试创建一个 header,它将出现在我使用 Reportlab 生成的 PDF 文档的每一页上。
我想要实现的是有一个 header 由 Table.
组成
我有一个方法可以像这样创建 header:
def make_header(self, canvas, doc):
small_size = '8'
big_size= '10'
paragraphs = {}
canvas.saveState()
for key, name in (('doc_type', 'Document type'), ('owner', 'Owner'),
('classification', 'Classification'),
('document_nr', 'Document Number'),
('date', 'Date'),
('revision', 'Revision'),
('title', 'Title')):
t = self.header_info[key] if self.header_info[key] else ''
paragraphs[key] = [Paragraph('<font size={}>{}</font>'.format(small_size, name), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, t), style=styles['Normal'])]
im = self.scale_image("image.jpg", 10*cm)
page = [Paragraph('<font size={}>{}</font>'.format(small_size, 'Page'), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, doc.page), style=styles['Normal'])]
t = Table([[im, paragraphs['doc_type'], paragraphs['owner'], paragraphs['date']],
['', paragraphs['classification'], paragraphs['document_nr'], paragraphs['revision']],
['', paragraphs['title'],'', page]])
t.setStyle([('SPAN', (0,0), (0,2)),
('SPAN', (1,2), (2,2)),
('ALIGN', (0,0), (0,0), 'CENTER'),
('VALIGN', (0,0), (0,0), 'MIDDLE'),
('VALIGN', (1,0), (-1,-1), 'TOP')])
self.table_grid(t)
t.wrapOn(canvas, self.width-50, self.height)
t.drawOn(canvas, *self.coord(10,10, mm))
canvas.restoreState()
然后执行以下操作:
def build(self):
t = Paragraph('test', style=styles['Normal'])
self.doc.build([t], onFirstPage=self.make_header)
我的文档中唯一出现的是 "test" 字符串,而不是 header。
我已经通过在 make_header 函数中使用 print 进行了测试,所以我知道它被调用并且 运行.
我找不到丢失的东西所以请帮助我正确的方向。
您好,您的问题与缺失元素有点混淆。我认为问题在于您对如何使用 wrapOn 和 drawOn 的想法。这是我的破解版本,它至少做了一些事情;有关 reportlab 的更多帮助和讨论,您可以在用户列表 https://pairlist2.pair.net/mailman/listinfo/reportlab-users
中询问
from reportlab.platypus import Spacer, SimpleDocTemplate, Table, TableStyle
from reportlab.platypus.paragraph import Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
from reportlab.lib.units import inch
styles = getSampleStyleSheet()
class Test:
header_info = dict(
doc_type='MMMMM',
)
def make_header(self, canvas, doc):
small_size = '8'
big_size= '10'
paragraphs = {}
canvas.saveState()
pageWidth, pageHeight = canvas._pagesize
for key, name in (('doc_type', 'Document type'), ('owner', 'Owner'),
('classification', 'Classification'),
('document_nr', 'Document Number'),
('date', 'Date'),
('revision', 'Revision'),
('title', 'Title')):
t = self.header_info.get(key,'')
paragraphs[key] = [Paragraph('<font size={}>{}</font>'.format(small_size, name), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, t), style=styles['Normal'])]
#im = self.scale_image("image.jpg", 10*cm)
page = [Paragraph('<font size={}>{}</font>'.format(small_size, 'Page'), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, doc.page), style=styles['Normal'])]
t = Table([['im', paragraphs['doc_type'], paragraphs['owner'], paragraphs['date']],
['', paragraphs['classification'], paragraphs['document_nr'], paragraphs['revision']],
['', paragraphs['title'],'', page]],
style=[('SPAN', (0,0), (0,2)),
('SPAN', (1,2), (2,2)),
('ALIGN', (0,0), (0,0), 'CENTER'),
('VALIGN', (0,0), (0,0), 'MIDDLE'),
('VALIGN', (1,0), (-1,-1), 'TOP'),
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 2, colors.black),
])
#self.table_grid(t)
w,h = t.wrapOn(canvas, pageWidth-20, pageHeight-20)
t.drawOn(canvas, 10, pageHeight-h-10)
canvas.restoreState()
def __init__(self):
self.doc = SimpleDocTemplate('Whosebug-48184260.pdf')
def build(self):
t = Paragraph('test', style=styles['Normal'])
self.doc.build([t], onFirstPage=self.make_header)
if __name__=='__main__':
test = Test()
test.build()
我正在尝试创建一个 header,它将出现在我使用 Reportlab 生成的 PDF 文档的每一页上。 我想要实现的是有一个 header 由 Table.
组成我有一个方法可以像这样创建 header:
def make_header(self, canvas, doc):
small_size = '8'
big_size= '10'
paragraphs = {}
canvas.saveState()
for key, name in (('doc_type', 'Document type'), ('owner', 'Owner'),
('classification', 'Classification'),
('document_nr', 'Document Number'),
('date', 'Date'),
('revision', 'Revision'),
('title', 'Title')):
t = self.header_info[key] if self.header_info[key] else ''
paragraphs[key] = [Paragraph('<font size={}>{}</font>'.format(small_size, name), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, t), style=styles['Normal'])]
im = self.scale_image("image.jpg", 10*cm)
page = [Paragraph('<font size={}>{}</font>'.format(small_size, 'Page'), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, doc.page), style=styles['Normal'])]
t = Table([[im, paragraphs['doc_type'], paragraphs['owner'], paragraphs['date']],
['', paragraphs['classification'], paragraphs['document_nr'], paragraphs['revision']],
['', paragraphs['title'],'', page]])
t.setStyle([('SPAN', (0,0), (0,2)),
('SPAN', (1,2), (2,2)),
('ALIGN', (0,0), (0,0), 'CENTER'),
('VALIGN', (0,0), (0,0), 'MIDDLE'),
('VALIGN', (1,0), (-1,-1), 'TOP')])
self.table_grid(t)
t.wrapOn(canvas, self.width-50, self.height)
t.drawOn(canvas, *self.coord(10,10, mm))
canvas.restoreState()
然后执行以下操作:
def build(self):
t = Paragraph('test', style=styles['Normal'])
self.doc.build([t], onFirstPage=self.make_header)
我的文档中唯一出现的是 "test" 字符串,而不是 header。 我已经通过在 make_header 函数中使用 print 进行了测试,所以我知道它被调用并且 运行.
我找不到丢失的东西所以请帮助我正确的方向。
您好,您的问题与缺失元素有点混淆。我认为问题在于您对如何使用 wrapOn 和 drawOn 的想法。这是我的破解版本,它至少做了一些事情;有关 reportlab 的更多帮助和讨论,您可以在用户列表 https://pairlist2.pair.net/mailman/listinfo/reportlab-users
中询问from reportlab.platypus import Spacer, SimpleDocTemplate, Table, TableStyle
from reportlab.platypus.paragraph import Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
from reportlab.lib.units import inch
styles = getSampleStyleSheet()
class Test:
header_info = dict(
doc_type='MMMMM',
)
def make_header(self, canvas, doc):
small_size = '8'
big_size= '10'
paragraphs = {}
canvas.saveState()
pageWidth, pageHeight = canvas._pagesize
for key, name in (('doc_type', 'Document type'), ('owner', 'Owner'),
('classification', 'Classification'),
('document_nr', 'Document Number'),
('date', 'Date'),
('revision', 'Revision'),
('title', 'Title')):
t = self.header_info.get(key,'')
paragraphs[key] = [Paragraph('<font size={}>{}</font>'.format(small_size, name), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, t), style=styles['Normal'])]
#im = self.scale_image("image.jpg", 10*cm)
page = [Paragraph('<font size={}>{}</font>'.format(small_size, 'Page'), style=styles['Normal']),
Paragraph('<font size={}>{}</font>'.format(big_size, doc.page), style=styles['Normal'])]
t = Table([['im', paragraphs['doc_type'], paragraphs['owner'], paragraphs['date']],
['', paragraphs['classification'], paragraphs['document_nr'], paragraphs['revision']],
['', paragraphs['title'],'', page]],
style=[('SPAN', (0,0), (0,2)),
('SPAN', (1,2), (2,2)),
('ALIGN', (0,0), (0,0), 'CENTER'),
('VALIGN', (0,0), (0,0), 'MIDDLE'),
('VALIGN', (1,0), (-1,-1), 'TOP'),
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 2, colors.black),
])
#self.table_grid(t)
w,h = t.wrapOn(canvas, pageWidth-20, pageHeight-20)
t.drawOn(canvas, 10, pageHeight-h-10)
canvas.restoreState()
def __init__(self):
self.doc = SimpleDocTemplate('Whosebug-48184260.pdf')
def build(self):
t = Paragraph('test', style=styles['Normal'])
self.doc.build([t], onFirstPage=self.make_header)
if __name__=='__main__':
test = Test()
test.build()