Bootstrap

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


在 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 项目中,添加以下依赖:

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.5</version>
</dependency>

2. 生成 PDF 文件

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. 添加表格和图像

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 项目中,添加以下依赖:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

2. 生成 PDF 文件

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. 添加表格和图像

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

;