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

相关推荐
小宋10214 分钟前
不用学算法也能玩转 AI?普通 Java 程序员转 AI 应用开发路线
java·人工智能·重构
编程圈子6 分钟前
电机驱动开发学习19. 霍尔 BLDC 三段式 FOC 启动算法
驱动开发·学习·算法
米码收割机10 分钟前
【Python】Django 电子设备商城系统(源码+说明文档)[独一无二]
开发语言·python·django
Hello_Damon_Nikola11 分钟前
伺服电机堵转检测算法详解
单片机·嵌入式硬件·算法
互联网中的一颗神经元15 分钟前
小白python入门 - 38. 动态内容:接口优先与自动化扫盲
开发语言·python·自动化
我是唐青枫36 分钟前
Java Jetty 实战详解:从嵌入式 HTTP 服务到 Spring Boot 容器替换
java
带刺的坐椅36 分钟前
当所有人都在用 TS/Python 写 Agent,我们为什么坚持 Java
java·ai·solon·codex·opencode·soloncode
黑客-秋凌39 分钟前
使用Python+selenium实现第一个自动化测试脚本
开发语言·自动化测试·软件测试·python·selenium·测试工具
小王师傅6644 分钟前
英语学习记
java·学习
罗小罗同学1 小时前
安德森癌症中心发表SCOPE IO模型,实现了对罕见肿瘤帕博利珠单抗疗效的精准预测,在患者早期即可预判药效
人工智能·算法·医学图像处理·医学ai