Reportlab错误:'Table'对象没有属性'_colpositions
我正在自学reportlab这个库,参考用户指南。我需要创建的文档只是一些格式化的文本,这些文本需要放在页面的特定位置。在下面的代码片段中,table_data是一个包含3个字符串的列表。我把Table导入为pdfTable,因为我的应用程序里有一个叫Table的类。
首先,我试了这个:
top_row = pdfTable(table_data, colWidths=(3*inch, 3*inch, inch))
结果出现了这个错误:
Traceback:
File "C:\Python33\lib\site-packages\django\core\handlers\base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in splash_page
86. generate_signup_sheets()
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in generate_signup_sheets
354. top_row = pdfTable(table_data, colWidths=(3*inch, 3*inch, inch))
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in __init__
253. raise ValueError("%s data error - %d columns in data but %d in column widths" % (self.identity(),ncols, len(colWidths)))
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in identity
332. v = cv[i][j]
Exception Type: IndexError at /index.html
Exception Value: list index out of range
因为看起来问题出在列宽上,而文档里说colWidths是可选的,所以我试了这个:
top_row = pdfTable(table_data)
结果又出现了这个错误:
Traceback:
File "C:\Python33\lib\site-packages\django\core\handlers\base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in splash_page
86. generate_signup_sheets()
File "C:/Users/Phoenix/PycharmProjects/gamecon\gameconapp\views\utilities.py" in generate_signup_sheets
355. top_row.drawOn(p, 0.75*inch, 0.5*inch)
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\flowables.py" in drawOn
110. self._drawOn(canvas)
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\flowables.py" in _drawOn
91. self.draw()#this is the bit you overload
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in draw
1363. self._drawBkgrnd()
File "C:\Python33\lib\site-packages\reportlab-3.0-py3.3-win-amd64.egg\reportlab\platypus\tables.py" in _drawBkgrnd
1386. colpositions = self._colpositions
Exception Type: AttributeError at /index.html
Exception Value: 'Table' object has no attribute '_colpositions'
reportlab的文档里没有任何示例显示Table是如何实际使用的。
提前感谢任何帮助。
编辑:添加了仍然出错的可执行代码:
import os
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.platypus import Table as pdfTable
filename = os.path.join(BASE_DIR, 'pdf_test_%s.pdf' %
( datetime.now().strftime('%d-%b-%Y %H-%M')))
p = canvas.Canvas(filename, pagesize=letter, bottomup=1)
table_data = [['a', 'b', 'c'], ['d', 'e', 'f']]
top_row = pdfTable([table_data]) #, colWidths=(3*inch, 3*inch, inch))
top_row.drawOn(p, 0.75*inch, 0.5*inch)
p.showPage()
p.save()
1 个回答
12
我觉得问题在于你只是传递了一个列表。Table
需要的是一个列表的列表,也就是一个二维数组。根据用户指南:
数据参数应该是一个序列,每个序列里面又包含多个单元格的值,这些值应该能通过 str 函数转换成字符串,或者是一个可流动的实例(比如段落),或者是这样的实例的列表(或元组)。
如果你只有一行数据,记得把这一行放进另一个列表里,然后再传给 Table
。如果这样还不行,请提供一个简单且可执行的代码示例。
附注:在用户指南的第77页有一个关于 Table
类的简单示例。
更新
现在我明白了。你正在使用 Flowable
,它通常是通过与 DocTemplate
结合使用,经过 platypus 布局引擎来处理的。这在第五章有详细解释。你现在是手动方式,直接绘制到画布上,所以你也需要自己编写“布局引擎”。在这种情况下,你首先需要使用 Table
的 wrapOn
方法。我不太清楚为什么,但似乎传递的参数大小并不重要。如果不行,可以尝试调整这些值。这里是我调整过的代码版本:
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.platypus import Table as pdfTable
filename = 'pdf_test.pdf'
p = canvas.Canvas(filename)
table_data = [['a', 'b', 'c'], ['d', 'e', 'f']]
top_row = pdfTable(table_data)
w, h = top_row.wrapOn(p, 0, 0)
top_row.drawOn(p, 0.75*inch, 0.5*inch)
p.showPage()
p.save()