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

相关推荐
努力也学不会java1 分钟前
【Java并发】深入理解synchronized
java·开发语言·人工智能·juc
TDengine (老段)1 分钟前
TDengine 数学函数 CEIL 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Giser探索家3 分钟前
建筑物孪生模型:重构空间数字化格局,赋能智慧城市
大数据·人工智能·算法·重构·分类·云计算·智慧城市
星竹晨L17 分钟前
【C++】深入理解list底层:list的模拟实现
开发语言·c++
LB211222 分钟前
Redis 黑马skyout
java·数据库·redis
Tiny番茄24 分钟前
leetcode 3. 无重复字符的最长子串
数据结构·python·算法·leetcode
豐儀麟阁贵29 分钟前
Java知识点储备
java·开发语言
hrrrrb35 分钟前
【Spring Security】Spring Security 密码编辑器
java·hive·spring
豐儀麟阁贵38 分钟前
2.3变量与常量
java·开发语言
兮动人2 小时前
Eureka注册中心通用写法和配置
java·云原生·eureka