Java javax.print打印服务API详解与完整代码实例教程
本文详细介绍了Java javax.print包的核心功能和使用方法,提供了从基础到高级的完整代码示例。内容包括打印服务发现、文本打印、图像打印、HTML内容打印以及高级打印属性设置。每个示例都包含完整的Java代码和详细注释,帮助开发者快速掌握Java打印服务的核心概念和实际应用技巧,解决跨平台打印编程中的常见问题。
javax.print 包是 Java 打印服务(Java Print Service,JPS)API 的核心部分,提供了一套跨平台的打印解决方案。它支持各种打印格式和属性,允许应用程序发现打印服务、指定打印格式、管理打印作业等。
核心组件
主要类和接口
PrintService - 表示打印机
Doc - 表示要打印的文档
DocPrintJob - 表示打印作业
PrintServiceLookup - 用于查找打印服务
SimpleDoc - Doc 接口的实现类
DocFlavor - 定义文档格式
示例代码
1. 查找可用打印机
import javax.print.*;
import javax.print.attribute.standard.*;
import java.util.Arrays;
public class PrinterDiscovery {
public static void main(String[] args) {
// 查找所有可用的打印服务
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("可用的打印机:");
for (PrintService service : services) {
System.out.println("- " + service.getName());
// 获取打印机属性
PrinterResolution resolution = (PrinterResolution) service.getAttribute(PrinterResolution.class);
if (resolution != null) {
System.out.println(" 分辨率: " + resolution.getCrossFeedResolution(ResolutionSyntax.DPI) +
"x" + resolution.getFeedResolution(ResolutionSyntax.DPI) + " DPI");
}
}
// 获取默认打印机
PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
if (defaultService != null) {
System.out.println("\n默认打印机: " + defaultService.getName());
}
}
}2. 打印文本
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.io.*;
public class TextPrinting {
public static void main(String[] args) {
try {
// 获取默认打印机
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
if (printService == null) {
System.out.println("未找到可用的打印机");
return;
}
// 创建打印作业
DocPrintJob printJob = printService.createPrintJob();
// 准备打印内容
String text = "这是测试打印内容\nHello, Java Printing!\n第二行文本";
InputStream is = new ByteArrayInputStream(text.getBytes("UTF-8"));
// 定义文档格式
DocFlavor flavor = DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_8;
// 创建文档
Doc doc = new SimpleDoc(is, flavor, null);
// 设置打印属性
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(MediaSizeName.ISO_A4); // A4纸张
attributes.add(OrientationRequested.PORTRAIT); // 纵向打印
attributes.add(new Copies(1)); // 打印份数
// 提交打印作业
printJob.print(doc, attributes);
System.out.println("打印作业已提交到: " + printService.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}3. 打印图像
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class ImagePrinting {
public static void main(String[] args) {
try {
// 加载图像
BufferedImage image = ImageIO.read(new File("image.jpg"));
if (image == null) {
System.out.println("无法加载图像文件");
return;
}
// 查找支持图像打印的服务
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
if (services.length == 0) {
System.out.println("未找到支持图像打印的打印机");
return;
}
// 使用第一个找到的打印机
PrintService printService = services[0];
DocPrintJob printJob = printService.createPrintJob();
// 创建可打印对象
Printable printable = (graphics, pageFormat, pageIndex) -> {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
// 调整图像大小以适应页面
double pageWidth = pageFormat.getImageableWidth();
double pageHeight = pageFormat.getImageableHeight();
double scale = Math.min(pageWidth / image.getWidth(),
pageHeight / image.getHeight());
int scaledWidth = (int)(image.getWidth() * scale);
int scaledHeight = (int)(image.getHeight() * scale);
int x = (int)pageFormat.getImageableX() + (int)(pageWidth - scaledWidth) / 2;
int y = (int)pageFormat.getImageableY() + (int)(pageHeight - scaledHeight) / 2;
graphics.drawImage(image, x, y, scaledWidth, scaledHeight, null);
return Printable.PAGE_EXISTS;
};
// 创建文档
Doc doc = new SimpleDoc(printable, flavor, null);
// 设置打印属性
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(MediaSizeName.ISO_A4);
attributes.add(OrientationRequested.LANDSCAPE);
// 提交打印
printJob.print(doc, attributes);
System.out.println("图像打印作业已提交");
} catch (Exception e) {
e.printStackTrace();
}
}
}4. 高级打印属性设置
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.io.*;
public class AdvancedPrinting {
public static void main(String[] args) {
try {
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
if (printService == null) {
System.out.println("未找到可用的打印机");
return;
}
// 检查打印机能力
if (!printService.isDocFlavorSupported(DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_8)) {
System.out.println("打印机不支持纯文本格式");
return;
}
// 创建详细的打印属性
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(MediaSizeName.ISO_A4);
attributes.add(OrientationRequested.PORTRAIT);
attributes.add(new Copies(2)); // 打印2份
attributes.add(Sides.ONE_SIDED); // 单面打印
attributes.add(Chromaticity.COLOR); // 彩色打印
attributes.add(PrintQuality.NORMAL); // 打印质量
attributes.add(MediaPrintableArea.MM_TO_PT(10), // 边距:10mm
MediaPrintableArea.MM_TO_PT(10),
MediaPrintableArea.MM_TO_PT(190),
MediaPrintableArea.MM_TO_PT(277),
MediaPrintableArea.MM);
// 打印内容
String content = "高级打印示例\n" +
"=============\n" +
"这是使用高级属性设置的打印作业\n" +
"包括页面设置、打印质量等属性";
InputStream is = new ByteArrayInputStream(content.getBytes("UTF-8"));
Doc doc = new SimpleDoc(is, DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_8, null);
// 创建打印作业并添加监听器
DocPrintJob printJob = printService.createPrintJob();
printJob.addPrintJobListener(new PrintJobAdapter() {
@Override
public void printJobCompleted(PrintJobEvent pje) {
System.out.println("打印作业完成");
}
@Override
public void printJobFailed(PrintJobEvent pje) {
System.out.println("打印作业失败");
}
});
// 提交打印作业
printJob.print(doc, attributes);
System.out.println("高级打印作业已提交");
} catch (Exception e) {
e.printStackTrace();
}
}
}5. 打印 HTML 内容
import javax.print.*;
import javax.print.attribute.*;
import javax.swing.*;
import java.io.*;
public class HTMLPrinting {
public static void main(String[] args) {
try {
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
// HTML 内容
String htmlContent = "<html><body>" +
"<h1>HTML 打印示例</h1>" +
"<p>这是一个 <b>粗体</b> 和 <i>斜体</i> 文本</p>" +
"<ul><li>项目1</li><li>项目2</li></ul>" +
"</body></html>";
// 使用 JEditorPane 渲染 HTML
JEditorPane editorPane = new JEditorPane("text/html", htmlContent);
editorPane.setSize(500, 600);
editorPane.validate();
// 创建打印作业
DocPrintJob printJob = printService.createPrintJob();
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
Doc doc = new SimpleDoc((Printable) editorPane.getPrintable(null, null),
flavor, null);
// 打印属性
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(MediaSizeName.ISO_A4);
printJob.print(doc, attributes);
System.out.println("HTML 打印作业已提交");
} catch (Exception e) {
e.printStackTrace();
}
}
}主要特性
1、跨平台兼容 - 在所有支持 Java 的平台上工作
2、格式支持 - 支持文本、HTML、图像、PDF 等多种格式
3、属性控制 - 精细控制打印参数(纸张、方向、质量等)
4、服务发现 - 动态发现可用的打印服务
5、作业管理 - 监控和管理打印作业状态
注意事项
1、打印操作可能需要用户权限
2、不同的打印机支持不同的功能和属性
3、在生产环境中应添加适当的错误处理和用户确认
4、某些打印操作可能需要图形环境支持
最后更新于3月前
本文由人工编写,AI优化,转载请注明原文地址: Java javax.print打印API完整指南:从入门到实战代码示例
推荐阅读
评论 (3)
发表评论
昵称:加载中...
晨光微曦2025-11-23 12:21:26
非常清晰的Java打印API指南!示例代码很实用,帮我快速实现了打印机发现功能。感谢分享!
萌萌哒2025-11-16 15:47:22
很实用的Java打印指南!示例代码很清晰,让我快速理解了javax.print的核心用法。感谢分享!
糖糖不甜2025-11-14 09:58:06
很实用的Java打印指南!示例代码清晰易懂,帮我快速解决了项目中的打印需求。感谢作者分享!