iText怎么生成PDF?

wen python案例 1

本文目录导读:

iText怎么生成PDF?

  1. 前提条件
  2. 方法一:使用 iText 7 生成 PDF(推荐)
  3. 方法二:使用 iText 5 生成 PDF(旧版)
  4. 完整示例:生成带中文、表格和图片的 PDF(iText 7)
  5. 常见问题与参考
  6. 重要提示:iText 的版权问题

使用 iText 生成 PDF 主要分为两个主要版本:iText 5(旧版)和 iText 7(当前主流版本),两者在 API 和包名上有较大差异。

下面是基于 iText 7iText 5 的两种典型生成方式。

前提条件

首先需要在项目中添加 iText 依赖,以 Maven 为例:

iText 7(推荐):

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

iText 5(旧版):

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>

使用 iText 7 生成 PDF(推荐)

iText 7 的 API 更加现代化,采用工厂模式和链式调用。

示例代码:生成一个简单的“Hello World”PDF

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import java.io.FileNotFoundException;
public class GeneratePdfItext7 {
    public static void main(String[] args) throws FileNotFoundException {
        // 1. 创建 PdfWriter,指定输出文件路径
        String dest = "hello_itext7.pdf";
        PdfWriter writer = new PdfWriter(dest);
        // 2. 创建 PdfDocument 对象
        PdfDocument pdfDoc = new PdfDocument(writer);
        // 3. 创建 Document 对象(用于添加内容)
        Document document = new Document(pdfDoc);
        // 4. 添加内容(Paragraph 是段落)
        document.add(new Paragraph("Hello, iText 7!"));
        document.add(new Paragraph("这是用 iText 7 生成的 PDF 文件。"));
        // 5. 关闭文档(必须调用)
        document.close();
        System.out.println("PDF 已生成:" + dest);
    }
}

iText 7 常用功能:

  • 添加表格Table table = new Table(3); + table.addCell("内容");
  • 添加图片Image img = new Image(ImageDataFactory.create("logo.png"));
  • 设置样式Paragraph p = new Paragraph("文本").setFontSize(12).setBold();

使用 iText 5 生成 PDF(旧版)

iText 5 的 API 直接操作 Document 对象进行内容的添加。

示例代码:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class GeneratePdfItext5 {
    public static void main(String[] args) {
        Document document = new Document();
        try {
            // 1. 创建 PdfWriter 并与 Document 关联
            PdfWriter.getInstance(document, new FileOutputStream("hello_itext5.pdf"));
            // 2. 打开文档
            document.open();
            // 3. 添加内容
            document.add(new Paragraph("Hello, iText 5!"));
            document.add(new Paragraph("这是用 iText 5 生成的 PDF。"));
            // 4. 关闭文档
            document.close();
            System.out.println("PDF 已生成");
        } catch (DocumentException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

完整示例:生成带中文、表格和图片的 PDF(iText 7)

很多初学者会遇到中文乱码问题,这里给出一个包含中文字体设置的完整例子。

import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.UnitValue;
import com.itextpdf.io.image.ImageDataFactory;
import java.io.FileNotFoundException;
import java.io.IOException;
public class AdvancedPdfExample {
    public static void main(String[] args) throws IOException {
        String dest = "advanced_example.pdf";
        PdfWriter writer = new PdfWriter(dest);
        PdfDocument pdfDoc = new PdfDocument(writer);
        Document document = new Document(pdfDoc);
        // ---- 处理中文(加载字体后,中文显示正常) ----
        // 方法1:使用系统字体(Windows 常见)
        String fontPath = "C:\\Windows\\Fonts\\simsun.ttc"; // 宋体(注意 ttc 格式)
        // 方法2:使用项目资源中的字体
        // String fontPath = "src/main/resources/fonts/SimSun.ttf";
        // 加载中文字体
        PdfFont chineseFont = PdfFontFactory.createFont(fontPath, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
        // 设置基础字体
        document.setFont(chineseFont);
        // 1. 添加标题
        document.add(new Paragraph("员工信息报表").setFontSize(20).setBold());
        // 2. 添加段落
        document.add(new Paragraph("以下是公司 2024 年第一季度员工名单:"));
        // 3. 添加表格
        float[] columnWidths = {1, 2, 3}; // 列宽比例
        Table table = new Table(UnitValue.createPercentArray(columnWidths));
        table.addCell(new Cell().add(new Paragraph("编号")));
        table.addCell(new Cell().add(new Paragraph("姓名")));
        table.addCell(new Cell().add(new Paragraph("部门")));
        table.addCell("001");
        table.addCell("张三");
        table.addCell("技术部");
        table.addCell("002");
        table.addCell("李四");
        table.addCell("市场部");
        document.add(table);
        // 4. 添加图片
        try {
            Image img = new Image(ImageDataFactory.create("logo.png")); // 图片路径
            img.setWidth(100); // 设置宽度
            document.add(img);
        } catch (Exception e) {
            document.add(new Paragraph("[图片加载失败]"));
        }
        // 关闭文档
        document.close();
        System.out.println("高级示例 PDF 已生成");
    }
}

常见问题与参考

问题 iText 7 解决方案 iText 5 解决方案
中文乱码 必须加载中文字体 PdfFont(如宋体、黑体) 使用 BaseFont 加载中文字体
引入依赖 com.itextpdf:itext7-core com.itextpdf:itextpdf
包名 com.itextpdf.kernel.*, com.itextpdf.layout.* com.itextpdf.text.*
License iText 7 存在 AGPL 版权限制(商业使用需购买许可) 同左

重要提示:iText 的版权问题

iText 是一个采用 AGPL 许可证的开源库,这意味着:

  • 如果你将生成 PDF 的功能集成到商业闭源软件中,且不公开源码,必须购买 iText 的商业许可证。
  • 免费使用仅适用于开源项目个人非商业用途

如果你需要避免版权问题,可以考虑使用 Apache PDFBoxFlying Saucer(基于 iText 但有时也受限),或者使用不限制商业使用的库。


建议从 iText 7 开始学习,因为它更新、设计更清晰,且官方文档更完善,如果遇到具体问题(如表格合并、页眉页脚、加密等),可以进一步询问。

抱歉,评论功能暂时关闭!