日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PDF 报告生成器:用 reportlab 和 pdfrw 生成自定义 PDF 报告

發(fā)布時(shí)間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PDF 报告生成器:用 reportlab 和 pdfrw 生成自定义 PDF 报告 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果您的工作涉及生成PDF報(bào)告,發(fā)票等,則您可能已經(jīng)考慮過(guò)使用Python自動(dòng)化。Python有一些很不錯(cuò)的第三方庫(kù)用于處理PDF文件,使您可以從腳本中讀取和寫入PDF。同樣,您也可以將這些庫(kù)作為簡(jiǎn)單GUI工具的基礎(chǔ),從而為您提供一種在桌面上操作自動(dòng)填充或編輯PDF報(bào)告的簡(jiǎn)便方法。

在本教程中,我們將使用兩個(gè)庫(kù)來(lái)創(chuàng)建自定義PDF報(bào)告填充器。數(shù)據(jù)將使用Qt表單收集:只需編輯字段,按“生成”按鈕即可在文件夾中獲取填寫的表單。我們將在這里使用的兩個(gè)庫(kù)是:

  • reportlab,可讓您使用文本和圖片類原件創(chuàng)建PDF

  • pdfrw,一個(gè)用于從現(xiàn)有PDF讀取和提取頁(yè)面的庫(kù)

盡管我們可以使用reportlab來(lái)繪制整個(gè)PDF,但是使用外部工具設(shè)計(jì)模板然后在其上疊加動(dòng)態(tài)內(nèi)容會(huì)更容易。我們可以使用pdfrw來(lái)讀取模板PDF,提取頁(yè)面,然后可以使用reportlab在該頁(yè)面上進(jìn)行繪制。這樣一來(lái),我們就可以將自定義信息(來(lái)自我們的應(yīng)用程序)直接覆蓋到現(xiàn)有的PDF模板上,并以新名稱保存。

在此示例中,我們通過(guò)手動(dòng)輸入字段,但是您可以修改應(yīng)用程序以從外部CSV文件讀取PDF數(shù)據(jù)并從中生成多個(gè)PDF。

PDF 模板

為了進(jìn)行測(cè)試,我使用Google Docs創(chuàng)建了一個(gè)自定義的TPS報(bào)告模板,并將頁(yè)面下載為PDF。該頁(yè)面包含許多要填寫的字段。在本教程中,我們將編寫一個(gè)PyQt表單,用戶可以填寫該表單,然后將數(shù)據(jù)寫到正確位置的PDF上。

模板為A4格式。將其與腳本保存在同一文件夾中。

如果您想使用其他模板,請(qǐng)隨時(shí)使用。只需記住,編寫表單時(shí)需要調(diào)整表單字段的位置。

布置表單視圖

Qt包含一個(gè)QFormLayout布局,該布局簡(jiǎn)化了生成簡(jiǎn)單表單布局的過(guò)程。它的工作方式類似于網(wǎng)格,但是您可以將元素的行添加在一起,并將字符串自動(dòng)轉(zhuǎn)換為QLabel對(duì)象。我們的框架應(yīng)用程序,包括與模板表單匹配的完整布局,如下所示。

from?PyQt5.QtWidgets?import?QPushButton,?QLineEdit,?QApplication,?QFormLayout,?QWidget,?QTextEdit,?QSpinBoxclass?Window(QWidget):def?__init__(self):super().__init__()self.name?=?QLineEdit()self.program_type?=?QLineEdit()self.product_code?=?QLineEdit()self.customer?=?QLineEdit()self.vendor?=?QLineEdit()self.n_errors?=?QSpinBox()self.n_errors.setRange(0,?1000)self.comments?=?QTextEdit()self.generate_btn?=?QPushButton("Generate?PDF")layout?=?QFormLayout()layout.addRow("Name",?self.name)layout.addRow("Program?Type",?self.program_type)layout.addRow("Product?Code",?self.product_code)layout.addRow("Customer",?self.customer)layout.addRow("Vendor",?self.vendor)layout.addRow("No.?of?Errors",?self.n_errors)layout.addRow("Comments",?self.comments)layout.addRow(self.generate_btn)self.setLayout(layout)app?=?QApplication([]) w?=?Window() w.show() app.exec()

在編寫用于替換/自動(dòng)化紙質(zhì)表格的工具時(shí),嘗試模仿紙質(zhì)表格的布局通常是個(gè)好主意,這樣就很熟悉了。

上面的代碼運(yùn)行后在窗口中提供以下布局。您已經(jīng)可以在字段中輸入內(nèi)容,但是按下按鈕尚無(wú)任何作用 —— 我們尚未編寫代碼來(lái)生成PDF或?qū)⑵溥B接到按鈕。

生成 PDF 文本

為了將基本模板生成PDF,我們將結(jié)合reportlab和PdfReader兩個(gè)庫(kù)。流程如下:

  • 使用PdfReader讀入template.pdf文件,并僅提取第一頁(yè)。

  • 創(chuàng)建一個(gè)reportlab 的 Canvas對(duì)象

  • 使用pdfrw.toreportlab.makerl生成畫布對(duì)象,然后使用canvas.doForm()將其添加到Canvas中。

  • 在畫布上繪制自定義位

  • 將PDF保存到文件

代碼如下所示,不需要Qt,您可以保存到文件并按原樣運(yùn)行。運(yùn)行后,生成的PDF將作為result.pdf保存在同一文件夾中。

from?reportlab.pdfgen.canvas?import?Canvas from?pdfrw?import?PdfReader from?pdfrw.buildxobj?import?pagexobj from?pdfrw.toreportlab?import?makerloutfile?=?"result.pdf"template?=?PdfReader("template.pdf",?decompress=False).pages[0] template_obj?=?pagexobj(template)canvas?=?Canvas(outfile)xobj_name?=?makerl(canvas,?template_obj) canvas.doForm(xobj_name)ystart?=?443#?Prepared?by canvas.drawString(170,?ystart,?"My?name?here")canvas.save()

由于生成PDF的過(guò)程正在進(jìn)行IO操作,因此可能會(huì)花費(fèi)一些時(shí)間(例如,如果我們從網(wǎng)絡(luò)驅(qū)動(dòng)器中加載文件)。因此,最好在單獨(dú)的線程中進(jìn)行處理。接下來(lái),我們將定義這個(gè)自定義線程運(yùn)行器。

在單獨(dú)的線程中運(yùn)行生成器

由于每個(gè)生成器都是一個(gè)孤立的工作,因此使用Qt的QRunner框架來(lái)處理該流程是很有意義的,這也使以后為每個(gè)作業(yè)添加可自定義的模板變得很簡(jiǎn)單。我們?cè)谑褂枚嗑€程教程中可以看到相同的方法,在該方法中,我們使用QRunner的子類來(lái)保存我們的自定義運(yùn)行代碼,并在單獨(dú)的QObject子類上實(shí)現(xiàn)特定于運(yùn)行器的信號(hào)。

from?PyQt5.QtWidgets?import?QPushButton,?QLineEdit,?QApplication,?QFormLayout,?QWidget,?QTextEdit,?QMessageBox,?QSpinBox from?PyQt5.QtCore?import?QObject,?QRunnable,?QThreadPool,?pyqtSignal,?pyqtSlotfrom?reportlab.pdfgen.canvas?import?Canvasfrom?pdfrw?import?PdfReader from?pdfrw.buildxobj?import?pagexobj from?pdfrw.toreportlab?import?makerlclass?WorkerSignals(QObject):"""Defines?the?signals?available?from?a?running?worker?thread."""error?=?pyqtSignal(str)file_saved_as?=?pyqtSignal(str)class?Generator(QRunnable):"""Worker?threadInherits?from?QRunnable?to?handle?worker?thread?setup,?signalsand?wrap-up.:param?data:?The?data?to?add?to?the?PDF?for?generating."""def?__init__(self,?data):super().__init__()self.data?=?dataself.signals?=?WorkerSignals()@pyqtSlot()def?run(self):try:outfile?=?"result.pdf"template?=?PdfReader("template.pdf",?decompress=False).pages[0]template_obj?=?pagexobj(template)canvas?=?Canvas(outfile)xobj_name?=?makerl(canvas,?template_obj)canvas.doForm(xobj_name)ystart?=?443#?Prepared?bycanvas.drawString(170,?ystart,?self.data['name'])canvas.save()except?Exception?as?e:self.signals.error.emit(str(e))returnself.signals.file_saved_as.emit(outfile)

我們?cè)谶@里定義了兩個(gè)信號(hào):

  • file_saved_as,它發(fā)出已保存的PDF文件的文件名(成功時(shí))

  • error,它以調(diào)試字符串的形式發(fā)出錯(cuò)誤信號(hào)

我們需要一個(gè)QThreadPool來(lái)添加運(yùn)行我們的自定義運(yùn)行器。我們可以將它添加到__init__塊的MainWindow中。

class?Window(QWidget):def?__init__(self):super().__init__()self.threadpool?=?QThreadPool()

現(xiàn)在我們已經(jīng)定義了生成器QRunner,我們只需要實(shí)現(xiàn)generate方法來(lái)創(chuàng)建運(yùn)行器,將表單字段中的數(shù)據(jù)傳遞給運(yùn)行器,并開(kāi)始運(yùn)行生成器。

def?generate(self):self.generate_btn.setDisabled(True)data?=?{'name':?self.name.text(),'program_type':?self.program_type.text(),'product_code':?self.product_code.text(),'customer':?self.customer.text(),'vendor':?self.vendor.text(),'n_errors':?str(self.n_errors.value()),'comments':?self.comments.toPlainText()}g?=?Generator(data)g.signals.file_saved_as.connect(self.generated)g.signals.error.connect(print)??#?Print?errors?to?console.self.threadpool.start(g)def?generated(self,?outfile):pass28

在此代碼中,我們首先禁用了generate_btn,目的是使用戶在生成過(guò)程中無(wú)法多次按下按鈕。然后,我們從控件中構(gòu)造數(shù)據(jù)字典,使用.text()方法從QLineEdit控件中獲取文本,.value()從QSpinBox中獲取值,以及.toPlainText()獲得QTextEdit的純文本表示。因?yàn)槲覀円胖梦谋靖袷?#xff0c;所以我們將數(shù)值轉(zhuǎn)換為字符串。

為了實(shí)際生成PDF,我們創(chuàng)建了剛剛定義的Generator運(yùn)行器的實(shí)例,并傳入了數(shù)據(jù)字典。我們將file_saved_as信號(hào)連接到生成的方法(在底部定義,但尚未執(zhí)行任何操作),并將錯(cuò)誤信號(hào)連接到標(biāo)準(zhǔn)Python打印功能:這會(huì)自動(dòng)將任何錯(cuò)誤打印到控制臺(tái)。

最后,我們使用Generator實(shí)例,并將其傳遞到線程池的.start()方法以使其排隊(duì)運(yùn)行(它應(yīng)立即啟動(dòng))。然后,我們可以將此方法掛接到主窗口__init__中的按鈕上,例如:

self.generate_btn.pressed.connect(self.generate)

如果立即運(yùn)行該應(yīng)用程序,則按下按鈕將觸發(fā)PDF的生成,并且結(jié)果將作為result.pdf保存在啟動(dòng)該應(yīng)用程序的同一文件夾中。到目前為止,我們只在頁(yè)面上放置了一個(gè)文本塊,因此讓我們完成生成器的工作,以將所有字段寫在正確的位置。

完成生成器

接下來(lái),我們需要完成模板上的文本放置。這里的技巧是弄清模板的每行間距(取決于字體大小等),然后計(jì)算相對(duì)于第一行的位置。y坐標(biāo)增加了頁(yè)面的高度(所以0,0在左下角),因此在之前的代碼中,我們?yōu)轫斝卸xystart,然后為每行減去28。

ystart?=?443#?Prepared?by canvas.drawString(170,?ystart,?self.data['name'])#?Date:?Todays?date today?=?datetime.today() canvas.drawString(410,?ystart,?today.strftime('%F'))#?Device/Program?Type canvas.drawString(230,?ystart-28,?self.data['program_type'])#?Product?code canvas.drawString(175,?ystart-(2*28),?self.data['product_code'])#?Customer canvas.drawString(315,?ystart-(2*28),?self.data['customer'])#?Vendor canvas.drawString(145,?ystart-(3*28),?self.data['vendor'])ystart?=?250#?Program?Language canvas.drawString(210,?ystart,?"Python")canvas.drawString(430,?ystart,?self.data['n_errors'])

包裝

對(duì)于大多數(shù)的表單字段,我們都可以按原樣輸出文本,因?yàn)闆](méi)有換行符。如果輸入的文本太長(zhǎng),則會(huì)溢出 —— 但是如果我們希望可以通過(guò)設(shè)置字符的最大長(zhǎng)度來(lái)限制字段本身,例如

field.setMaxLength(25)

對(duì)于注釋字段,事情有些棘手。該字段可以更長(zhǎng),并且需要將行包裝在模板中的多行上。該字段還接受換行符(通過(guò)按Enter鍵),這些換行符會(huì)在寫入PDF時(shí)出現(xiàn)問(wèn)題。

如您在上面的屏幕截圖中所見(jiàn),換行符在文本中顯示為黑色正方形。好的方面是,僅刪除換行符將使換行更加容易:我們可以將每行換行為指定數(shù)量的字符。

由于字符的寬度是可變的,因此這并不是完美的選擇,但這無(wú)關(guān)緊要。如果我們換行以最寬的字符(W)填充,則任何實(shí)際行都將適合。

Python帶有內(nèi)置的textwrap庫(kù),一旦我們刪除了換行符,我們就可以使用該庫(kù)包裝文本。

import?textwrap comments?=?comments.replace('\n',?'?') lines?=?textwrap.wrap(comments,?width=80)

但是我們需要考慮第一行較短,這可以通過(guò)以下方法實(shí)現(xiàn):首先將其包裝為較短的長(zhǎng)度,重新加入其余部分,然后重新包裝,例如:

import?textwrap comments?=?comments.replace('\n',?'?') lines?=?textwrap.wrap(comments,?width=65)?#?45 first_line?=?lines[0] remainder?=?'?'.join(lines[1:])lines?=?textwrap.wrap(remainder,?75)?#?55 lines?=?lines[:4]??#?max?lines,?not?including?the?first.

換行線(45和55)上的注釋標(biāo)記顯示了將Ws線插入空間所需的換行長(zhǎng)度。這是最短的線,但不現(xiàn)實(shí)。使用的值應(yīng)適用于大多數(shù)普通文本。

為了正確執(zhí)行此操作,我們應(yīng)該計(jì)算文檔字體中每個(gè)文本長(zhǎng)度的實(shí)際大小,并使用該大小告知包裝器。

準(zhǔn)備好行之后,可以遍歷列表并每次減小y位置,將它們打印到 PDF 上。模板文檔中各行之間的間距為28。

comments?=?self.data['comments'].replace('\n',?'?') if?comments:lines?=?textwrap.wrap(comments,?width=65)?#?45first_line?=?lines[0]remainder?=?'?'.join(lines[1:])lines?=?textwrap.wrap(remainder,?75)?#?55lines?=?lines[:4]??#?max?lines,?not?including?the?first.canvas.drawString(155,?223,?first_line)for?n,?l?in?enumerate(lines,?1):canvas.drawString(80,?223?-?(n*28),?l)

這給出了一些帶有亂數(shù)假文文本的結(jié)果。

自動(dòng)顯示結(jié)果

創(chuàng)建文件后,運(yùn)行程序會(huì)在信號(hào)中返回創(chuàng)建文件的文件名(當(dāng)前始終相同)。最好自動(dòng)將生成的PDF呈現(xiàn)給用戶,這樣他們就可以檢查運(yùn)行是否正常。在Windows上,我們可以使用os.startfile以該類型的默認(rèn)啟動(dòng)器打開(kāi)文件 —— 在這種情況下,使用默認(rèn)的PDF查看器打開(kāi)PDF。

由于這在其他平臺(tái)上不可用,因此我們捕獲了錯(cuò)誤,而是顯示了QMessageBox

def?generated(self,?outfile):self.generate_btn.setDisabled(False)try:os.startfile(outfile)except?Exception:#?If?startfile?not?available,?show?dialog.QMessageBox.information(self,?"Finished",?"PDF?has?been?generated")

完整代碼

PyQt5 的完整代碼如下所示。

from?PyQt5.QtWidgets?import?QPushButton,?QLineEdit,?QApplication,?QFormLayout,?QWidget,?QTextEdit,?QMessageBox,?QSpinBox from?PyQt5.QtCore?import?QObject,?QRunnable,?QThreadPool,?pyqtSignal,?pyqtSlotfrom?reportlab.pdfgen.canvas?import?Canvasimport?osimport?textwrap from?datetime?import?datetimefrom?pdfrw?import?PdfReader from?pdfrw.buildxobj?import?pagexobj from?pdfrw.toreportlab?import?makerlclass?WorkerSignals(QObject):"""Defines?the?signals?available?from?a?running?worker?thread."""error?=?pyqtSignal(str)file_saved_as?=?pyqtSignal(str)class?Generator(QRunnable):"""Worker?threadInherits?from?QRunnable?to?handle?worker?thread?setup,?signalsand?wrap-up.:param?data:?The?data?to?add?to?the?PDF?for?generating."""def?__init__(self,?data):super().__init__()self.data?=?dataself.signals?=?WorkerSignals()@pyqtSlot()def?run(self):try:outfile?=?"result.pdf"template?=?PdfReader("template.pdf",?decompress=False).pages[0]template_obj?=?pagexobj(template)canvas?=?Canvas(outfile)xobj_name?=?makerl(canvas,?template_obj)canvas.doForm(xobj_name)ystart?=?443#?Prepared?bycanvas.drawString(170,?ystart,?self.data['name'])#?Date:?Todays?datetoday?=?datetime.today()canvas.drawString(410,?ystart,?today.strftime('%F'))#?Device/Program?Typecanvas.drawString(230,?ystart-28,?self.data['program_type'])#?Product?codecanvas.drawString(175,?ystart-(2*28),?self.data['product_code'])#?Customercanvas.drawString(315,?ystart-(2*28),?self.data['customer'])#?Vendorcanvas.drawString(145,?ystart-(3*28),?self.data['vendor'])ystart?=?250#?Program?Languagecanvas.drawString(210,?ystart,?"Python")canvas.drawString(430,?ystart,?self.data['n_errors'])comments?=?self.data['comments'].replace('\n',?'?')if?comments:lines?=?textwrap.wrap(comments,?width=65)?#?45first_line?=?lines[0]remainder?=?'?'.join(lines[1:])lines?=?textwrap.wrap(remainder,?75)?#?55lines?=?lines[:4]??#?max?lines,?not?including?the?first.canvas.drawString(155,?223,?first_line)for?n,?l?in?enumerate(lines,?1):canvas.drawString(80,?223?-?(n*28),?l)canvas.save()except?Exception?as?e:self.signals.error.emit(str(e))returnself.signals.file_saved_as.emit(outfile)class?Window(QWidget):def?__init__(self):super().__init__()self.threadpool?=?QThreadPool()self.name?=?QLineEdit()self.program_type?=?QLineEdit()self.product_code?=?QLineEdit()self.customer?=?QLineEdit()self.vendor?=?QLineEdit()self.n_errors?=?QSpinBox()self.n_errors.setRange(0,?1000)self.comments?=?QTextEdit()self.generate_btn?=?QPushButton("Generate?PDF")self.generate_btn.pressed.connect(self.generate)layout?=?QFormLayout()layout.addRow("Name",?self.name)layout.addRow("Program?Type",?self.program_type)layout.addRow("Product?Code",?self.product_code)layout.addRow("Customer",?self.customer)layout.addRow("Vendor",?self.vendor)layout.addRow("No.?of?Errors",?self.n_errors)layout.addRow("Comments",?self.comments)layout.addRow(self.generate_btn)self.setLayout(layout)def?generate(self):self.generate_btn.setDisabled(True)data?=?{'name':?self.name.text(),'program_type':?self.program_type.text(),'product_code':?self.product_code.text(),'customer':?self.customer.text(),'vendor':?self.vendor.text(),'n_errors':?str(self.n_errors.value()),'comments':?self.comments.toPlainText()}g?=?Generator(data)g.signals.file_saved_as.connect(self.generated)g.signals.error.connect(print)??#?Print?errors?to?console.self.threadpool.start(g)def?generated(self,?outfile):self.generate_btn.setDisabled(False)try:os.startfile(outfile)except?Exception:#?If?startfile?not?available,?show?dialog.QMessageBox.information(self,?"Finished",?"PDF?has?been?generated")app?=?QApplication([]) w?=?Window() w.show() app.exec_()

從CSV文件生成

在上面的示例中,您需要輸入數(shù)據(jù)以手動(dòng)填寫。如果您沒(méi)有大量的PDF生成,這很好,但是如果您有一個(gè)完整的CSV文件,可以生成報(bào)告的數(shù)據(jù),那么就沒(méi)那么有趣了。在下面的示例中,我們沒(méi)有向用戶顯示表單字段列表,而是要求提供可從中生成PDF的源CSV文件 —— 文件中的每一行都使用文件中的數(shù)據(jù)生成單獨(dú)的PDF文件。

from?PyQt5.QtWidgets?import?QPushButton,?QLineEdit,?QApplication,?QFormLayout,?QWidget,?QTextEdit,?QMessageBox,?QSpinBox,?QFileDialog from?PyQt5.QtCore?import?QObject,?QRunnable,?QThreadPool,?pyqtSignal,?pyqtSlotfrom?reportlab.pdfgen.canvas?import?Canvasimport?os,?csvimport?textwrap from?datetime?import?datetimefrom?pdfrw?import?PdfReader from?pdfrw.buildxobj?import?pagexobj from?pdfrw.toreportlab?import?makerlclass?WorkerSignals(QObject):"""Defines?the?signals?available?from?a?running?worker?thread."""error?=?pyqtSignal(str)finished?=?pyqtSignal()class?Generator(QRunnable):"""Worker?threadInherits?from?QRunnable?to?handle?worker?thread?setup,?signalsand?wrap-up.:param?data:?The?data?to?add?to?the?PDF?for?generating."""def?__init__(self,?data):super().__init__()self.data?=?dataself.signals?=?WorkerSignals()@pyqtSlot()def?run(self):try:filename,?_?=?os.path.splitext(self.data['sourcefile'])folder?=?os.path.dirname(self.data['sourcefile'])template?=?PdfReader("template.pdf",?decompress=False).pages[0]template_obj?=?pagexobj(template)with?open(self.data['sourcefile'],?'r',?newline='')?as?f:reader?=?csv.DictReader(f)for?n,?row?in?enumerate(reader,?1):fn?=?f'{filename}-{n}.pdf'outfile?=?os.path.join(folder,?fn)canvas?=?Canvas(outfile)xobj_name?=?makerl(canvas,?template_obj)canvas.doForm(xobj_name)ystart?=?443#?Prepared?bycanvas.drawString(170,?ystart,?row.get('name',?''))#?Date:?Todays?datetoday?=?datetime.today()canvas.drawString(410,?ystart,?today.strftime('%F'))#?Device/Program?Typecanvas.drawString(230,?ystart-28,?row.get('program_type',?''))#?Product?codecanvas.drawString(175,?ystart-(2*28),?row.get('product_code',?''))#?Customercanvas.drawString(315,?ystart-(2*28),?row.get('customer',?''))#?Vendorcanvas.drawString(145,?ystart-(3*28),?row.get('vendor',?''))ystart?=?250#?Program?Languagecanvas.drawString(210,?ystart,?"Python")canvas.drawString(430,?ystart,?row.get('n_errors',?''))comments?=?row.get('comments',?'').replace('\n',?'?')if?comments:lines?=?textwrap.wrap(comments,?width=65)?#?45first_line?=?lines[0]remainder?=?'?'.join(lines[1:])lines?=?textwrap.wrap(remainder,?75)?#?55lines?=?lines[:4]??#?max?lines,?not?including?the?first.canvas.drawString(155,?223,?first_line)for?n,?l?in?enumerate(lines,?1):canvas.drawString(80,?223?-?(n*28),?l)canvas.save()except?Exception?as?e:self.signals.error.emit(str(e))returnself.signals.finished.emit()class?Window(QWidget):def?__init__(self):super().__init__()self.threadpool?=?QThreadPool()self.sourcefile?=?QLineEdit()self.sourcefile.setDisabled(True)??#?must?use?the?file?finder?to?select?a?valid?file.self.file_select?=?QPushButton("Select?CSV...")self.file_select.pressed.connect(self.choose_csv_file)self.generate_btn?=?QPushButton("Generate?PDF")self.generate_btn.pressed.connect(self.generate)layout?=?QFormLayout()layout.addRow(self.sourcefile,?self.file_select)layout.addRow(self.generate_btn)self.setLayout(layout)def?choose_csv_file(self):filename,?_?=?QFileDialog.getOpenFileName(self,?"Select?a?file",?filter="CSV?files?(*.csv)")if?filename:self.sourcefile.setText(filename)def?generate(self):if?not?self.sourcefile.text():return??#?If?the?field?is?empty,?ignore.self.generate_btn.setDisabled(True)data?=?{'sourcefile':?self.sourcefile.text(),}g?=?Generator(data)g.signals.finished.connect(self.generated)g.signals.error.connect(print)??#?Print?errors?to?console.self.threadpool.start(g)def?generated(self):self.generate_btn.setDisabled(False)QMessageBox.information(self,?"Finished",?"PDFs?have?been?generated")app?=?QApplication([]) w?=?Window() w.show() app.exec()

您可以使用template.pdf和此示例CSV文件運(yùn)行此應(yīng)用,以生成一些TPS報(bào)告。

注意事項(xiàng):

  • 現(xiàn)在我們生成了多個(gè)文件,完成后打開(kāi)它們并沒(méi)有多大意義。取而代之的是,我們始終只顯示一次“完成”消息。信號(hào)file_saved_as已重命名為finished,并且由于不再使用文件名str,我們將其刪除。

  • 用于獲取文件名的QLineEdit已禁用,因此無(wú)法直接進(jìn)行編輯:設(shè)置源CSV文件的唯一方法是直接選擇文件,確保已在其中。

  • 我們基于導(dǎo)入文件名和當(dāng)前行號(hào)自動(dòng)生成輸出文件名。文件名取自輸入CSV:CSV文件名為tps.csv,文件名為tps-1.pdf,tps-2.pdf等。文件被寫到源CSV所在的文件夾中。

  • 由于某些行/文件可能會(huì)漏掉必填字段,因此我們?cè)谛凶值渖鲜褂?get()并使用默認(rèn)的空字符串。

可能的改進(jìn)

如果您想改進(jìn)此代碼,可以嘗試以下方法

  • 使模板和輸出文件位置可配置 —— 使用Qt文件對(duì)話框

  • 從文件和模板(JSON)一起加載字段位置,因此您可以將同一表單用于多個(gè)模板

  • 使字段可配置-這非常棘手,但是您可以為特定類型(str,datetime,int等)分配特定的小部件

更多閱讀

5 分鐘快速上手 pytest 測(cè)試框架

5分鐘掌握 Python 隨機(jī)爬山算法

5分鐘快速掌握 Adam 優(yōu)化算法

特別推薦


點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

總結(jié)

以上是生活随笔為你收集整理的PDF 报告生成器:用 reportlab 和 pdfrw 生成自定义 PDF 报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

精品国产免费人成在线观看 | 444av| 黄色av一级片 | 国际精品久久久 | 国产亚洲视频在线观看 | 国产精品久久久电影 | 国产黄av| 中文字幕一区二区三区乱码不卡 | japanesefreesexvideo高潮| 日本久热 | 国产成人在线综合 | 亚洲欧美日韩国产 | 久久影视一区二区 | 黄色精品一区二区 | 欧美资源在线观看 | 国产精品人人做人人爽人人添 | 久久视频 | 国产精品一区二区三区免费看 | 国产视频久久久久 | 久草色在线观看 | 日韩中文字幕免费 | 精品久久久久久久久久久久 | 性日韩欧美在线视频 | 久久久精品国产免费观看同学 | 久久久精品欧美一区二区免费 | 久久国产片 | www天天干 | 97精品国产aⅴ | 日韩二区三区在线 | 日韩欧美99| www黄色av| 中文字幕人成人 | 超碰在线91 | 久久久国内精品 | 亚洲精品美女在线观看播放 | 免费看国产一级片 | 最新免费av在线 | 国产精品九九视频 | 亚洲综合丁香 | 免费视频一二三区 | 免费网站看av片 | 黄a在线| 99欧美视频 | 久久精国产 | 丁香激情综合国产 | 国内久久久久 | 日韩一区二区免费视频 | 五月综合激情婷婷 | av免费网站在线观看 | 日韩视频免费看 | 日韩免费在线观看网站 | 日韩视频中文字幕在线观看 | 99精品视频精品精品视频 | 欧美一级专区免费大片 | 91av视频在线免费观看 | av片中文字幕 | 在线观看a视频 | 久草av在线播放 | 成人一区在线观看 | 国产又粗又长又硬免费视频 | 婷婷国产一区二区三区 | 久草在在线视频 | 在线播放91 | 欧美aaa一级 | av中文天堂 | 嫩嫩影院理论片 | 最近中文字幕高清字幕免费mv | 麻豆超碰 | 天天干天天操天天干 | 91麻豆产精品久久久久久 | 久草视频看看 | 国产一级视频在线观看 | av综合av| 成人免费毛片aaaaaa片 | 天堂av在线网站 | 精品久久久久久亚洲综合网站 | 成人毛片a | 欧美成人一二区 | 久久精品视频日本 | 国产91国语对白在线 | 欧美精品亚州精品 | 日韩女同av | 黄色免费看片网站 | 最新国产精品久久精品 | 亚洲天堂精品 | 久久国产精品一二三区 | 五月婷香蕉久色在线看 | 丁香激情视频 | 99在线观看免费视频精品观看 | av三级av| 午夜免费久久看 | 久久精品国产亚洲a | 国产一区二区三区视频在线 | 国产精品一区二区三区在线看 | www.成人久久 | 在线播放你懂 | 亚洲精品黄色在线观看 | 国色天香第二季 | www.com黄色 | av国产网站| 精品久久久免费视频 | 成人蜜桃网 | 亚洲五月综合 | 最新av免费在线观看 | 午夜精品视频一区 | 亚洲精品一区二区网址 | 精品国产一区在线观看 | 国产日韩中文字幕 | www.av中文字幕.com | 青草视频在线 | 九九热久久免费视频 | 久久免费视频99 | 伊人电影天堂 | 伊人电影在线观看 | 香蕉手机在线 | 精品二区视频 | 欧美日韩午夜爽爽 | 999电影免费在线观看2020 | 超碰97成人 | 国产在线观看午夜 | 97天天干 | 午夜国产一区二区三区四区 | 日韩欧美一区二区在线 | 欧美色伊人 | 在线亚洲成人 | 丁香五月亚洲综合在线 | 日韩欧美xxxx | 亚洲伦理电影在线 | 在线草| 欧美国产91 | 国产天天爽 | 91资源在线| 成人黄色片免费看 | 久久综合色一综合色88 | 在线观看免费观看在线91 | 亚洲综合在线发布 | 激情五月亚洲 | 国产成人精品综合久久久 | 中文字幕网站 | 天天干,天天射,天天操,天天摸 | 精品你懂的| 久久精品视频中文字幕 | 国产手机视频在线播放 | 欧美91视频 | 色九色| 免费在线观看亚洲视频 | 欧美精品在线观看免费 | 亚洲视频网站在线观看 | 国产破处在线视频 | 欧美成人91 | 天天综合网 天天综合色 | 国产免费黄视频在线观看 | 视频一区视频二区在线观看 | 久久好看 | 精品亚洲免费 | 热99在线视频 | 丁香婷婷色综合亚洲电影 | 国产精品久久久久久久久久久久 | 色999五月色 | 久久精品xxx| 一二三区av | 黄色综合 | 国产69精品久久久久99尤 | 久草 | 射射色 | 丁香五婷 | 免费男女羞羞的视频网站中文字幕 | 在线观看 国产 | 久久伊人爱 | 欧美久草在线 | 天天视频色版 | 亚洲欧洲av | 中文字幕在线看片 | 欧美成人视 | 久久草在线精品 | 欧美大码xxxx | 欧美天堂影院 | 美女视频网 | 在线观看av大片 | 欧美另类高清 videos | 亚洲日韩欧美一区二区在线 | 五月天激情婷婷 | 日韩中文字 | 中文字幕婷婷 | 深爱综合网 | 欧美日韩高清一区二区 国产亚洲免费看 | 日韩一区正在播放 | 中文字幕欧美激情 | 国产一级精品绿帽视频 | 国产精品青青 | 亚洲国产中文字幕在线观看 | 伊人在线视频 | 中文字幕 国产精品 | 久草精品视频在线观看 | 日韩精品三区四区 | 成人免费色 | 日韩欧美精品在线视频 | 色资源在线观看 | 天天射天天射 | 久久久久久久久久久免费 | 亚洲激情六月 | 日韩免费一二三区 | 天天综合成人网 | 91精品国产乱码 | 日韩色一区二区三区 | 蜜桃av久久久亚洲精品 | 人人狠狠综合久久亚洲婷 | 手机在线免费av | 在线一二区| 日韩电影在线观看一区 | 丁香色婷 | 亚洲永久av | av中文字幕在线观看网站 | 六月丁香在线观看 | 最近中文字幕国语免费高清6 | 亚洲精品字幕在线 | 狠狠狠干 | 国产精品日韩高清 | 91大神在线看 | 91精品国产一区二区三区 | 97超碰人人澡人人爱 | 日韩字幕 | 久久免费视频一区 | 西西444www大胆无视频 | 久久亚洲美女 | 蜜桃视频日本 | 久久国产精品久久国产精品 | 日韩v欧美v日本v亚洲v国产v | 五月婷婷综合激情网 | 日韩欧美在线不卡 | 日韩av成人免费看 | 97超碰超碰 | 网站在线观看你们懂的 | 51久久夜色精品国产麻豆 | 九九交易行官网 | 日韩免费视频播放 | 69欧美视频 | 99在线高清视频在线播放 | 国产成人一区在线 | 久久手机精品视频 | 亚洲视频精品 | 一区二区三区福利 | 亚洲精品在线免费看 | 91麻豆精品国产91久久久久久久久 | 国产亚洲免费的视频看 | 久久久久97国产 | 久久精品首页 | 日韩av在线免费播放 | 亚洲精品久 | 操久久网| 午夜国产一区二区 | 国产亚洲亚洲 | 久久精品国产亚洲精品 | 亚洲成人精品在线观看 | 97精品超碰一区二区三区 | 中文字幕色在线 | 国产精品成人久久久 | 日本精品久久久久影院 | 99久久精品无码一区二区毛片 | 国产精品永久久久久久久www | 天天操天天吃 | 九九视频免费观看视频精品 | 天天天天色射综合 | 国产日韩精品一区二区在线观看播放 | 久久黄色影视 | 日韩在线精品一区 | 国产精品毛片一区二区 | 亚洲高清视频在线观看免费 | 337p日本大胆噜噜噜噜 | 夜夜躁日日躁狠狠躁 | 天天爱天天插 | av.com在线| 一区二区三区中文字幕在线观看 | 成人免费xyz网站 | 国产九色在线播放九色 | 91毛片视频 | 成人福利在线 | 五月在线视频 | 麻豆视频在线 | 中文字幕黄色 | 人人爽人人搞 | 国产精品一区二区三区久久 | 欧美精品在线观看 | 成人视屏免费看 | 伊人久久一区 | 国产69精品久久久久久久久久 | 成人av电影网址 | 国产精品成人一区二区三区吃奶 | av看片网| 91视频 - 88av| 91精彩视频在线观看 | 久久久久久久电影 | 婷婷免费视频 | 久久久久久久久久久福利 | 麻豆视频观看 | 国产日韩精品一区二区在线观看播放 | 99久久er热在这里只有精品15 | 国产精品视频99 | 狠狠躁日日躁狂躁夜夜躁av | 天天干天天做天天操 | 国产精品欧美日韩在线观看 | 天天操天天干天天操天天干 | 中文字幕在线观看视频一区 | 欧美综合干 | 亚洲第一成网站 | www.亚洲视频.com | 亚洲精品www久久久久久 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久草在线视频网 | 一级性视频 | 久久久久久久久久福利 | 欧美一区二区三区不卡 | 国产亚洲精品中文字幕 | 日韩欧美在线国产 | 久久99精品久久久久久 | 色综合久久综合网 | 天天综合区 | 91麻豆精品国产91久久久久久久久 | 天天碰天天操 | 亚洲国产wwwccc36天堂 | 一本一道久久a久久综合蜜桃 | 97香蕉视频 | 精品视频不卡 | 日本99久久 | 久久爱资源网 | 8x8x在线观看视频 | 精品国产色 | 探花视频免费在线观看 | 日韩久久视频 | 在线看岛国av | 久久久国产精品麻豆 | 香蕉在线视频播放网站 | 欧美婷婷色| 91成人在线网站 | 黄色亚洲免费 | 亚洲精品乱码久久久久v最新版 | 一区在线观看 | 婷婷色站 | 综合久久久 | 成人久久毛片 | 一区二区三区观看 | 中文字幕精品www乱入免费视频 | 综合网中文字幕 | 中文字幕国产精品一区二区 | 久久免费毛片视频 | 久久国产成人午夜av影院宅 | 91精品国产电影 | 欧美福利精品 | 91av国产视频| www激情com | 天天操天天爽天天干 | 91亚洲欧美激情 | 久久伦理电影网 | 国产精品视频app | 91视频麻豆视频 | 亚洲精品久久激情国产片 | 中文字幕在线观看完整版 | 日日日日干 | 黄av在线 | 久久久久欠精品国产毛片国产毛生 | 超碰97免费在线 | 91香蕉视频色版 | 色天天久久 | 亚洲视频电影在线 | 丝袜美腿在线播放 | 97香蕉久久超级碰碰高清版 | 国产黄色精品在线 | 在线中文字幕av观看 | www日韩在线观看 | 久草在线视频看看 | 国产一区二三区好的 | 91成人短视频在线观看 | 国产一级性生活视频 | 91精品久久久久久 | 一级黄视频 | 深爱五月激情网 | 久久国产网| 黄色精品免费 | 亚洲性xxxx| 婷婷六月综合亚洲 | 久久久久成人精品免费播放动漫 | 国产一区在线看 | 久久久久亚洲精品国产 | 精品一二三区 | 日韩免费在线观看 | 国产精品女人久久久 | 国产亚洲成av片在线观看 | 国产高清不卡 | wwxxx日本| 欧美一级在线观看视频 | 国产一区二区电影在线观看 | 三级av网| 免费看av片网站 | 日韩午夜在线播放 | 99视频精品全部免费 在线 | www.五月天激情 | 亚洲国产精品成人精品 | 亚洲成a人片在线观看网站口工 | 日韩一级片大全 | av成人免费在线 | 伊人春色电影网 | 国产v视频 | 91禁在线观看| 国产精品99久久久久久宅男 | 91私密视频 | 婷色在线 | 久草在线国产 | 狠狠狠色丁香综合久久天下网 | 超碰97人人射妻 | 最近中文字幕高清字幕在线视频 | av在线免费观看黄 | 又色又爽又黄 | 91在线看网站 | 日产中文字幕 | 麻豆激情电影 | 98超碰在线 | 香蕉在线影院 | 国产精品久久久久久久久久直播 | 99热 精品在线 | 成人免费观看视频网站 | www.亚洲| 国产精品久久久久永久免费 | 日韩中文幕 | 天天天干天天射天天天操 | 在线观看岛国 | 日韩精品2区 | 中文字幕国产一区 | 久久久亚洲国产精品麻豆综合天堂 | 婷婷综合五月天 | 国产精品久久一卡二卡 | 亚洲国产三级在线观看 | 在线视频精品播放 | 精品人人人人 | av免费看电影 | 人人藻人人澡人人爽 | 成人在线视频一区 | 狠狠操狠狠干天天操 | 精品免费 | 色综合久久久久综合体桃花网 | 国产精品亚州 | 国产精品视频资源 | 久久综合毛片 | www.色午夜,com | 免费在线观看视频一区 | 狠狠gao| 综合色播| 免费高清在线视频一区· | 免费国产黄线在线观看视频 | 亚洲japanese制服美女 | 91中文字幕一区 | 最新国产在线 | 亚洲综合在线播放 | 五月开心婷婷 | 五月婷婷在线视频观看 | 在线观看免费高清视频大全追剧 | 日韩av播放在线 | 成年人在线观看视频免费 | 欧美亚洲国产日韩 | 五月婷婷开心中文字幕 | 亚洲精品永久免费视频 | 国产一区二区视频在线播放 | 精品国产伦一区二区三区观看说明 | 国产91全国探花系列在线播放 | 亚洲欧美视频在线观看 | 最近最新mv字幕免费观看 | 久久久久美女 | 久久国产一区二区 | 九九九热精品 | 亚洲三级精品 | 婷婷综合 | 婷婷综合久久 | 日韩在线播放视频 | 人人射人人射 | 欧美精品久久久久久久久久久 | 天天爽夜夜爽精品视频婷婷 | 国产欧美日韩视频 | 99精品国产兔费观看久久99 | av电影在线免费 | 欧美一级艳片视频免费观看 | 91亚洲综合 | 亚洲乱码中文字幕综合 | 丁香电影小说免费视频观看 | 国产精品美女久久久久久久网站 | 国产五月色婷婷六月丁香视频 | 婷婷丁香五 | 99精品视频在线观看免费 | 亚洲干视频在线观看 | 国产美女视频免费 | 久久亚洲精品国产亚洲老地址 | 免费在线观看一级片 | 夜色成人av | 高清av网站 | 一区二区精品视频 | 国产精品女同一区二区三区久久夜 | 日韩大片免费在线观看 | 日韩一二三区不卡 | 国产精品一区在线观看你懂的 | 久久精品视频4 | 久久99国产综合精品免费 | 成年人视频在线观看免费 | 国产精品九色 | 日韩精选在线观看 | 成人网大片 | 天堂在线一区二区三区 | 一区二区三区在线观看免费视频 | 丁香5月婷婷久久 | 亚洲黄色片在线 | 久久综合之合合综合久久 | 偷拍久久久 | 日韩网站中文字幕 | 天天操天天是 | 午夜色影院 | 中文av在线播放 | 91亚洲精品国偷拍自产在线观看 | 国产精品免费大片视频 | 成人免费色 | 国产精品一区二区av日韩在线 | 91亚瑟视频 | 久久国产福利 | 国产精品激情在线观看 | 久艹视频在线观看 | 亚洲精品国产精品国自产观看浪潮 | 又色又爽又黄高潮的免费视频 | 国产精品久久久久久一区二区 | 婷婷五情天综123 | 午夜精品久久久久久久久久久久久久 | 国产精品一区二区在线观看免费 | 日韩精品最新在线观看 | 国产老太婆免费交性大片 | 在线天堂亚洲 | 国产美女主播精品一区二区三区 | 免费av的网站 | 国产精品美女久久久久久免费 | 91福利视频一区 | 日韩区欧美久久久无人区 | 九九在线视频 | 久久视讯 | 欧美黄色软件 | 亚洲aⅴ久久精品 | 夜夜嗨av色一区二区不卡 | 超碰在线最新地址 | 久草在线视频精品 | 国产一级二级在线播放 | 天天干一干 | 欧美在线视频日韩 | 精品一区二区影视 | 天天干视频在线 | 91av成人 | 在线视频app | 久草热视频 | 97人人模人人爽人人少妇 | 亚洲欧美日韩在线一区二区 | 成人性生爱a∨ | 天天插综合 | 一区二区久久 | 日韩av女优视频 | 日韩激情片在线观看 | 久久精品久久精品 | 在线观看中文字幕2021 | 国产精品久久久久久久久久久久 | 国产精品久久久久久电影 | 国产护士hd高朝护士1 | 亚洲经典中文字幕 | 精品在线观看一区二区三区 | 久久免费观看少妇a级毛片 久久久久成人免费 | 99爱视频在线观看 | 天天干天天操天天做 | 四虎在线免费观看 | 在线视频国产区 | 久草在线免费资源站 | 日操干 | 日日躁夜夜躁aaaaxxxx | 精品综合久久 | 久久久久久久久久久高潮一区二区 | 亚洲国产中文字幕在线观看 | 久久午夜羞羞影院 | 2019中文字幕第一页 | 国产精品69av | 久久精品视频在线看 | 成人黄色大片在线观看 | av福利在线| 亚洲精品免费在线观看视频 | 免费a v网站| 人人澡超碰碰97碰碰碰软件 | 久9在线| 欧美成人手机版 | 99免费在线视频 | 婷婷激情久久 | 在线免费观看视频你懂的 | 在线视频精品 | 午夜av电影院 | 天天操操操操操 | 欧美一级特黄高清视频 | 日日摸日日添日日躁av | 中文字幕综合在线 | 亚洲精品网页 | 国产精品国产三级国产不产一地 | 欧美日韩国产一区二区三区在线观看 | 国产一级黄色av | 手机av电影在线观看 | 久久人人干| 天天操夜夜叫 | 天天操操操操操操 | 亚洲国产大片 | 亚洲精品777 | 国产日韩中文字幕在线 | 999色视频| 亚洲另类xxxx | 欧美色图另类 | 国产亚洲婷婷免费 | 天天人人 | 婷婷丁香久久五月婷婷 | 欧美色婷| 在线视频观看你懂的 | 国产精品va在线观看入 | 欧美一级片免费播放 | 在线免费中文字幕 | 五月色综合 | 久久国产片 | 国产精品99爱 | 日韩午夜高清 | 精品一区二区在线免费观看 | 一级欧美黄 | 在线观看亚洲 | 国产99久久久精品 | 十八岁免进欧美 | 欧日韩在线视频 | 国产精品99久久久久久久久久久久 | 激情久久久久久久久久久久久久久久 | 偷拍精品一区二区三区 | 日韩在线资源 | 欧美一级电影在线观看 | 色综合天天综合 | 婷婷在线观看视频 | 亚洲精品视频在 | 国产一区二区在线播放视频 | 韩国av免费观看 | 国产精品涩涩屋www在线观看 | 久久一二三四 | 婷婷网五月天 | 成人黄色影片在线 | 九九视频精品在线 | 精品一区av | 天天操天天摸天天干 | avwww在线观看 | 午夜久操 | 91精品国产一区二区三区 | 国产成人在线一区 | 久久婷婷一区二区三区 | 国产精品色视频 | 中文字幕在线免费观看 | 黄色的片子 | 成人天堂网 | 色偷偷97 | 国产精品1区2区在线观看 | 黄污网站在线观看 | 成片免费观看视频大全 | 夜夜躁狠狠躁日日躁 | 免费看成人av | 国产亚洲精品久久19p | 在线看一级片 | 99视频+国产日韩欧美 | 一级久久久 | 91亚洲永久精品 | 日韩网站免费观看 | 99久久精品久久久久久动态片 | av一级片在线观看 | 香蕉久草在线 | 97超碰人人干 | 久久精品视频在线免费观看 | 欧美极品裸体 | 天天艹天天爽 | 欧美少妇的秘密 | 婷婷精品在线视频 | 国产美女精品视频 | 日韩精品中文字幕有码 | 五月婷婷在线综合 | 国产成人在线综合 | 黄色在线免费观看网站 | 在线免费观看成人 | 免费在线视频一区二区 | 亚洲精品玖玖玖av在线看 | 91精品麻豆 | 伊人久久精品久久亚洲一区 | 在线看v片成人 | 久久a国产 | 黄色三级视频片 | 欧美一级黄色片 | 久久天天操 | av网站播放 | 天堂在线一区二区 | 在线激情av电影 | 久草精品视频在线播放 | 麻豆视频国产精品 | www.久久色.com | 中文字幕一区在线观看视频 | 亚洲激情校园春色 | 综合亚洲视频 | 片网站 | 99c视频在线 | 揉bbb玩bbb少妇bbb | 日韩av一区二区三区四区 | 91精品国产高清自在线观看 | 日韩com| 午夜在线免费观看视频 | 日韩av午夜 | 亚洲永久字幕 | 综合婷婷丁香 | 国产91全国探花系列在线播放 | 亚洲人成免费网站 | 六月丁香激情综合 | 久久撸在线视频 | 成人性生爱a∨ | 精品黄色片 | 国产黄免费看 | 日韩免费一区 | 国产免费中文字幕 | 91视频91自拍 | 一级片免费在线 | www狠狠 | 午夜丰满寂寞少妇精品 | 中文字幕欧美日韩va免费视频 | 中文字幕在线观看国产 | 欧美激情一区不卡 | 成人免费网站在线观看 | 日韩在线网址 | 97超碰.com| 色播五月激情综合网 | 国产999久久久 | av888.com| 欧美精品少妇xxxxx喷水 | 欧美精品在线一区二区 | 中文字幕在线观看完整版 | 中文字幕免费高清av | 超碰在线中文字幕 | av不卡免费在线观看 | 久久久久久草 | 久久婷婷国产色一区二区三区 | 欧美激情在线看 | 日韩av片免费在线观看 | 日韩a免费 | 久久精品二区 | 999久久久久久久久久久 | 国产美女被啪进深处喷白浆视频 | 色婷婷99 | 成人影片在线免费观看 | 国产精品久久久久国产精品日日 | 国产中出在线观看 | 日韩精品在线免费播放 | 日韩欧美xx | 精品久久精品 | 最近中文字幕高清字幕在线视频 | 亚洲激情视频 | 草在线 | 久久久精品高清 | 狠狠干.com | 色婷婷www| 在线观看91视频 | 狠狠做深爱婷婷综合一区 | 天堂va在线高清一区 | 韩国精品视频在线观看 | 超碰在线免费福利 | 色橹橹欧美在线观看视频高清 | 久久国产精品一区二区三区 | 悠悠av资源片 | 天天色天天射天天干 | 亚洲永久精品一区 | 免费黄a大片 | 国产在线91在线电影 | 精品国产伦一区二区三区观看方式 | 正在播放国产一区 | 久99久在线视频 | 狠狠躁夜夜a产精品视频 | 一区二区男女 | 欧美日韩观看 | 五月激情久久 | 成年人免费看片网站 | 久久久婷 | 亚洲一区免费在线 | 亚洲午夜精 | 国产精品久久久久久久午夜片 | 色婷婷九月 | 免费观看一区二区三区视频 | 免费观看高清 | 91在线免费观看国产 | 亚洲激情在线播放 | 亚洲欧洲精品一区 | 欧美精品天堂 | 成人免费在线视频观看 | av电影在线不卡 | 九九免费精品视频 | 天天爱天天射 | 亚洲国产欧美在线看片xxoo | 一本一本久久a久久精品牛牛影视 | 亚洲影视资源 | 黄色一级免费电影 | 国产99精品在线观看 | 久久久久久久看片 | 特黄色大片 | 婷婷激情五月综合 | 中文字幕在线观看免费观看 | 午夜精品久久久久久久99 | 亚洲综合丁香 | 亚洲国产精品久久久久久 | 一个色综合网站 | 欧美精品久久久久性色 | 日韩av在线一区二区 | 日本韩国在线不卡 | 欧美电影在线观看 | 欧美色黄 | www欧美xxxx| 成人免费观看视频大全 | 欧美日韩在线视频一区二区 | 特级毛片在线观看 | 911精品视频 | 福利视频网站 | 91精品啪在线观看国产81旧版 | 色资源在线观看 | 97在线超碰 | 97在线超碰 | 麻豆影视网 | 24小时日本在线www免费的 | 国产视频午夜 | 日日夜夜天天干 | 天天插日日插 | 九九九热精品免费视频观看 | 婷婷精品国产一区二区三区日韩 | 在线 影视 一区 | www.神马久久| 欧美日韩综合在线 | 国产午夜小视频 | 国精产品满18岁在线 | 欧美极品裸体 | 91精品国产福利 | 成人app在线免费观看 | 片黄色毛片黄色毛片 | 日韩精品视频在线观看免费 | 久久国产女人 | 国产手机在线观看 | 深爱五月激情网 | 午夜在线看片 | 日日夜夜综合网 | 国产精品高清一区二区三区 | 九九热视频在线免费观看 | 波多野结衣在线中文字幕 | 欧美精选一区二区三区 | 久久超碰网 | 天天爽天天做 | 天天草天天干天天 | 天天干 天天摸 天天操 | 91麻豆产精品久久久久久 | 中文国产字幕在线观看 | 日韩久久久久久久久久 | 亚洲乱亚洲乱亚洲 | 人人搞人人干 | 成人一级黄色片 | 日韩三级在线观看 | 亚洲 欧美 另类人妖 | 人人躁| 国产成人在线免费观看 | 在线av资源 | 久久伦理 | 国产精品va在线观看入 | 国产精品影音先锋 | 日日夜夜操操操操 | 日韩一区二区三区在线看 | av在线一| 日本最新一区二区三区 | 日韩二区在线播放 | 五月天久久久 | 天天操网址 | 在线观看黄网站 | 人人澡av | 久久久久久久亚洲精品 | 日本三级大片 | 亚洲国产日韩欧美 | 999视频在线播放 | 黄色大片日本免费大片 | 亚洲日本va在线观看 | 日本爱爱免费 | 成人91视频 | 成人在线播放免费观看 | 五月天婷婷在线观看视频 | 中文字幕在线精品 | 亚洲男人天堂a | 福利一区二区 | ww亚洲ww亚在线观看 | 亚洲精品在线观看中文字幕 | 97视频在线看| 国产成人精品免高潮在线观看 | 最近中文字幕免费av | 丁香花在线视频观看免费 | 亚洲电影一级黄 | 色综合人人 | 精品日韩在线一区 | 日本精品在线 | 国产免费久久av | 爱情影院aqdy鲁丝片二区 | 欧美日韩免费在线观看视频 | 麻豆一级视频 | 激情视频在线观看网址 | 久久久久久网站 | 欧美 高跟鞋交 xxxxhd | 久久综合射 | 久草综合在线观看 | 日韩精品你懂的 | 精品中文字幕视频 | 日韩久久激情 | 欧美一级电影免费观看 | 中文字幕一区二区三区久久 | 天天干天天干 | 91麻豆精品国产91久久久无限制版 | 亚洲精品视频www | 久久久精品久久 | 日韩欧美专区 | 日韩av片无码一区二区不卡电影 | 久久综合中文字幕 | 深爱激情综合网 | 久久精品免费播放 | 欧美综合久久久 | 天天天插 | 久久99操| 91精品国产成人 | 国产免费亚洲高清 | 五月婷婷在线综合 | 亚洲国内精品在线 | 狠狠狠操| 在线视频一区二区 | 久久精品视频99 | 国产精品久久二区 | 国产一区二区日本 | 中文字幕在线观看免费高清电影 | 精品视频在线看 | 日日干夜夜爱 | 国产天天爽 | 亚洲爽爽网 | 激情丁香久久 | 国产高清视频在线免费观看 | 99亚洲精品在线 | 视频在线观看入口黄最新永久免费国产 | 伊人影院99 | 亚洲高清视频一区二区三区 | av片子在线观看 | 免费亚洲片 | 久久理论电影 | 国产日韩欧美网站 | 国产精品九九九九九九 | 免费视频 你懂的 | 国产精品四虎 | 日韩欧美视频在线观看免费 | 在线有码中文字幕 | 一区二区三区观看 | 国产精品黄网站在线观看 | 丝袜一区在线 | 国产在线观看免费 | 中国一级片视频 | 国产一级免费视频 | 国产美女免费 | 欧美va日韩va | 99精品99| 国产精品免费久久久久影院仙踪林 | 久久手机视频 | 久久99国产精品自在自在app | 操久在线 | 免费高清男女打扑克视频 | 色婷婷精品大在线视频 | 国产亚洲综合性久久久影院 | 免费黄色一区 | 日本中文字幕在线视频 | 久久电影网站中文字幕 | 日韩在线观看视频中文字幕 | 欧亚久久 | 婷婷网五月天 | 欧美日韩网站 | 国产麻豆视频 | 国产精品永久免费 | 91色亚洲| 91精品国产欧美一区二区成人 | 精品麻豆入口免费 | 人人精品 | 新版资源中文在线观看 | 深爱激情亚洲 | 免费精品在线 | 国产二区免费视频 | aa一级片 | 国产免费久久av | 一级黄色视屏 | a级国产乱理论片在线观看 伊人宗合网 | 人人爱在线视频 | 久久免费的视频 | 国产日韩精品一区二区 | 亚洲精品乱码久久久一二三 | 国色天香在线 | 日韩专区在线观看 | 不卡电影一区二区三区 | 国产 日韩 中文字幕 | 香蕉久草在线 | 99视频在线免费播放 |