在 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 打印提供帮助。

相关推荐
客卿1235 分钟前
滑动窗口--模板
java·算法
zjjsctcdl27 分钟前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
Moe48840 分钟前
WebSocket :从浏览器 API 到 Spring 握手、Handler 与前端客户端
java·后端·架构
顶点多余41 分钟前
线程互斥+线程同步+生产消费模型
java·linux·开发语言·c++
⑩-1 小时前
Java基础+集合框架-八股文
java·开发语言
福运常在1 小时前
股票数据API(19)次新股池数据
java·python·maven
Zaki_gd1 小时前
Cortex-M7 D-Cache 与 DMA 缓存一致性说明
java·spring·缓存
多看书少吃饭1 小时前
Vue3 + Java + Python 打造企业级大模型知识库(含 SSE 流式对话完整源码)
java·python·状态模式
Arthas2171 小时前
Java大厂面试:从Spring到微服务的全面技术考察
java·jvm·spring·微服务·面试·并发
mifengxing1 小时前
力扣HOT100——(1)两数之和
java·数据结构·算法·leetcode·hot100