Java生成PDF文件

iText, PDFBox等库的使用指南与实战代码

引言

在企业应用开发中,经常需要将数据导出为PDF格式的文档,如生成报表、合同、发票等。Java作为企业级开发的主流语言,提供了多种生成PDF文件的解决方案。本专题将详细介绍如何使用Java生成PDF文件,帮助开发者快速掌握相关技术。

我们将重点介绍两个最流行的开源库:iTextApache PDFBox,并通过实际代码示例展示它们的使用方法。

iText 库

iText 是一个功能强大的Java库,用于创建和操作PDF文档。它支持复杂的布局、表格、图像、字体嵌入等功能。

添加依赖

如果你使用Maven,添加以下依赖:

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

基本使用示例

以下是一个使用iText生成简单PDF文件的示例:

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.FileOutputStream;
import java.io.IOException;

public class PdfGenerator {
    public static void main(String[] args) {
        Document document = new Document();
        try {
            PdfWriter.getInstance(document, new FileOutputStream("hello.pdf"));
            document.open();
            document.add(new Paragraph("Hello, this is a PDF generated with iText!"));
            document.add(new Paragraph("当前时间: " + new java.util.Date()));
            System.out.println("PDF文件已生成: hello.pdf");
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        } finally {
            document.close();
        }
    }
}

Apache PDFBox

Apache PDFBox 是另一个流行的开源Java工具,用于处理PDF文档。它既可以创建新的PDF,也可以读取和修改现有的PDF文件。

添加依赖

Maven依赖配置:

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

基本使用示例

使用PDFBox生成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;

import java.io.IOException;

public class PdfBoxExample {
    public static void main(String[] args) {
        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage();
            document.addPage(page);

            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                contentStream.beginText();
                contentStream.setFont(PDType1Font.HELVETICA_BOLD, 18);
                contentStream.newLineAtOffset(100, 700);
                contentStream.showText("Hello from Apache PDFBox!");
                contentStream.newLineAtOffset(0, -25);
                contentStream.setFont(PDType1Font.COURIER, 14);
                contentStream.showText("Generated on: " + new java.util.Date());
                contentStream.endText();
            }

            document.save("pdfbox_hello.pdf");
            System.out.println("PDF文件已生成: pdfbox_hello.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

选择建议

  • iText:功能更丰富,API设计更直观,适合需要复杂布局和样式的场景。但要注意版本许可问题(iText 7之后采用AGPL)。
  • PDFBox:Apache许可证,更宽松,适合需要读取/修改现有PDF的场景。API相对底层一些。
  • 对于简单的PDF生成需求,两者都能胜任。建议根据项目许可要求和具体功能需求进行选择。

常见问题

中文乱码怎么办?

需要嵌入中文字体,例如:

// iText中使用中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(bf, 12);
document.add(new Paragraph("你好,世界!", font));

如何添加表格?

iText提供了PdfPTable类,PDFBox需要手动绘制表格线和填充内容。

三国志战棋版卢植 - 技能解析与阵容搭配攻略 Word如何添加图片 - 详细图文教程 Word文档怎么设置页码 - 图文详细教程 SolidWorks文件转换器 - 免费在线转换CAD模型与工程图 两个Word文档之间切换快捷键 - 提高办公效率的实用技巧 三国志12加强版 - 经典策略游戏重制专题页 Word文档怎么弄拐弯的线箭头?详细图文教程 女儿三国志 - 三国策略战棋手游官网 Word表格中文字间距调整完全指南 - 排版技巧与实用教程 Word文档自动保存后去哪了?找回丢失文件的完整指南 三国志7爵位一览 - 游戏爵位全解析 Word文档如何在指定页添加页码 - 详细图文教程 三国志荀彧传 - 汉末王佐之才的传奇人生 Word文件损坏打不开怎么修复?多种方法轻松解决 spacedesk中文官网 | 免费无线扩展屏幕解决方案 什么软件能打开dat文件 - 全面解析DAT文件打开方法 三国志战略版曹昂武将专题 - 属性、战法与阵容搭配全解析 Word文档怎么设置中文版式?详细教程与技巧 Word文档密钥设置指南 - 保护您的文档安全 WPS转换Office文件格式 - 轻松实现文档兼容 手机如何编辑Word文档 - 移动办公实用指南 三国志11寿春堵路战术详解 - 经典战棋策略分析 spacedesk安卓最新版下载 - 免费无线扩展屏幕解决方案 如何将Word文字处理成一排显示 - 实用排版技巧教程 三国志11戟神专题页 - 经典策略战棋深度解析 三国志11图鉴 - 武将战法兵种宝物全收录 三国志11民国风云MOD专题 - 经典策略游戏的民国新篇 怎么做Word文档 - 零基础入门教程 三国志7秘籍大全 - 全面攻略与修改技巧汇总 图片怎么转为Word文档 - 图文转换方法全解析 Word拒绝审阅者某某的修订 - 完整操作指南 少年三国志怎么玩 - 新手入门与核心玩法详解 vsd文件打开方法 - 全面指南与实用工具推荐 三国志11魅力 - 回顾经典策略游戏的独特风采 Word撤销快捷键 - 快速掌握Ctrl+Z高效编辑技巧 三国志衣带诏记载专题 | 汉献帝密诏与董承诛曹事件解析 三国志11存档下载中心 - 免费全存档资源分享 三国志10徐庶专题 - 武将介绍与游戏攻略 Word表格中文字被吞?原因分析与解决方法大全 Word文档怎么分页不断行?实用技巧全解析 Word莫名其妙出现蓝色下划线?原因与解决方法大全 三国志人物专题:西晋名将王濬传略 Word文档怎么设置行距?详细图文教程 Word文档怎么关闭修订模式?详细步骤图解教程 Word文档数字加圆圈:详细操作方法与技巧 三国朱据专题 - 生平事迹与历史评价 | 三国人物研究 Word左上角没有文件标识?一招教你恢复显示 - 文档办公技巧专题 Word打字上不去咋回事?原因分析与解决方法大全 Word去掉红色波浪线方法 - 完整图文教程 三国普卢 - 探索历史传奇人物 Word文档总是空一行?快速解决方法大全 Word文字下划线怎么取消?详细操作方法教程 三国杨奉专题 - 生平事迹与历史评价 什么软件可以翻译PDF文件?推荐多款实用PDF翻译工具 Word文档如何知道字数 - 详细操作指南 spacedesk怎么连接 - 图文详细教程 | 手把手教你实现多屏协同 百花三国志 - 策略战棋手游官网 Word怎么编辑不了文字?常见原因与解决方法大全 三国志11孙吴势力全解析 - 君主、名将与战略指南 Word文档是什么意思?一文读懂Word文档基本概念 三国志9宝物一览 - 全宝物图鉴与获取指南 Word文档右上角关闭键不见了?快速解决方法大全 三国志11鬼门倾城MOD专题页 - 经典策略游戏新体验 三国志后主传 - 蜀汉后主刘禅的传奇一生 | 历史人物专题 Word增加页码完全指南:图文教程与实用技巧 怎么把视频弄到Word文档 - 详细图文教程 三国胡质专题 - 曹魏名臣生平与历史贡献 Word文档怎么复制整页?详细操作方法教程 DWG格式文件完全指南 - 打开、编辑与转换DWG图纸 Word删减技巧:轻松减少文档字数与文件大小 如何打开PSD文件?5种简单方法详解 Word文档排版格式设置指南 - 标准排版技巧与操作步骤 spacedesk调参数完全指南 - 提升无线投屏体验的实用技巧 三国杨秋 - 生平事迹与历史评价专题 Word文档正规格式与字体设置完全指南 Word文档怎么去掉 - 轻松删除页眉页脚水印空白页 Word文本框不会跳到下一页的解决方法 - 排版技巧教程 Word文档怎么生成二维码?手把手教你快速制作 Word文字波浪线怎么删除?一文解决拼写和语法错误提示线 三国志11烧死君主:经典策略游戏的趣味玩法详解 Word文件无法删除?一文解决所有常见问题 Word给文字加阴影:详细步骤与技巧教程 Markdown转Word文档 | 简单高效的转换方法指南 Word文档横线怎么删除?详细图文教程 Word文字怎么往左调一点?多种方法轻松实现左移调整 Word批量替换文字 - 高效办公技巧专题 Word表格文档字间距怎么调?详细图文教程 三国志2三圣剑专题 - 经典策略游戏中的神兵利器 三国左奕 - 经典战棋策略手游专题页 三国志玉玺传原文 - 在线阅读与经典赏析 三国志11阵型作用完全解析 - 阵型效果与实战技巧 三国志12吧 - 经典策略游戏专题站 Word如何把修改关闭?详细教程与解决方法 Word文档转Excel:简单实用的转换方法大全 三国志历代谁最火?深度解析最受欢迎的三国志系列作品 Word文档如何去重?5种简单方法快速删除重复内容 Word文档自动编号怎么设置?详细图文教程 DXF和DWG文件区别详解 - 了解两种常见CAD格式的不同 Word文字替换不了?常见原因与解决方法全解析 三国志程昱原文 - 陈寿《三国志》程昱传记全文