上一篇
在Java中打印文件可通过
javax.print包实现,核心步骤:获取打印服务→创建打印作业→设置文件内容→执行打印,文本文件用
FileInputStream读取,PDF需依赖PDFBox等库,示例流程:
PrintService获取默认打印机,
DocPrintJob创建任务,
SimpleDoc封装文件流,调用
print()方法输出,注意处理
PrintException异常。
在Java中打印文件涉及多种技术,具体取决于文件类型(文本、PDF、图像等)和打印需求,以下是详细实现方法和示例代码:
基础打印流程(Java PrintService API)
Java通过javax.print包提供原生打印支持,核心步骤:
import javax.print.*;
import javax.print.attribute.*;
import java.io.FileInputStream;
public class BasicFilePrinting {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
// 1. 获取默认打印机
PrintService defaultPrinter = PrintServiceLookup.lookupDefaultPrintService();
// 2. 创建打印任务
DocPrintJob job = defaultPrinter.createPrintJob();
Doc doc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
// 3. 设置打印属性(可选)
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(MediaSizeName.ISO_A4); // A4纸张
attributes.add(new Copies(1)); // 打印份数
// 4. 执行打印
job.print(doc, attributes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
关键点说明:
DocFlavor:指定文件类型(如DocFlavor.INPUT_STREAM.PDF或DocFlavor.INPUT_STREAM.TEXT_PLAIN)- 异常处理:必须捕获
PrintException和IOException
打印特定文件类型
打印PDF文件(需第三方库)
使用Apache PDFBox库:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;
import java.awt.print.PrinterJob;
public class PDFPrinting {
public static void main(String[] args) {
try (PDDocument document = PDDocument.load(new File("document.pdf"))) {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(document));
if (job.printDialog()) { // 显示打印对话框
job.print();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
依赖:

<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.0</version>
</dependency>
打印图像文件
import javax.print.attribute.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class ImagePrinting {
public static void main(String[] args) {
try {
BufferedImage image = ImageIO.read(new File("photo.jpg"));
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
Doc doc = new SimpleDoc((Printable) (graphics, pf, pageIndex) -> {
if (pageIndex > 0) return Printable.NO_SUCH_PAGE;
graphics.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
return Printable.PAGE_EXISTS;
}, flavor, null);
PrintService printer = PrintServiceLookup.lookupDefaultPrintService();
printer.createPrintJob().print(doc, new HashPrintRequestAttributeSet());
} catch (Exception e) {
e.printStackTrace();
}
}
}
高级功能实现
打印预览
使用PageFormat和Printable接口:
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pf, int page) {
if (page > 0) return NO_SUCH_PAGE;
graphics.drawString("打印预览内容", 100, 100);
return PAGE_EXISTS;
}
});
if (job.printDialog()) {
job.print();
}
批量打印
遍历文件列表并调用打印方法:
File[] files = new File("docs/").listFiles();
for (File file : files) {
if (file.getName().endsWith(".txt")) {
printTextFile(file);
}
}
常见问题解决
-
打印机未响应:

- 检查默认打印机设置:
PrintServiceLookup.lookupPrintServices(null, null) - 验证文件是否被其他进程占用
- 检查默认打印机设置:
-
中文乱码:
- 设置字体:
graphics.setFont(new Font("宋体", Font.PLAIN, 12));
- 设置字体:
-
权限问题:
- 在
java.policy文件中添加权限:permission java.lang.RuntimePermission "queuePrintJob";
- 在
最佳实践建议
- 用户交互:
- 使用
printDialog()让用户确认打印参数
- 使用
- 异常处理:
- 捕获
PrinterException并提示友好信息
- 捕获
- 性能优化:
大文件分页打印,避免内存溢出

- 跨平台考虑:
Linux/macOS需安装CUPS,Windows确保打印机驱动正常
引用说明:
- Java PrintService API:Oracle官方文档
- Apache PDFBox:官网
- Java图像打印教程:Java2D打印指南
通过上述方法,您可灵活实现Java文件打印功能,根据实际需求选择原生API或第三方库,并注意处理平台差异性和异常场景。
