Java 生成 PDF 文档 如此简单

嘿,朋友!在 Java 里实现 PDF 文档生成那可真是个挺有意思的事儿,今儿个就来好好唠唠这个。咱有不少好用的库可以选择,下面就给你详细讲讲其中两个超实用的库,一个是 iText,另一个是 Apache PDFBox。

用 iText 库生成 PDF

思路
  1. 先把 iText 库给引入进来,这就好比给咱的 Java 项目装上了一个生成 PDF 的"神器"。

  2. 创建一个 Document 对象,这个对象就像是一张白纸,咱要在上面绘制 PDF 的内容。

  3. 把这张"白纸"打开,同时设置好字体啥的,就像准备好画笔和颜料。

  4. Document 里添加各种内容,比如段落、表格这些,就像在白纸上画画。

  5. 最后把"白纸"合上,PDF 就生成啦。

代码示例

java 复制代码
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 ITextPdfGenerator {
    public static void main(String[] args) {
        // 创建 Document 对象,就像准备好一张白纸
        Document document = new Document();
        try {
            // 把这张"白纸"和一个文件输出流关联起来,指定生成的 PDF 文件路径
            PdfWriter.getInstance(document, new FileOutputStream("itext_example.pdf"));
            // 打开这张"白纸",准备画画
            document.open();
            // 在"白纸"上添加一个段落内容
            document.add(new Paragraph("嘿,这是用 iText 生成的 PDF 文档哦,是不是很神奇!"));
        } catch (DocumentException | FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 合上"白纸",完成 PDF 生成
            if (document.isOpen()) {
                document.close();
            }
        }
    }
}
代码解释及使用说明
  • 首先咱创建了一个 Document 对象,它就代表了整个 PDF 文档,就像一张白纸。

  • PdfWriter.getInstance 方法把 Document 和一个文件输出流关联起来,这里指定生成的 PDF 文件叫 itext_example.pdf

  • 调用 document.open() 把"白纸"打开,这样就能往里面添加内容啦。

  • document.add(new Paragraph("...")) 往文档里添加一个段落,就像在白纸上写了一句话。

  • 最后在 finally 块里调用 document.close() 把"白纸"合上,确保资源都正确释放。

Maven 依赖
XML 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>

用 Apache PDFBox 库生成 PDF

思路
  1. 先把 Apache PDFBox 库引入进来,这也是一个生成 PDF 的厉害工具。

  2. 创建一个 PDDocument 对象,这个对象就像是一个 PDF 的容器。

  3. 创建一个 PDPage 表示页面,然后把它添加到 PDDocument 里,就像给容器里放了一张纸。

  4. 获取 PDPageContentStream 来绘制内容,就像拿起笔在纸上画画。

  5. 最后关闭 PDPageContentStreamPDDocument,PDF 就生成好啦。

代码示例

java 复制代码
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 PdfBoxPdfGenerator {
    public static void main(String[] args) {
        // 创建 PDDocument 对象,就像准备一个 PDF 容器
        PDDocument document = new PDDocument();
        try {
            // 创建一个页面,就像准备一张纸
            PDPage page = new PDPage();
            // 把这张纸放到 PDF 容器里
            document.addPage(page);

            // 获取页面内容流,就像拿起笔准备画画
            PDPageContentStream contentStream = new PDPageContentStream(document, page);
            // 设置字体和字号,就像选择画笔的粗细和样式
            contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
            // 开始新的一行,准备写字
            contentStream.beginText();
            // 设置文本位置,就像确定在纸上的写字位置
            contentStream.newLineAtOffset(100, 700);
            // 写入文本,在纸上写下内容
            contentStream.showText("嘿,这是用 Apache PDFBox 生成的 PDF 文档,很酷吧!");
            // 结束文本操作,写完了
            contentStream.endText();
            // 把笔放下,关闭内容流
            contentStream.close();

            // 保存这个 PDF 文档
            document.save("pdfbox_example.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 把 PDF 容器关上,完成操作
            try {
                if (document != null) {
                    document.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
代码解释及使用说明
  • 创建 PDDocument 对象,它代表整个 PDF 文档,就像一个容器。

  • 创建 PDPage 表示一个页面,用 document.addPage(page) 把页面添加到文档里,就像把纸放到容器里。

  • PDPageContentStream 来向页面里绘制内容,通过 setFont 方法设置字体和字号,beginText 开始文本操作,newLineAtOffset 设置文本位置,showText 写入文本,endText 结束文本操作。

  • 调用 contentStream.close() 关闭内容流,就像把笔放下。

  • 最后调用 document.save("pdfbox_example.pdf") 保存文档,在 finally 块里关闭 PDDocument,把容器关上。

Maven 依赖
XML 复制代码
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

嘿,朋友,这下你知道怎么用 Java 生成 PDF 文档了吧!这两个库都挺好用的,你可以根据自己的需求选择哦。赶紧动手试试吧!

相关推荐
老白干2 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
圆山猫8 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
城管不管9 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
IT小白杨9 小时前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
豆瓣鸡10 小时前
算法日记 - Day3
java·开发语言·算法
萧瑟余晖10 小时前
Java深入解析篇九之NIO详解
java·网络·nio
The Chosen One98510 小时前
高进度算法模板速记(待完善)
java·前端·算法
极光代码工作室12 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
Leighteen13 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
名字还没想好☜14 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine