Print打印机例子

本文提供了两个使用Java实现打印功能的例子。第一个例子展示了如何打印图片文件,包括设置打印属性和服务,以及通过对话框选择打印服务。第二个例子则演示了如何打印文本文件,包括异常处理。
[b][size=medium]例子一:[/size][/b]
public class Test {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
File imageFile = new File("f:/1.png");
//打印作业的属性
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
//打印作业的格式,来源(PNG就换成.PNG就行了)
DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
//搜索所有可能的打印服务
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, attributes);
System.out.println("services:"+services.length);

//搜索默认打印服务
PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
//显示打印Dialog
PrintService service = ServiceUI.printDialog(null, 0, 0, services, defaultService, flavor, attributes);
//如果用户选择打印
if(service!=null){
//创建打印任务
DocPrintJob job = service.createPrintJob();
FileInputStream fis = new FileInputStream(imageFile);
//任务的属性
DocAttributeSet docAttributes = new HashDocAttributeSet();
Doc doc = new SimpleDoc(fis, flavor, docAttributes);
//打印
job.print(doc, attributes);
}
}

}



[b][size=medium]例子二:[/size][/b]
转载自: [url]http://www.iteye.com/topic/1121183[/url]

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
/**
* 调用打印机功能
* @author Administrator
*
*/
public class PrintDemoII {

public static void main(String[] args) {
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
PrintService []pservices = PrintServiceLookup.lookupPrintServices(flavor, aset);
PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
PrintService service = ServiceUI.printDialog(null, 200, 200, pservices,
defaultService, flavor, aset);
if(service != null){
try {
DocPrintJob pj =service.createPrintJob();
FileInputStream fis = new FileInputStream("D:" + File.separator + "zkyzl.txt");
DocAttributeSet das = new HashDocAttributeSet();
Doc doc = new SimpleDoc(fis, flavor, das);
pj.print(doc, aset);
} catch (FileNotFoundException fe) {
fe.printStackTrace();
} catch (PrintException e) {
e.printStackTrace();
}
}else {
System.out.println("打印失败");
}
}
}
<think>我们被要求回答关于使用Python的win32print库指定打印机进行打印的方法。根据提供的引用,我们可以整合信息并给出实现步骤。 引用[1]和[2]提到了win32print模块用于与打印机交互,引用[3]和[4]则提到了一些具体的使用方法和注意事项。 关键点: 1. 使用win32print模块控制打印机。 2. 引用[3]提到使用win32api.ShellExecute可能会立即返回,导致打印任务乱序。 3. 引用[4]提到EnumPrinters可以获取打印机信息,并且可以更改打印机设置。 目标:指定打印机进行打印。 步骤: 1. 获取所有打印机,并找到目标打印机的名称或句柄。 2. 打开目标打印机,获取打印机句柄。 3. 将打印内容发送到该打印机。 根据引用[4],我们可以使用EnumPrinters来枚举打印机,然后通过打印机名称来指定。 具体实现: - 首先,导入win32print模块。 - 使用win32print.EnumPrinters()获取打印机列表,并选择需要的打印机。 - 使用win32print.OpenPrinter(printer_name)打开打印机,获取句柄。 - 然后,可以使用win32print.StartDocPrinter和StartPagePrinter、WritePrinter、EndPagePrinter、EndDocPrinter等函数来发送打印任务。 但是,对于打印文件(如PDF、图片等),直接使用WritePrinter需要将文件内容转换为打印机可以理解的格式(如PCL、PS等),这比较复杂。 另一种方法是使用win32api.ShellExecute,但是引用[3]指出它会立即返回,可能导致乱序。 因此,我们可以采用以下两种方式之一: 方式1:使用win32print的原始打印命令(需要了解打印机的语言,不推荐)。 方式2:使用win32ui模块(需要配合PyWin32)来打印文档,它提供了更高级的接口。 然而,用户的问题是指定打印机打印,我们可以通过设置打印机的名称来实现。 下面给出两种常用方法: 方法一:使用win32api.ShellExecute(简单,但可能乱序) ```python import win32api printer_name = "你的打印机名称" file_to_print = "C:\\path\\to\\file.pdf" # 需要打印的文件路径 # 使用ShellExecute打印 win32api.ShellExecute(0, "print", file_to_print, f'"{printer_name}"', ".", 0) ``` 注意:这种方法会调用与文件类型关联的应用程序来打印,并且会立即返回,可能无法保证打印顺序。 方法二:使用win32print和win32ui(推荐,可以后台打印,避免乱序) 对于文本或图像,我们可以使用win32ui创建打印设备上下文,然后进行绘制。但对于已经存在的文件(如PDF),可能需要其他库(如pyPDF2)来解析并绘制,或者使用Adobe Reader的命令行。 实际上,更通用的方法是使用win32print的StartDocPrinter等函数,但是我们需要将文件内容以原始数据发送给打印机。这要求打印机支持该文件的格式(比如直接发送PDF数据到支持PDF的打印机)。 这里给出一个使用win32print发送原始数据(RAW)的示例: ```python import win32print # 指定打印机名称 printer_name = win32print.GetDefaultPrinter() # 默认打印机,也可以手动指定一个名字 # 或者手动指定 # printer_name = "Your_Printer_Name" # 打开打印机 hPrinter = win32print.OpenPrinter(printer_name) try: # 开始一个打印任务 job_info = ("Raw Document", None, "RAW") job_id = win32print.StartDocPrinter(hPrinter, 1, job_info) win32print.StartPagePrinter(hPrinter) # 假设我们打印一个文本字符串,需要转换成字节 data = "Hello, Printer!".encode('utf-8') win32print.WritePrinter(hPrinter, data) win32print.EndPagePrinter(hPrinter) win32print.EndDocPrinter(hPrinter) finally: win32print.ClosePrinter(hPrinter) ``` 但是,如果要打印一个文件(比如PDF、图片等),我们需要读取文件内容,然后发送给打印机。但是,这要求打印机能够解释这些原始数据。例如,如果打印机支持PostScript,则可以发送PostScript文件的内容;如果支持PCL,则发送PCL格式的数据。 对于普通的文本文件,直接发送文本内容可能可以工作(如果打印机支持纯文本)。但对于其他格式,我们需要将文件转换为打印机支持的语言(通常是PostScript或PCL),或者使用更高级的方法。 因此,更实际的做法是使用应用程序来打印,比如使用Adobe Reader打印PDF,使用图片查看器打印图片等。这样我们可以利用应用程序的打印功能。 但是,在后台静默打印,我们可以使用以下方法(以PDF为例,使用Adobe Reader的命令行打印): ```python import subprocess adobe_path = "C:\\Program Files (x86)\\Adobe\\Acrobat Reader DC\\Reader\\AcroRd32.exe" pdf_file = "C:\\path\\to\\file.pdf" printer_name = "Your_Printer_Name" # 使用Adobe Reader打印到指定打印机,/t参数表示静默打印 subprocess.call([adobe_path, "/t", pdf_file, printer_name]) ``` 注意:这种方法依赖于系统中安装的Adobe Reader,并且需要知道其路径。 综上所述,指定打印机打印的方法取决于你要打印的文件类型和打印机的功能。对于文本文件,可以直接发送原始数据;对于其他格式,最好使用相应的应用程序。 根据引用[4],我们还可以通过更改默认打印机来间接指定,但这样会影响系统设置,不推荐。 因此,我们总结: 1. 对于文本内容,可以使用win32print发送原始数据。 2. 对于文件打印,推荐使用应用程序的命令行(如Adobe Reader打印PDF)或者使用ShellExecute(但注意乱序问题)。 3. 使用win32ui模块可以绘制文档然后打印(适合自定义绘制,比如报告等)。 下面给出一个使用win32ui打印文本的例子(可以指定打印机): ```python import win32ui import win32print import win32con printer_name = win32print.GetDefaultPrinter() # 或者指定打印机名称 # 创建DC(设备上下文) hdc = win32ui.CreateDC() hdc.CreatePrinterDC(printer_name) hdc.StartDoc("My Document") hdc.StartPage() # 打印文本 hdc.TextOut(100, 100, "Hello, Printer!") # 位置和文本 hdc.EndPage() hdc.EndDoc() ``` 这种方法可以指定打印机,并且可以绘制文本、图形等,但需要自己控制绘制内容。 所以,根据需求选择合适的方法。 参考文献: [^1], [^2], [^3], [^4] </think>### Python win32print库指定打印机打印的实现方法 在Python中使用`win32print`库指定打印机进行打印,可通过以下步骤实现: #### 1. **获取打印机列表** 首先需要枚举系统中的打印机,找到目标打印机的名称: ```python import win32print # 获取所有打印机名称 printers = win32print.EnumPrinters( win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS ) for printer in printers: print(printer[2]) # 打印机名称 ``` #### 2. **直接指定打印机打印文本** 使用`OpenPrinter`获取打印机句柄,并通过原始数据流打印: ```python def print_raw_text(printer_name, text): hPrinter = win32print.OpenPrinter(printer_name) try: win32print.StartDocPrinter(hPrinter, 1, ("RAW Document", None, "RAW")) win32print.StartPagePrinter(hPrinter) # 将文本转为字节流 data = text.encode('utf-8') win32print.WritePrinter(hPrinter, data) win32print.EndPagePrinter(hPrinter) win32print.EndDocPrinter(hPrinter) finally: win32print.ClosePrinter(hPrinter) # 示例调用 print_raw_text("Your_Printer_Name", "打印测试内容") ``` #### 3. **打印文件(如PDF/图片)** 通过`ShellExecute`指定打印机,但需注意任务顺序问题[^3]: ```python import win32api import os def print_file(printer_name, file_path): # 确保文件存在 if not os.path.exists(file_path): raise FileNotFoundError # 使用ShellExecute打印 win32api.ShellExecute( 0, "print", file_path, f'/d:"{printer_name}"', ".", 0 ) ``` #### 4. **高级打印控制(推荐)** 使用`win32ui`避免打印任务乱序问题[^3]: ```python import win32ui import win32con def advanced_print(printer_name, file_path): hdc = win32ui.CreateDC() hdc.CreatePrinterDC(printer_name) hdc.StartDoc(file_path) hdc.StartPage() # 此处添加绘制内容逻辑(文本/图像) # 例如:hdc.TextOut(100, 100, "打印内容") hdc.EndPage() hdc.EndDoc() ``` #### 关键注意事项: 1. **打印机名称匹配** 名称必须与系统注册的完全一致(区分大小写),可通过`EnumPrinters`验证[^4]。 2. **任务顺序控制** `ShellExecute`会立即返回,可能导致多任务乱序,建议使用`win32ui`方案[^3]。 3. **权限问题** 操作打印机需要管理员权限,尤其在访问网络打印机时[^4]。 4. **数据类型** `WritePrinter`需要字节流输入,非文本文件需转换为打印机支持的格式(如PCL/PS)。 > 示例:将旧打印机切换到新网络打印机 > 通过`EnumPrinters`获取新打印机UNC路径后,更新打印任务路径即可实现无缝切换[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值