Java javax.print打印服务API详解与完整代码实例教程

2024-06-21 李腾 133 次阅读 0 次点赞
本文详细介绍了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打印指南!示例代码清晰易懂,帮我快速解决了项目中的打印需求。感谢作者分享!