我正在尝试从用户指南中自学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文档中的所有示例都没有显示实际使用的表。
提前感谢您的帮助。
编辑添加仍然失败的可执行代码:
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()
答案 0 :(得分:4)
我认为问题在于你只是传递一个清单。 Table
想要一个列表列表,例如2D阵列。来自用户指南:
数据参数是每个单元格值序列的序列 哪个应该可以使用str函数转换为字符串值 或者应该是Flowable实例(例如段落)或列表(或者 元组)这样的例子。
如果您只有一行,请将该行封装到另一个列表中并将其传递给Table。如果这不起作用,请发布最小的可执行代码示例。
P.S。用户指南的第77页是Table
- 类
<强>更新强>
现在我明白了。您正在使用Flowable
,通常将其与DocTemplate
结合使用,通常应该通过platypus layout-engine。这将在第5章中详细解释。您通过直接绘制到画布使用手动方式,因此您还必须编写自己的&#34;自己的&#34;布局引擎。在这种情况下,您首先必须使用wrapOn
的{{1}}方法。我真的不知道为什么,但看起来你作为参数传递的大小并不重要。如果它不起作用,请尝试使用这些值。这是我调整后的代码版本:
Table