Java使用itext pdf生成PDF文档

Java使用itext pdf生成PDF文档

Java使用itextpdf生成PDF文档

在日常开发中,我们经常需要生成各种类型的文档,其中PDF是最常用的一种格式。本文将介绍如何使用Java和iText库生成包含中文内容的PDF文档,并通过一个具体的示例来展示整个过程。

1. 引言

PDF(Portable Document Format)是一种广泛使用的文件格式,它能够保持文档的原始格式和布局,适用于跨平台共享和打印。在Java中,我们可以使用iText库来创建和操作PDF文档。本文将展示如何使用iText生成包含中文内容的PDF文档,并确保中文字符正确显示。

2. 准备工作

2.1 添加依赖

首先,我们需要在项目中添加iText库的依赖。如果你使用的是Maven项目,可以在pom.xml文件中添加以下依赖:

Xml深色版本

java 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>

此外,为了方便处理文件路径和流操作,我们还可以引入Hutool库:

Xml深色版本

java 复制代码
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.31</version>
</dependency>

2.2 准备字体文件

由于PDF默认不支持中文字符,我们需要准备一个支持中文的字体文件,例如Dengl.ttf。将该字体文件放置在项目的合适位置,以便后续加载使用。

3. 代码实现

3.1 创建PDF文档

以下是生成包含中文内容的PDF文档的完整代码示例:

Java深色版本

复制代码
package com.util.pdf;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class AstartPDFExport {
    public static void main(String[] args) {
        Document document = new Document();
        try {
            PdfWriter.getInstance(document, Files.newOutputStream(Paths.get("xxxx.pdf")));
            document.open();

            // 加载中文字体
            BaseFont bf = BaseFont.createFont("Font/Dengl.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            Font font = new Font(bf, 9);

            // 添加标题
            Font boldFont = new Font(bf, 12, Font.BOLD);
            Paragraph title = new Paragraph("一个小浪吴呀", boldFont);
            title.setAlignment(Element.ALIGN_CENTER);
            document.add(title);

            // 添加日期
            Paragraph date = new Paragraph("2025-06-18", font);
            date.setAlignment(Element.ALIGN_RIGHT);
            date.setSpacingAfter(10);
            document.add(date);

            // 创建表格
            PdfPTable table = new PdfPTable(2); // 表格有两列
            table.setWidthPercentage(100);
            float[] columnWidths = {30f, 70f}; // 第一列占 30%,第二列占 70%
            table.setWidths(columnWidths);
            addCell(table, "一个小浪吴呀", "一个小浪吴呀", font);

            // 付款明细表格
            PdfPTable detailsTable = new PdfPTable(5); // 五列
            detailsTable.setWidthPercentage(100);
            float[] detailColumnWidths = getColumnWidths(5, 30f);
            detailsTable.setWidths(detailColumnWidths);

            // 表头
            String[] headers = {" 明细", " 商品", " 价格", " 数量", " 备注"};
            int minimumHeight = 20;
            for (String header : headers) {
                PdfPCell headerCell = new PdfPCell(new Paragraph(header, font));
                headerCell.setMinimumHeight(minimumHeight);
                headerCell.setHorizontalAlignment(Element.ALIGN_LEFT);
                detailsTable.addCell(headerCell);
            }

            // 数据行
            PdfPCell cell;
            cell = new PdfPCell(new Paragraph(" 一个小浪吴呀", font));
            cell.setHorizontalAlignment(Element.ALIGN_LEFT);
            cell.setMinimumHeight(minimumHeight);
            detailsTable.addCell(cell);

            document.add(detailsTable);

            // 收款账户信息
            Paragraph accountInfo = new Paragraph("AAAA 一个小浪吴呀\n" +
                    "BBBB 一个小浪吴呀\n" +
                    "CCCC 一个小浪吴呀\n" +
                    "DDDD 一个小浪吴呀\n" +
                    "EEEE 一个小浪吴呀\n" +
                    "FFFF 一个小浪吴呀", font);
            document.add(accountInfo);

            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void addCell(PdfPTable table, String label, String value, Font font) {
        PdfPCell cell = new PdfPCell(new Paragraph(label, font));
        cell.setPadding(5);
        table.addCell(cell);

        cell = new PdfPCell(new Paragraph(value, font));
        cell.setPadding(5);
        table.addCell(cell);
    }

    public static float[] getColumnWidths(int totalColumns, float firstColumnWidthPercent) {
        if (totalColumns < 1) throw new IllegalArgumentException("至少需要一列");

        float[] widths = new float[totalColumns];
        widths[0] = firstColumnWidthPercent;

        float remainingWidth = 100 - firstColumnWidthPercent;
        float otherColumnWidth = remainingWidth / (totalColumns - 1);

        for (int i = 1; i < totalColumns; i++) {
            widths[i] = otherColumnWidth;
        }

        return widths;
    }
}

3.2 运行结果

运行上述代码后,将会生成一个名为xxxx.pdf的PDF文件。以下是生成的PDF文件的效果图:

4. 总结

本文介绍了如何使用Java和iText库生成包含中文内容的PDF文档。通过加载合适的中文字体文件,我们可以确保中文字符在PDF中正确显示。希望本文对你有所帮助,如果你有任何问题或建议,请随时留言交流。

相关推荐
一次旅行3 分钟前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能
pjj198544 分钟前
机器学习-NumPy2
人工智能·python·机器学习
OPEN-F16 分钟前
Python进阶教程:单元测试与代码质量
开发语言·python·单元测试
野生技术架构师19 分钟前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
AI人工智能+电脑小能手27 分钟前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
奥莱维30 分钟前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
Logintern0937 分钟前
装饰器和洋葱模式的区分
开发语言·python·架构
工业一体机老司机39 分钟前
Linux工业一体机自启动服务配置:systemd服务单元编写与开机优化实战
java·linux·服务器
weixin_538601971 小时前
智能体测开Day56
java
呆呆敲代码的小Y1 小时前
10 分钟搞懂 cua:开源 AI 操作电脑基础设施,附 Python 沙箱与 Agent 上手代码
人工智能·python·开源·ai agent·awesome·llm应用·cua