1

我正在使用 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 和类似的参数,但似乎没有一个有效。如何轻松使表格适合页面?

4

3 回答 3

3

您可以使用该页面的框架获取页面宽度。当您使用 colWidths 关键字时,您应该知道您有多少可用空间:

table = ar.Table(data, colWidths=columnWidths)#there is also rowHeights=
table.setStyle(tableStyle) 

当表格在构建时自行绘制时,您必须配置表格以便它使用将要绘制的框架的可用宽度。

可以计算这些 colWidths 以便它们使用可用空间。为了证明这一点,我将不得不使用一个扩展示例,我将尝试不使用:

首先你应该定义你自己的文档类,它继承自 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)
于 2017-01-23T18:06:44.010 回答
1

表格被裁剪了,因为它超出了页面宽度。解决方案是为 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)
于 2020-09-30T10:55:33.477 回答
0

您可以在名为 colWidths=[250,250] 的 TableData 上添加另一个设置...这是我的代码片段,我在其中设置了宽度和一些样式:

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)

如果您查看第三行,我有一个 colWidths,我在其中指定我希望列的宽度,然后我在几行之后设置样式。

于 2014-10-09T18:57:05.753 回答