Java使用iText库生成PDF文件的完整实践

10 次阅读

Java生态中,PDF文件生成一直是企业应用开发中的常见需求,例如电子合同、报表导出、发票打印、数据归档、业务凭证生成等场景。由于PDF格式具有跨平台、稳定性强、不易被修改等特点,越来越多的Java项目选择使用专业PDF处理库完成文档创建。

iText作为Java领域应用广泛的PDF处理框架,提供了丰富的API,可以帮助开发者快速实现PDF文件创建、文字写入、图片插入、表格生成、样式控制以及数字签名等功能。通过合理使用iText,可以构建满足复杂业务需求的PDF生成方案。

iText简介与版本选择

iText是一款开源PDF开发库,最早主要服务于Java平台,后来逐渐扩展到其他语言环境。它提供底层PDF操作能力,使开发人员能够通过代码动态生成PDF文档。

目前常用版本主要包括:

  • iText 5:经典版本,API简单成熟,很多旧项目仍在使用。

  • iText 7:新版架构,模块化设计更合理,性能和扩展能力更强。

对于新项目开发,通常更推荐使用iText 7。它对PDF标准支持更加完善,并且提供了更灵活的布局管理能力。

本文以iText 7为例介绍Java生成PDF文件的完整流程。

Maven引入iText依赖

使用iText 7生成PDF,需要先添加相关依赖。

XML

    
        com.itextpdf
        kernel
        7.2.5
    

    
        com.itextpdf
        layout
        7.2.5
    

其中:

  • kernel模块负责PDF底层对象操作。

  • layout模块提供高级布局功能,例如段落、表格、图片等。

如果项目需要处理中文字体,还需要额外引入字体相关模块。

XML

    com.itextpdf
    font-asian
    7.2.5

创建第一个PDF文件

使用iText生成PDF的基本流程非常简单:

  1. 创建PDF文档对象。

  2. 添加内容。

  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;

public class PdfCreateDemo {

    public static void main(String[] args) throws Exception {

        String filePath = "demo.pdf";

        PdfWriter writer = new PdfWriter(filePath);

        PdfDocument pdfDocument = new PdfDocument(writer);

        Document document = new Document(pdfDocument);

        document.add(new Paragraph("Hello iText PDF"));

        document.close();

        System.out.println("PDF生成成功");
    }
}

运行程序后,会在指定目录生成demo.pdf文件。

这里的核心对象包括:

PdfWriter

负责将PDF内容写入文件。

PdfDocument

代表PDF文档本身,可以控制页面、元数据等底层信息。

Document

属于高级布局层,用于添加文本、图片、表格等内容。

Java生成PDF中文乱码解决方案

PDF开发中最容易遇到的问题就是中文乱码。

默认情况下,iText不会自动加载中文字体,因此直接写入中文可能出现空白或者乱码。

解决方式是加载系统字体或项目中的字体文件。

示例:

Java
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.font.PdfFont;

PdfFont font = PdfFontFactory.createFont(
        "C:/Windows/Fonts/simsun.ttc,0",
        PdfEncodings.IDENTITY_H
);

然后设置字体:

Java
Paragraph paragraph = new Paragraph("Java生成中文PDF测试");

paragraph.setFont(font);

document.add(paragraph);

常见中文字体:

  • Windows:宋体、微软雅黑。

  • Linux:Noto Sans CJK。

  • 项目部署环境:建议将字体文件随项目一起打包。

这样可以避免服务器环境变化导致PDF显示异常。

设置PDF文字样式

实际业务中,PDF通常需要设置标题、正文、颜色、大小等格式。

例如:

Java
Paragraph title = new Paragraph("用户信息报告");

title.setFontSize(20);

document.add(title);

设置字体:

Java
paragraph.setFont(font);
paragraph.setFontSize(12);

设置文本对齐:

Java
paragraph.setTextAlignment(TextAlignment.CENTER);

常见样式控制包括:

  • 字体大小。

  • 字体类型。

  • 粗体效果。

  • 文本颜色。

  • 对齐方式。

  • 行间距。

合理使用样式,可以生成更加专业的PDF文档。

使用iText生成PDF表格

报表类PDF通常离不开表格。

iText提供Table组件,可以快速创建结构化数据。

示例:

Java
Table table = new Table(3);

table.addCell("编号");
table.addCell("姓名");
table.addCell("年龄");

table.addCell("1");
table.addCell("张三");
table.addCell("25");

table.addCell("2");
table.addCell("李四");
table.addCell("30");

document.add(table);

生成效果类似:

编号姓名年龄
1张三25
2李四30

实际开发中,可以结合数据库查询结果动态生成表格,例如:

  • 用户列表。

  • 销售订单。

  • 财务报表。

  • 统计分析数据。

PDF中插入图片

除了文字和表格,很多业务文档还需要添加Logo、二维码、图片附件等内容。

示例:

Java
import com.itextpdf.layout.element.Image;
import com.itextpdf.io.image.ImageDataFactory;

Image image = new Image(
    ImageDataFactory.create("logo.png")
);

document.add(image);

图片可以进一步设置:

Java
image.setWidth(100);
image.setHeight(100);

常见应用场景:

  • 企业Logo。

  • 产品图片。

  • 电子签章。

  • 条形码和二维码。

添加页眉页脚

正式PDF文件通常需要页码、公司名称、生成时间等信息。

iText可以通过事件监听器实现页眉页脚。

例如添加页码:

Java
pdfDocument.addEventHandler(
    PdfDocumentEvent.END_PAGE,
    new PageNumberEventHandler()
);

通过事件机制,可以统一控制所有页面内容。

适用于:

  • 合同文件。

  • 项目报告。

  • 企业文档归档。

设置PDF页面大小

默认情况下,PDF使用A4尺寸。

如果需要自定义页面,可以创建页面大小:

Java
PdfDocument pdfDocument =
    new PdfDocument(writer);

Document document =
    new Document(pdfDocument, PageSize.A4);

常见页面类型:

  • A4报告。

  • A5票据。

  • 横向报表。

  • 自定义尺寸打印文件。

Java Web项目中动态生成PDF

在Spring Boot项目中,经常需要接口返回PDF文件。

例如:

Java
@GetMapping("/export")
public void export(HttpServletResponse response) throws Exception {

    response.setContentType("application/pdf");

    response.setHeader(
        "Content-Disposition",
        "attachment;filename=test.pdf"
    );

    PdfWriter writer =
        new PdfWriter(response.getOutputStream());

    PdfDocument pdf =
        new PdfDocument(writer);

    Document document =
        new Document(pdf);

    document.add(
        new Paragraph("Spring Boot PDF导出")
    );

    document.close();
}

用户访问接口后,可以直接下载生成的PDF文件。

这种方式常用于:

  • 在线订单打印。

  • 报表导出。

  • 电子证明生成。

  • 文件下载服务。

PDF文件生成性能优化

当PDF内容较大时,需要关注性能问题。

1. 避免一次加载大量数据

如果数据库数据量很大,不建议一次查询全部记录。

可以采用:

  • 分页查询。

  • 流式读取。

  • 分批生成。

2. 控制图片大小

高清图片会明显增加PDF体积。

建议:

  • 上传前压缩图片。

  • 控制图片分辨率。

  • 使用合适格式。

3. 及时关闭资源

PDF生成过程中涉及文件流操作,必须关闭Document。

推荐使用:

Java
try(Document document = new Document(pdfDocument)){
    
}

避免资源泄漏。

iText生成PDF常见问题

PDF打开后中文乱码

原因:

  • 未加载中文字体。

  • 字体编码不支持中文。

解决:

使用Identity-H编码并加载中文字体。


PDF文件损坏

原因:

  • Document未关闭。

  • 输出流提前关闭。

  • 写入过程中异常。

解决:

确保PDF生成流程完整执行。


表格内容显示异常

原因:

  • 列宽不足。

  • 字体过大。

  • 单元格内容过长。

解决:

调整表格宽度:

Java
table.setWidth(UnitValue.createPercentValue(100));

或者设置自动换行。


服务器部署后字体缺失

原因:

开发环境存在字体,但生产服务器没有。

解决:

将字体文件放入项目资源目录,通过classpath加载。

iText与其他PDF库对比

Java生态中还有一些PDF处理方案,例如:

  • Apache PDFBox。

  • OpenPDF。

  • Flying Saucer。

简单对比如下:

工具特点
iText功能全面,适合复杂PDF生成
PDFBox开源免费,适合PDF读取和基础操作
OpenPDF兼容部分iText旧版本API
Flying Saucer适合HTML转PDF

如果项目重点是生成复杂业务PDF,例如合同、报表、票据,iText通常是更成熟的选择。

总结

Java使用iText生成PDF是一种稳定、高效的解决方案。通过iText提供的PDF文档对象、布局组件、字体管理、表格处理以及事件机制,开发人员可以快速构建功能完善的PDF生成系统。

实际项目开发过程中,需要重点关注中文字体支持、文件流管理、性能优化以及服务器环境兼容问题。结合Spring Boot等后端框架,iText能够很好地满足企业级PDF导出需求。

无论是简单文本文件,还是复杂业务报表、电子合同、财务文档,掌握iText核心API都能够帮助Java开发者更加高效地完成PDF自动化生成任务。