python - 为 QPrintWidget、QPrintPrevwiwWidget 添加页脚
问题描述
我的发票
我在 Python 中有一个几乎完成的项目,它使用 QPrintPreviwDialog 根据上图显示和打印数据。我使用 QTextDocumento 来处理 HTML。
有没有办法在页码空间中写一些东西。我想将黄色信息写入页码空间作为页脚。或者是否有其他解决方案来显示页脚而不是使用不属于 python 的 pyjasper?
解决方案
将我之前的答案从 C++转换为 python 并修改文本的位置,我将展示如何添加页脚。
from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport
textMargins = 12
borderMargins = 10
def mmToPixels(printer, mm):
return mm * 0.039370147 * printer.resolution()
def paintPage(pageNumber, pageCount, painter, doc, textRect, footerHeight):
painter.save()
textPageRect = QtCore.QRectF(QtCore.QPointF(0, pageNumber*doc.pageSize().height()), doc.pageSize())
painter.setClipRect(textRect)
painter.translate(0, -textPageRect.top())
painter.translate(textRect.left(), textRect.top())
doc.drawContents(painter)
painter.restore()
footerRect = QtCore.QRectF(textRect)
footerRect.setTop(textRect.bottom())
footerRect.setHeight(footerHeight)
# draw footer
painter.save()
pen = painter.pen()
pen.setColor(QtCore.Qt.blue)
painter.setPen(pen)
painter.drawText(footerRect, QtCore.Qt.AlignCenter, "Page {} of {}".format(pageNumber+1, pageCount))
painter.restore()
def printDocument(printer, doc):
painter = QtGui.QPainter(printer)
doc.documentLayout().setPaintDevice(printer)
doc.setPageSize(QtCore.QSizeF(printer.pageRect().size()))
pageSize = printer.pageRect().size()
tm = mmToPixels(printer, textMargins)
footerHeight = painter.fontMetrics().height()
textRect = QtCore.QRectF(tm, tm, pageSize.width() - 2 * tm, pageSize.height() - 2 * tm - footerHeight)
doc.setPageSize(textRect.size())
pageCount = doc.pageCount()
for pageIndex in range(pageCount):
if pageIndex != 0:
printer.newPage()
paintPage(pageIndex, pageCount, painter, doc, textRect, footerHeight)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
document = QtGui.QTextDocument()
cursor = QtGui.QTextCursor(document)
blockFormat = QtGui.QTextBlockFormat()
for i in range(10):
cursor.insertBlock(blockFormat)
cursor.insertHtml("<h1>This is the {} page</h1>".format(i+1))
blockFormat.setPageBreakPolicy(QtGui.QTextFormat.PageBreak_AlwaysBefore)
printer = QtPrintSupport.QPrinter(QtPrintSupport.QPrinter.HighResolution)
printer.setPageSize(QtPrintSupport.QPrinter.A4)
printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat)
dialog = QtPrintSupport.QPrintPreviewDialog(printer)
dialog.paintRequested.connect(lambda print, doc=document: printDocument(printer, doc))
dialog.exec_()
推荐阅读
- c# - 在c#中将可空字符串转换为可空int
- javascript - 未捕获的类型错误:无法读取 null 的属性“样式”。在同一页面中使用两个 Javascript 函数
- c++ - 算术计算异常
- python - 在给定时间释放 Django 视图
- django - 使用 IIS 部署时缺少 Django CSS 文件
- java - 如何在android中使用api将多个选中的复选框值传递给服务器?
- c# - 如何在c#中获取有ajax调用的网站的动态数据
- python - 如何使用 pandas 在一个命令行中连续写入多个值
- c++ - 当我从文本文件中读取时如何获取 char[] 的大小
- flutter - 无法在 FormBuilder 中的运行时按下按钮构建新的小部件