gridview 空資料 寬度_Python使用Reportlab處理PDF資料詳解第2部分
技術標籤:gridview 空資料 寬度
背景知識視訊教程
Reportlab Python完整教程Python PDF處理viadean.com Python自動化Excel,Word,PDF,Web爬取等 - 國外課棧viadean.com Python:資料分析 - 國外課棧viadean.com將資料轉換為PDF
我們將嘗試通過ReportLab複製該文件的佈局。
您將建立的程式碼將支援基於XML資料檔案中的資料量生成多頁報告。 讓我們看看如何!
通常,客戶端會給您一個數據檔案以及他們希望您從該檔案生成的輸出。 有時,您將需要設計自己的規範以供客戶端使用,但我很少遇到這種情況。 接收資料檔案和報告時,要做的第一件事是確定各種資料在報告中的位置。 在這種情況下,這些片段將在XML標籤中,因此它們實際上將被標記。 這使事情變得容易得多,尤其是在XML具有良好標籤名稱的情況下。 固定寬度的資料檔案更加困難,因為它們沒有命名欄位,您可以一目瞭然。
一旦確定了現有文件中的所有內容,就可以開始建立一些程式碼了。 每個開發人員都是不同的。 您可以從此時開始為XML編寫解析器開始。 或者,您可以嘗試使用一些硬編碼的值來佈局文件。 解析器和佈局程式碼應該位於單獨的模組中,因此,首先完成哪種功能並不重要。
讓我們開始設計報告,方法是建立一個可以使用的基類。 我們將列出一些我們認為也將需要的方法。 將以下程式碼儲存到名為eob.py的檔案中:
from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet from reportlab.pdfgen import canvas from reportlab.platypus import SimpleDocTemplate, Paragraph, Table from reportlab.lib.units import inch, mm class EOB: ''' Explanation of Benefits PDF Class ''' def __init__(self, pdf_file): '''''' self.canvas = canvas.Canvas(pdf_file, pagesize=letter) self.styles = getSampleStyleSheet() self.width, self.height = letter def coord(self, x, y, unit=1): x, y = x * unit, self.height - y * unit return x, y def create_header(self): '''''' pass def create_payment_summary(self): '''''' pass def create_claims(self): '''''' pass def save(self): '''''' self.canvas.save() def main(pdf_file): '''''' eob = EOB(pdf_file) eob.save() if __name__ == '__main__': pdf_file = 'eob.pdf' main(pdf_file)
您會注意到,對於我們第一次嘗試生成(EOB)的過程,我們使用ReportLab的canvas模組。 您也可以從platypus開始,但為簡單起見,我們將從畫布開始,然後在需要時將其更新為使用platypus。 __init__方法是我們建立畫布例項的地方。 我們還建立一些類屬性來定義頁面的寬度和高度。 您還將注意到,我們建立了樣式表,將其用於設定段落的樣式。
我們建立的下一個方法稱為coord。 我們將使用此方法最終幫助我們在頁面上定位元素。
接下來,我們建立三個存根方法:create_header,create_payment_summary和create_claims。 這些方法現在不執行任何操作。 最後一種方法是我們的儲存方法,它僅將PDF儲存到磁碟。
最後,我們有main函式。 在這裡,我們建立EOB例項並告訴它儲存。 這段程式碼會生成一個空的PDF,這並不是很有趣。 因此,讓我們通過更新create_header方法使程式碼做一些有用的事情:
def create_header(self):
''''''
ptext = '<font size=10><b>Statement Date: {}'
'</b></font>'.format('01/01/2017')
p = Paragraph(ptext, self.styles['Normal'])
p.wrapOn(self.canvas, self.width, self.height)
p.drawOn(self.canvas, *self.coord(145, 17, mm))
ptext = '''<font size=10>
<b>Member:</b> {member}<br/>
<b>Member ID:</b> {member_id}<br/>
<b>Group #:</b> {group_num}<br/>
<b>Group name:</b> {group_name}<br/>
</font>
'''.format(member='MIKE D',
member_id='X123456',
group_num=789456-1235,
group_name='PYTHON CORP'
)
p = Paragraph(ptext, self.styles['Normal'])
p.wrapOn(self.canvas, self.width, self.height)
p.drawOn(self.canvas, *self.coord(145, 35, mm))
在這裡,我們建立一些格式化的文字並將其新增到在畫布上固定位置繪製的段落中。 然後,我們建立更多文字,將其新增到第二段中並進行繪製。 不要忘記更新main()方法來呼叫您的create_header方法:
def main(pdf_file):
''''''
eob = EOB(pdf_file)
eob.create_header()
eob.save()
將此程式碼另存為eob2.py,然後執行指令碼。 如果一切正常,您應該得到一個如下所示的PDF: