You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyQt5打印文本文档时添加页码等额外元素?

问题解决与代码修正

原代码核心问题

  • 错误将QTextEdit当作绘图工具,未使用PyQt打印标准的QPainter
  • 打印逻辑混乱,错误传递参数给print_方法,导致空白页
  • 无页码定位与多页处理逻辑,无法实现右上角页码需求

修正后的完整代码

import sys
from PyQt5.QtWidgets import QApplication, QDialog, QTextEdit, QPushButton, QVBoxLayout
from PyQt5.QtPrintSupport import QPrintDialog, QPrinter
from PyQt5.QtGui import QPainter, QFont
from PyQt5.QtCore import Qt, QRectF

class PrintDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("会计编号打印程序")
        self.setGeometry(100, 100, 400, 300)

        layout = QVBoxLayout(self)
        self.text_edit = QTextEdit(self)
        layout.addWidget(self.text_edit)

        print_button = QPushButton("打印", self)
        print_button.clicked.connect(self.print_document)
        layout.addWidget(print_button)

        self.setLayout(layout)

    def print_document(self):
        printer = QPrinter(QPrinter.HighResolution)
        print_dialog = QPrintDialog(printer, self)

        if print_dialog.exec_() == QPrintDialog.Accepted:
            content = self.text_edit.toPlainText()
            painter = QPainter(printer)
            font = QFont()
            font.setPointSize(10)
            painter.setFont(font)

            # 获取页面实际绘制区域
            page_rect = printer.pageRect(QPrinter.DevicePixel)
            # 预留页码空间,绘制主内容
            text_rect = QRectF(page_rect.left(), page_rect.top(), 
                               page_rect.width(), page_rect.height() - 30)
            painter.drawText(text_rect, Qt.TextWordWrap, content)

            # 设置页码范围(示例为1-5,可按需修改)
            total_pages = 5
            for page_num in range(1, total_pages + 1):
                if page_num > 1:
                    printer.newPage()
                # 计算右上角页码位置:向右偏移20px,向下偏移20px
                page_text = f"{page_num}"
                text_width = painter.fontMetrics().width(page_text)
                text_height = painter.fontMetrics().height()
                page_pos = page_rect.topRight()
                page_pos.setX(page_pos.x() - text_width - 20)
                page_pos.setY(page_pos.y() + 20)
                painter.drawText(page_pos, page_text)
            
            painter.end()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = PrintDialog()
    dialog.show()
    sys.exit(app.exec_())

关键改进说明

  • 改用QPainter处理打印绘图,符合PyQt打印标准流程,解决空白页问题
  • 通过QRectF精确计算右上角页码位置,实现固定角落的页码打印
  • 可直接修改total_pages参数设置需要的页码范围(比如1-5)
  • 预留主内容与页码的空间,避免内容重叠

内容的提问来源于stack exchange,提问作者Alperen Sarı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:12:49