python之打印机

本文介绍Anti-Grain Geometry (AGG),一个免费开源的图形库,用于高质量图形输出,并展示了如何使用PyQt5进行文档打印及PDF生成。包括设置打印页面大小、输出格式及文件路径等步骤。

AGG(Anti-Grain Geometry)Anti-Grain Geometry (AGG) is an Open Source, free of charge graphic library, written in industrially standard C++. The terms and conditions of use AGG are described on The License page. AGG doesn't depend on any graphic API or technology. Basically, you can think of AGG as of a rendering engine that produces pixel images in memory from some vectorial data. But of course, AGG can do much more than that. The ideas and the philosophy of AGG are:

Anti-Grain Geometry - About the Project  http://www.antigrain.com/about/index.html

QPrinter Class | Qt Print Support 5.10  http://doc.qt.io/qt-5/qprinter.html

from PyQt5 import QtWidgets, QtPrintSupport 
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QTableWidgetItem, QTabWidget, QFileDialog, QMessageBox
from PyQt5.QtGui import QTextDocument
from QtPrintSupport import  QPrinter
    @pyqtSlot()
    def on_pushButton_print_clicked(self):
        print("dsddsdsdsddssd")
        QPrinter(printer) 
        printer.setPageSize(0)
        printer.setOutputFormat(1)
        filepath = QFileDialog.getSaveFileName(this, tr("保存为..."), tr("D://成绩.pdf"), tr("PDF格式(*.pdf)"))
        printer.setOutputFileName(filepath)
        QTextDocument(textDocument)
        textDocument.setHtml(MakeDataToHtml())
        textDocument.print(printer)
        QMessageBox.about(this, tr("提示"), tr("保存成功"))

        print("dsddsdsdsddssd")
        printer=QPrinter() 
        printer.setPageSize(0)
        printer.setOutputFormat(1)
        filepath = QFileDialog.getSaveFileName(self, "保存为...", "D://成绩.pdf", "PDF格式(*.pdf)")
        print("ddddddddddddd", filepath)
        printer.setOutputFileName(str(filepath))
        textDocument=QTextDocument()
        textDocument.setHtml("dsdftrrrrrrergerr")
        textDocument.print(printer)
        QMessageBox.about(self, "提示", "保存成功")

from PyQt5 import QtWidgets, QtPrintSupport 


Python调用打印机参考例子 - 宁静的天空 - 博客园  https://www.cnblogs.com/ribavnu/p/4790262.html

Qt实现保存、浏览、预览、打印功能 - 优快云博客  https://blog.youkuaiyun.com/zbw1185/article/details/52184961

使用QPrinter生成pdf或用打印机打印数据 - 恒月美剑 - 博客园  https://www.cnblogs.com/jck34/p/4107885.html

QT表格打印_百度文库  https://wenku.baidu.com/view/82e1e7b669dc5022aaea0024.html点击打开链接

QT 打印的简单实现(转)_北极孤星_新浪博客  http://blog.sina.com.cn/s/blog_63578f1401013ars.html


python3+PyQt5 实现文档打印功能 - 优快云博客  https://blog.youkuaiyun.com/xiaoyangyang20/article/details/68941555



(转)用AGG实现高质量图形输出(一) - 3D入魔 - 博客园  http://www.cnblogs.com/mazhenyu/p/3911690.html

<think> 根据用户的问题,用户想了解如何使用Python控制打印机。结合提供的引用内容,我们可以总结出几种常见的方法,特别是使用win32print模块。以下将分步骤介绍主要方法: 1. **使用win32api.ShellExecute打印文件** 这是最简单的方法,直接调用系统命令打印指定文件。示例代码: ```python import win32api import win32print filename = r'F:\path\to\your\file.docx' win32api.ShellExecute(0, "print", filename, '/d:"%s"' % win32print.GetDefaultPrinter(), ".", 0) ``` 说明: - `ShellExecute`函数执行打印命令。 - `'/d:"%s"' % win32print.GetDefaultPrinter()`指定使用默认打印机。 - 此方法会调用关联应用程序打开文件并执行打印,适合已知文件类型(如.docx)的情况。 2. **枚举打印机和设置默认打印机** 如果需要操作多台打印机,可以先枚举系统中的打印机: ```python import win32print printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, 1) for printer in printers: print(printer) # 打印出每台打印机的信息(元组) ``` 设置默认打印机: ```python def set_default_printer(printer_name): win32print.SetDefaultPrinter(printer_name) ``` 3. **直接发送打印指令(原始打印)** 对于需要精确控制打印内容(如直接发送ESC/POS指令)的场景,可以使用原始打印模式: ```python import win32print hPrinter = win32print.OpenPrinter(printer_name) try: # 开始打印作业 job = win32print.StartDocPrinter(hPrinter, 1, ("Test Document", None, "RAW")) win32print.StartPagePrinter(hPrinter) # 发送原始数据(例如:ESC/POS指令) win32print.WritePrinter(hPrinter, b"\x1B\x40") # 初始化打印机 win32print.WritePrinter(hPrinter, b"Hello, World!\n") win32print.EndPagePrinter(hPrinter) finally: win32print.ClosePrinter(hPrinter) ``` 4. **处理打印机状态和DPI问题** - 获取打印机状态(如忙、缺纸等)需要更深入的API调用,可参考`win32print.GetPrinter()`获取状态标志。 - DPI自适应问题(如引用[4]): 引用中提到的方法:先获取打印机的DPI,然后按比例缩放坐标和字号。 示例代码: ```python import win32gui hDC = win32gui.CreateDC("WINSPOOL", printer_name, None) dpi = win32gui.GetDeviceCaps(hDC, 88) # 88对应LOGPIXELSX(水平DPI) scale_factor = dpi / 600.0 # 假设设计时基于600 DPI # 应用缩放:将设计时的坐标乘以scale_factor # 注意:转换坐标时需注意整数转换问题(避免float报错) ``` **注意点**: - 上述方法主要适用于Windows系统(依赖`pywin32`库)。 - 打印文件(如.docx)需要系统中有关联程序能打开该文件类型。 - 原始打印模式适合直接控制热敏打印机等场景。 **常见问题解决**: - 引用[4]中的DPI缩放报错:将浮点数转换为整数(如`int(x * scale_factor)`)可能解决,但要确保不会导致精度损失。 §§相关问题§§ 1. 如何用Python获取打印机的状态(如缺纸、忙碌)? 2. Python控制打印机打印图片的方法有哪些? 3. 在Linux系统下如何用Python控制打印机? 4. 如何用Python实现打印预览功能? </think> 以下是Python控制打印机的常用方法总结,结合了不同场景下的实现方案: ### 一、基本打印方法 1. **默认打印机直接打印文档**(适合快速打印已知格式文件) ```python import win32api import win32print filename = r'C:\test.docx' # 文件路径 win32api.ShellExecute( 0, "print", filename, '/d:"%s"' % win32print.GetDefaultPrinter(), # 指定默认打印机 ".", 0 ) ``` > 特点:自动调用关联程序打印,支持DOCX/PDF/图片等格式[^2] 2. **指定打印机打印** ```python printer_name = "HP_LaserJet_1020" # 指定打印机名称 win32api.ShellExecute(0, "print", filename, f'/d:"{printer_name}"', ".", 0) ``` ### 二、高级控制方法 3. **枚举打印机列表** ```python printers = win32print.EnumPrinters( win32print.PRINTER_ENUM_LOCAL, # 获取本地打印机 None, 1 # 信息级别 ) for i, printer in enumerate(printers): print(f"{i+1}. {printer[2]}") # 打印机名称 ``` 4. **原始数据打印**(直接发送指令) ```python hPrinter = win32print.OpenPrinter(printer_name) try: # 开始打印作业 job = win32print.StartDocPrinter(hPrinter, 1, ("My Document", None, "RAW")) win32print.StartPagePrinter(hPrinter) # 发送原始打印指令(ESC/POS示例) win32print.WritePrinter(hPrinter, b"\x1B\x40") # 初始化打印机 win32print.WritePrinter(hPrinter, b"Hello World\n\x1D\x56\x41") # 打印并切纸 win32print.EndPagePrinter(hPrinter) finally: win32print.ClosePrinter(hPrinter) ``` > 适用场景:POS小票机、标签打印机等[^3] 5. **DPI自适应打印**(解决尺寸偏差问题) ```python from ctypes import windll hDC = windll.user32.GetDC(0) dpi_x = windll.gdi32.GetDeviceCaps(hDC, 88) # 获取水平DPI scale_factor = dpi_x / 600.0 # 假设设计基于600DPI # 应用缩放(示例) def scale(value): return int(value * scale_factor) # 使用时调整所有坐标和尺寸 rect = (scale(100), scale(200), scale(300), scale(400)) ``` ### 三、关键注意事项 1. **依赖库安装**: ```bash pip install pywin32 ``` 2. **打印机状态监控**: ```python status = win32print.GetPrinter(hPrinter, 2)["Status"] if status & win32print.PRINTER_STATUS_PAPER_JAM: print("打印机卡纸!") ``` 3. **常见错误处理**: - `TypeError: 'float' object...` → 坐标值需转为整数 - 权限问题 → 以管理员身份运行程序 - 网络打印机 → 使用UNC路径 `\\server\printer_name` > 建议优先使用原始数据打印模式(RAW)获得更精准控制[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值