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 文件的导出功能。

相关推荐
侧耳倾听1111 分钟前
多线程-线程本地变量ThreadLocal
java
suxiaoling@7 分钟前
C# 使用GDI+设计登录窗体(窗体渐变和关闭淡出)
开发语言·c#
邦之彦39 分钟前
C++:四大强制类型转换
开发语言·c++·static_cast·const_cast·dynamic_cast·reinterpretcast
CYRUS_STUDIO1 小时前
常用加解密算法介绍
算法·安全·逆向
Clank的游戏栈1 小时前
Unity帧同步与状态同步混合架构开发指南
java·unity·架构
天上掉下来个程小白1 小时前
开发环境搭建-01.前端环境搭建
java·spring boot·后端·苍穹外卖
岁岁岁平安2 小时前
SpringMVC学习(初识与复习Web程序的工作流程)(1)
java·spring·servlet·mybatis·springmvc·web
陆鳐LuLu2 小时前
初学者如何用 Python 写第一个爬虫?
开发语言·爬虫·python
兴趣使然的草帽路飞2 小时前
OHara Gateway SPI动态加载机制图解
java·后端·程序员
柿柿快乐2 小时前
C++入门基础
开发语言·c++