Java 导出 PDF 文件:从入门到实战

目录

    • [一、为什么需要导出 PDF 文件?](#一、为什么需要导出 PDF 文件?)
    • [二、使用 iText 库生成 PDF 文件](#二、使用 iText 库生成 PDF 文件)
      • [1. 添加依赖](#1. 添加依赖)
      • [2. 生成 PDF 文件](#2. 生成 PDF 文件)
      • [3. 添加表格和图像](#3. 添加表格和图像)
    • [三、使用 Apache PDFBox 生成 PDF 文件](#三、使用 Apache PDFBox 生成 PDF 文件)
      • [1. 添加依赖](#1. 添加依赖)
      • [2. 生成 PDF 文件](#2. 生成 PDF 文件)
      • [3. 添加表格和图像](#3. 添加表格和图像)
    • 四、总结

在 Java 开发中,生成 PDF 文件是一个常见的需求。无论是生成报告、发票还是其他文档,掌握 PDF 文件的生成技巧都可以大大提高工作效率。本文将详细介绍 Java 中如何导出 PDF 文件,包括使用 iText 和 Apache PDFBox 两种流行的库,并通过具体代码示例帮助你快速上手。

一、为什么需要导出 PDF 文件?

PDF(Portable Document Format)是一种广泛使用的文档格式,具有以下优点:

  • 跨平台:可以在任何操作系统上查看和打印。
  • 格式保留:无论在何种设备上查看,文档的格式都能保持一致。
  • 安全性:可以设置密码保护,防止未经授权的访问。

在实际开发中,生成 PDF 文件的需求非常普遍。例如:

  • 报表生成:生成销售报表、财务报表等。
  • 文档转换:将其他格式的文件(如 HTML、TXT)转换为 PDF。
  • 电子发票:生成符合标准的电子发票。

二、使用 iText 库生成 PDF 文件

iText 是一个功能强大的 Java 库,用于生成和操作 PDF 文件。以下是一个使用 iText 生成 PDF 文件的示例。

1. 添加依赖

在 Maven 项目中,添加以下依赖:

xml 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.5</version>
</dependency>

2. 生成 PDF 文件

java 复制代码
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;

public class ITextExample {
    public static void main(String[] args) {
        // 创建 PDF 文档
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter("hello.pdf"));
        Document doc = new Document(pdfDoc);

        // 添加内容
        doc.add(new Paragraph("Hello, iText!"));

        // 关闭文档
        doc.close();
    }
}

3. 添加表格和图像

java 复制代码
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.element.Image;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.geom.PageSize;

public class ITextExample {
    public static void main(String[] args) {
        // 创建 PDF 文档
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter("hello.pdf"));
        Document doc = new Document(pdfDoc);

        // 添加标题
        doc.add(new Paragraph("Hello, iText!").setBold().setFontSize(18));

        // 添加表格
        Table table = new Table(3);
        table.addCell("Name");
        table.addCell("Age");
        table.addCell("Country");
        table.addCell("John");
        table.addCell("25");
        table.addCell("USA");
        table.addCell("Anna");
        table.addCell("30");
        table.addCell("Germany");
        doc.add(table);

        // 添加图像
        Image image = new Image(ImageDataFactory.create("logo.png"));
        image.scaleToFit(100, 100);
        doc.add(image);

        // 关闭文档
        doc.close();
    }
}

三、使用 Apache PDFBox 生成 PDF 文件

Apache PDFBox 是另一个流行的 Java 库,用于生成和操作 PDF 文件。以下是一个使用 Apache PDFBox 生成 PDF 文件的示例。

1. 添加依赖

在 Maven 项目中,添加以下依赖:

xml 复制代码
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

2. 生成 PDF 文件

java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class PDFBoxExample {
    public static void main(String[] args) {
        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage(PageSize.A4);
            document.addPage(page);

            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
                contentStream.beginText();
                contentStream.newLineAtOffset(100, 700);
                contentStream.showText("Hello, PDFBox!");
                contentStream.endText();
            }

            document.save("hello.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 添加表格和图像

java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.PDImageXObject;

public class PDFBoxExample {
    public static void main(String[] args) {
        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage(PageSize.A4);
            document.addPage(page);

            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                // 添加标题
                contentStream.setFont(PDType1Font.HELVETICA_BOLD, 18);
                contentStream.beginText();
                contentStream.newLineAtOffset(100, 700);
                contentStream.showText("Hello, PDFBox!");
                contentStream.endText();

                // 添加表格
                contentStream.setFont(PDType1Font.HELVETICA, 12);
                contentStream.beginText();
                contentStream.newLineAtOffset(100, 650);
                contentStream.showText("Name\tAge\tCountry");
                contentStream.newLineAtOffset(0, -20);
                contentStream.showText("John\t25\tUSA");
                contentStream.newLineAtOffset(0, -20);
                contentStream.showText("Anna\t30\tGermany");
                contentStream.endText();

                // 添加图像
                PDImageXObject image = PDImageXObject.createFromFile("logo.png", document);
                contentStream.drawImage(image, 100, 500, 100, 100);

            } catch (Exception e) {
                e.printStackTrace();
            }

            document.save("hello.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、总结

通过本文的介绍,我们详细学习了 Java 中如何导出 PDF 文件,包括使用 iText 和 Apache PDFBox 两种流行的库。iText 提供了更丰富的功能和更灵活的 API,适用于复杂的 PDF 生成需求。Apache PDFBox 则是一个轻量级的库,适用于简单的 PDF 生成和操作。希望本文的内容能够帮助你在 Java 开发中更好地实现 PDF 文件的导出功能。

相关推荐
IT猿手14 小时前
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
开发语言·算法·matlab·无人机·动态路径规划·openclaw
IT猿手14 小时前
基于控制障碍函数(Control Barrier Function, CBF)的无人机编队三维动态避障路径规划,MATLAB代码
开发语言·matlab·无人机·动态路径规划·无人机编队
huaweichenai14 小时前
java的时间操作介绍
java·开发语言
A923A14 小时前
【洛谷刷题 | 第五天】
算法·字符串·递归·洛谷
就不掉头发14 小时前
C++右值与右值引用
开发语言·c++
IT猿手14 小时前
基于 CBF 的多无人机编队动态避障路径规划研究,无人机及障碍物数量可以自定义修改,MATLAB代码
开发语言·matlab·无人机·动态路径规划
炸膛坦客14 小时前
单片机/C/C++八股:(十六)C 中 malloc/free 和 C++ 中 new/delete 有什么区别?
c语言·开发语言·c++
@insist12314 小时前
软件设计师-组网技术基础:网络设备、传输介质与局域网核心协议
开发语言·网络·软考·软件设计师·软件水平考试
毕设源码-朱学姐14 小时前
【开题答辩全过程】以 基于SpringBoot+Vue的百货商品进出货平台为例,包含答辩的问题和答案
java·spring boot·后端
Navigator_Z14 小时前
LeetCode //C - 990. Satisfiability of Equality Equations
c语言·算法·leetcode