在 Java 中打印 PDF 文件:自定义打印设置指南

在 Java 中处理 PDF 文件时,除了能够读取、修改和生成 PDF 文件外,打印 PDF 文件同样是一个常见需求。无论是企业中的报表打印,还是个人的文档输出,正确配置打印设置可以极大提升文档输出的效率和质量。本文将介绍如何使用 Java 打印 PDF 文件,重点讲解如何自定义打印机、页面范围、双面打印、纸张大小等常见设置。

使用 Java 打印 PDF 文件:准备工作

在 Java 中,打印文件的核心工具是 PrinterJob 类。通过 PrinterJob 类,开发者可以指定打印机、设置页面格式、定义打印范围等。在处理 PDF 文件时,结合 Spire.PDF 库,我们能够将 PDF 文档与这些打印设置结合,从而高效实现打印操作。

安装 Spire.PDF for Java

在 Java 项目中使用 Spire.PDF 打印 PDF 文件之前,需要先安装 Spire.PDF 库。Spire.PDF 提供了多种安装方式,下面是通过 Maven 安装的步骤,以及手动安装的方法。

使用 Maven 安装 Spire.PDF

如果你正在使用 Maven 来管理项目的依赖,安装 Spire.PDF 非常简单。只需在 pom.xml 中添加以下依赖项:

java 复制代码
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>12.1.4</version>
    </dependency>
</dependencies>

Maven 会自动下载并管理 Spire.PDF 库的所有依赖。确保你的项目已经正确配置了 Maven,并且能够访问 Maven 中央仓库。

手动安装 Spire.PDF

如果你不使用 Maven,也可以通过手动下载 Spire.PDF 库来进行安装。以下是手动安装的步骤:

  • 下载 JAR 文件 :你可以从e-iceblue官方网站下载最新的 Spire.PDF JAR 文件

  • 添加到项目中:将下载的 JAR 文件导入到 Java 项目中。

接下来,我们将通过几个常见的打印需求,演示如何在 Java 中实现 PDF 打印。

1. 使用 Java 指定打印机并设置 PDF 打印页码范围

首先,我们来看看如何指定打印机,并设置打印的页面范围。这种需求在需要打印特定文档的某一部分时非常有用,比如只打印报表的前几页或某些特定区域。

示例代码:
java 复制代码
import com.spire.pdf.PdfDocument;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.PageRanges;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

public class PrintWithSpecificSettings {

    public static void main(String[] args) throws PrinterException {

        // 创建一个 PrinterJob 对象
        PrinterJob printerJob = PrinterJob.getPrinterJob();

        // 查找并设置特定打印机
        PrintService printService = findPrintService("\\\\192.168.1.104\\HP LaserJet P1007");
        if (printService != null) {
            printerJob.setPrintService(printService);
        }

        // 设置页面格式
        PageFormat pageFormat = printerJob.defaultPage();
        Paper paper = pageFormat.getPaper();
        paper.setImageableArea(0, 0, pageFormat.getWidth(), pageFormat.getHeight());
        pageFormat.setPaper(paper);

        // 加载 PDF 文件
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("计划书.pdf");

        // 设置可打印内容和页面格式
        printerJob.setPrintable(pdf, pageFormat);

        // 设置打印范围
        PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
        attributes.add(new PageRanges(1, 5));  // 打印第1页到第5页

        // 执行打印
        try {
            printerJob.print(attributes);
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }

    // 查找指定的打印机
    private static PrintService findPrintService(String printerName) {
        PrintService[] printServices = PrinterJob.lookupPrintServices();
        for (PrintService service : printServices) {
            if (service.getName().equals(printerName)) {
                return service;
            }
        }
        return null;
    }
}
关键点:
  • 打印机选择 :通过 PrinterJob.getPrintService()findPrintService() 方法,我们可以选择特定的打印机,确保打印任务发送到正确的设备。

  • 打印范围 :使用 PageRanges 设置打印的页面范围。在这个示例中,设置了打印从第 1 页到第 5 页的内容。

2. 使用 Java 双面打印 PDF 文件

双面打印功能在节省纸张和提高打印效率方面具有显著优势。Java 提供了 Sides 属性来设置是否启用双面打印。下面的代码演示了如何启用双面打印。

示例代码:
java 复制代码
import com.spire.pdf.PdfDocument;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Sides;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

public class PrintInDuplexMode {

    public static void main(String[] args) {

        // 创建 PrinterJob 对象
        PrinterJob printerJob = PrinterJob.getPrinterJob();

        // 设置页面格式
        PageFormat pageFormat = printerJob.defaultPage();
        Paper paper = pageFormat.getPaper();
        paper.setImageableArea(0, 0, pageFormat.getWidth(), pageFormat.getHeight());
        pageFormat.setPaper(paper);

        // 加载 PDF 文件
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("计划书.pdf");

        // 设置打印内容
        printerJob.setPrintable(pdf, pageFormat);

        // 创建打印请求设置并启用双面打印
        PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
        attributeSet.add(Sides.TWO_SIDED_SHORT_EDGE); // 启用双面打印

        // 执行打印任务
        try {
            printerJob.print(attributeSet);
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
}
关键点:
  • 双面打印 :通过 Sides.TWO_SIDED_SHORT_EDGE 设置启用双面打印。在此设置下,打印机会自动处理文档的双面输出,通常用于打印书籍、报告等需要两面打印的文档。

3. Java 打印 PDF 时自定义纸张大小

有时,打印文档的纸张可能不符合标准的纸张尺寸,比如需要打印在特殊尺寸的纸张上。Java 允许开发者自定义纸张的大小和其他打印设置。

示例代码:
java 复制代码
import com.spire.pdf.PdfDocument;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

public class PrintWithCustomPaperSize {

    public static void main(String[] args) {

        // 创建 PrinterJob 对象
        PrinterJob printerJob = PrinterJob.getPrinterJob();

        // 设置页面格式
        PageFormat pageFormat = printerJob.defaultPage();
        Paper paper = pageFormat.getPaper();

        // 自定义纸张大小
        paper.setSize(500, 600);  // 设置纸张大小为 500 x 600 点

        // 应用纸张设置
        pageFormat.setPaper(paper);

        // 加载 PDF 文件
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("计划书.pdf");

        // 设置打印内容
        printerJob.setPrintable(pdf, pageFormat);

        // 执行打印
        try {
            printerJob.print();
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
}
关键点:
  • 自定义纸张大小 :通过 Paper.setSize() 设置自定义的纸张宽度和高度。在本示例中,设置了一个 500x600 点的纸张尺寸,适合需要特殊打印输出的场景。

总结

通过 Java 的 PrinterJob 类和 Spire.PDF 库,开发者可以轻松地控制 PDF 文件的打印设置,包括选择打印机、设置页面范围、启用双面打印、调整纸张大小等功能。希望本文能为你在 Java 项目中处理 PDF 打印提供帮助。

相关推荐
夕除14 小时前
AOP 实现 Redis 缓存切面解析
java·开发语言·python
库拉大叔14 小时前
工具调用效率对比实测:GPT-5.5与Gemini 3.5 Flash性能评估
java·前端·人工智能
我是唐青枫14 小时前
Java MyBatis 实战指南:XML 映射、动态 SQL 与数据访问层设计
java·mybatis
摇滚侠14 小时前
Spring 零基础入门到进阶 面向切面 AOP 52-60
java·后端·spring
就改了14 小时前
微服务接口性能优化:CompletableFuture 并行聚合实践
java·微服务·性能优化
林森lsjs14 小时前
【日耕一题】4. 较为复杂情况下的求和
java·开发语言
Hui Baby14 小时前
虚拟线程整理
java
白露与泡影14 小时前
2026秋招冲刺:1000道Java高频面试题(各大厂考点汇总)
java·开发语言·面试
IT龟苓膏14 小时前
Java 并发基础:进程、线程、线程状态、synchronized、volatile 一篇讲清
java·开发语言·jvm
weixin_4467291614 小时前
java中class类没有打进war包中
java