使用ReportLab的一个主要用例涉及使用数据文件并将其转换为一个报告或一系列报告。 有许多常见的数据文件类型,例如XML,JSON,CSV,固定宽度的文件格式等。在本文中,我们将研究如何获取XML数据文件并将其转换为报告。
您将创建的代码将支持基于XML数据文件中的数据量生成多页报告。
简述
通常,客户端会给您一个数据文件以及他们希望您从该文件生成的输出。 有时,您将需要设计自己的规范以供客户端使用,但是我很少遇到这种情况。 接收数据文件和报告时,要做的第一件事是确定各种数据在报告中的位置。 在这种情况下,这些片段将在XML标签中,因此它们实际上将被标记。 这使事情变得容易得多,尤其是在XML具有良好标签名称的情况下。 固定宽度的数据文件比较困难,因为它们没有您可以一眼看出来的命名字段。
一旦确定了现有文档中的所有内容,就可以开始创建一些代码了。 每个开发人员都是不同的。 您可以从此时开始为XML编写解析器开始。 或者,您可以尝试使用一些硬编码的值来布局文档。 解析器和布局代码应该位于单独的模块中,因此,首先完成的功能并不重要。
创建基类
让我们开始设计报告,方法是创建一个我们可以使用的基类。 我们将列出一些我们认为也将需要的方法。 将以下代码保存到名为eob.py的文件中:
代码略
您会注意到,在我们第一次尝试生成利益解释(EOB)时,我们使用ReportLab的canvas模块。 您也可以从鸭嘴兽开始,但为简单起见,我们将从画布开始,然后在需要时将其更新为使用鸭嘴兽。 __init__方法是我们创建画布实例的地方。 我们还创建一些类属性来定义页面的宽度和高度。 您还将注意到,我们创建了样式表,将其用于设置段落的样式。
我们创建的下一个方法称为coord。 我们将使用此方法最终帮助我们在页面上定位元素。
接下来,我们创建三个存根方法:create_header,create_payment_summary和create_claims。 这些方法现在不执行任何操作。 最后一种方法是我们的保存方法,它仅将PDF保存到磁盘。
最后,我们有main函数。 在这里,我们创建EOB实例并告诉它保存。 这段代码将生成一个空白的PDF,这并不是很有趣。 因此,让我们通过更新create_header方法使我们的代码有用:
代码略
在这里,我们创建一些格式化的文本并将其添加到在画布上固定位置绘制的段落中。 然后,我们创建更多文本,将其添加到第二段中并进行绘制。 不要忘记更新main()方法来调用您的create_header方法:
def main(pdf_file):
''''''
eob = EOB(pdf_file)
eob.create_header()
eob.save()
将此代码另存为eob2.py,然后运行脚本。 如果一切正常,您应该得到一个如下所示的PDF:
添加摘要部分
让我们继续并更新EOB类中的另一个方法。 这次,我们将填写create_payment_summary方法:
代码略
在这里,我们使用文本创建了另一个Paragraph对象,并且还创建了Table。 该表将保存付款摘要。 您会注意到,我们在这里调用了另一个名为create_bold_text的方法。 现在创建该方法:
def create_bold_text(self, text, size=8):
''''''
return Paragraph('''<font size={size}><b>
{text}</b></font>
'''.format(size=size, text=text),
self.styles['Normal'])
这只是一个辅助方法,它将字符串和字体大小作为参数。 然后它将返回一个使文本加粗的Paragraph对象。 对于此版本的代码,请将其另存为eob3.py。 请注意,您还需要更新main()函数,以便它调用您新定义的方法:
def main(pdf_file):
''''''
eob = EOB(pdf_file)
eob.create_header()
eob.create_payment_summary()
eob.save()
将此代码另存为eob3.py。 运行此更新的代码时,您将看到结果现在如下所示:
添加声明部分
我们需要创建的下一个方法是EOB类中的create_claims方法。 该方法比到目前为止我们所研究的任何其他方法都要长一些。 让我们看一下:
代码略
详情参阅 - 亚图跨际