我正在使用用于python的ReportLab包在PDF文件中创建一个表,但该表对于页面而言太宽而且第一列和最后一列被截断。以下是我正在使用的代码示例。
t = Table(data, style=[("INNERGRID", (0,0), (-1,-1), 0.25, colors.black),("BOX", (0,0), (-1,-1), 0.25, colors.black)])
我尝试过使用splitbyRow和类似的参数,但似乎都没有。如何轻松地使表格适合页面?
答案 0 :(得分:2)
您可以使用该页面的框架获取页面宽度。 当您使用colWidths关键字时,您应该知道可用空间:
table = ar.Table(data, colWidths=columnWidths)#there is also rowHeights=
table.setStyle(tableStyle)
当表格在构建时绘制时,您必须配置表格,以便它使用将要绘制的帧的可用宽度。
可以计算这些colWidth,以便它们使用可用空间。 为了表明这一点,我将不得不使用一个扩展示例,我将尝试不用:
首先,您应该定义自己的文档类,该类继承自BaseDocTemplate:
class MyDocTemplate(BaseDocTemplate):
def __init__(self, filename):
BaseDocTemplate.__init__(self, filename)
#there are more keyword
#arguments you can pass
#pagesize=A4,
#leftMargin=leftMargin,
#rightMargin=rightMargin,
#topMargin=topMargin,
#bottomMargin=bottomMargin,
#title=title,
#author=author,
#subject=subject,
#creator=creator)
然后,如果您创建文档:
doc = MyDocTemplate(fileName)
您可以通过文档类中的自定义函数获取框架的宽度:
frame = doc.getFrame('FirstL')
width = frame._aW
此功能可能如下所示:
def getFrame(self,framename,orientation="Portrait"):
"""
returns frame
frame._x1,frame._y1
frame._width,frame._height
frame._leftPadding,frame._bottomPadding
frame._rightPadding,frame._topPadding
"""
f = attrgetter("id")
frame = None
for temp in self.pageTemplates[::-1]:
if f(temp) == framename:
#print( temp.id )
for frame in temp.frames:
print( frame.id )
if f(frame) == orientation:
return frame
reportlab非常复杂,我试着解释一下如何将页面模板注册为文档类列表
pageTemplates是一个列表,您可以将页面模板添加到:
templates.append( PageTemplate(id='FirstL',frames=frameL,onPage=onFirstPage,pagesize=pagesize) )
onFirstPage是一个函数,它使用以下方案:
def drawFirstPage(canv,doc):
"""
This is the Title Page Template (Portrait Oriented)
"""
canv.saveState()
#set Page Size or do some other things on the canvas
frame = doc.getFrame('FirstP')
canv.setPageSize( frame.pagesize )
canv.setFont(_baseFontName,doc.fontSize)
canv.restoreState()
当您添加这样的页面模板时,建议的功能应该起作用:
doc.addPageTemplates(templates)
答案 1 :(得分:0)
你可以在TableData上添加另一个名为colWidths = [250,250]的设置...这里是我的代码片段,我设置了宽度和一些样式:
DetailedWorkData = [["Detailed Work Information",""],
["Procedure: XXXXX", "Planned by: XXXXXX"]]
b = Table(DetailedWorkData, colWidths=[285,285])
b.hAlign = "LEFT"
b.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),HexColor("#C0C0C0")),
('GRID',(0,1),(-1,-1),0.01*inch,(0,0,0,)),
('FONT', (0,0), (-1,0), 'Helvetica-Bold')]))
Story.append(b)
如果你看第3行,我有一个colWidths,我指定列的宽度,然后我将样式设置为几行。
答案 2 :(得分:0)
表已超出页面宽度,因此已被裁剪。解决方案是为pdf创建自定义页面大小。
from reportlab.platypus import SimpleDocTemplate , Table
pagesize = (20 * inch, 10 * inch)
doc = SimpleDocTemplate('sample.pdf', pagesize=pagesize)
data = [ ['sarath', 'indiana', 'usa'],
['jose', 'indiana', 'shhs'] ] # give data as lists with lists.
table = Table(data)
elems = []
elems.append(table)
doc.build(elems)