java实现生成pdf_详解Java生成PDF文档方法

java实现生成pdf_详解Java生成PDF文档方法最近项目需要实现 PDF 下载的功能 由于没有这方面的经验 从网上花了很长时间才找到相关的资料 整理之后 发现有如下几个框架可以实现这个功能 1 开源框架支持 iText 生成 PDF 文档 还支持将 XML Html 文件转化为 PDF 文件 ApachePDFBox 生成 合并 PDF 文档 docx4j 生成 docx pptx xlsx 文档 支持转换为 PDF 格式 比较 iText 开源协议为 AGPL 而其他两个

最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料。整理之后,发现有如下几个框架可以实现这个功能。

1. 开源框架支持

iText,生成PDF文档,还支持将XML、Html文件转化为PDF文件;

Apache PDFBox,生成、合并PDF文档;

docx4j,生成docx、pptx、xlsx文档,支持转换为PDF格式。

比较:

iText开源协议为AGPL,而其他两个框架协议均为Apache License v2.0。

使用PDFBox生成PDF就像画图似的,文字和图像根据页面坐标画上去的,需要根据字数手动换行。

docx4j用来生成docx文档,提供了将WORD文档转换为PDF文档的功能,并不能直接生成PDF文档。

2. 实现方案

格式复杂

格式简单

数据量大

docx4j+freemarker

docx4j或PDFBox

数据量小

docx4j

PDFBox

2.1 纯数据生成PDF

1.docx4j,适用于生成格式简单或格式复杂且数据量小的PDF文档; 2.Apache PDFBox,适用于生成格式简单且数据量小的PDF文档。

1.docx4j

docx4j是一个开源java库,用于创建和操作Microsoft Open XML(Word docx,Powerpoint pptx和Excel xlsx)文件。它类似于Microsoft的OpenXML SDK,但适用于Java。docx4j使用JAXB来创建内存中的对象表示,程序员需要花时间了解JAXB和Open XML文件结构 。

// word对象

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

// 文档主体

MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();

// 换行符

Br br = objectFactory.createBr();

// 段落

P p = objectFactory.createP();

// 段落设置

PPr ppr = objectFactory.createPPr();

// 文字位置

Jc jc = new Jc();

jc.setVal(je);

ppr.setJc(jc);

// 行设置

RPr rpr = objectFactory.createRPr();

// 字体设置

RFonts rFonts = objectFactory.createRFonts();

rFonts.setAscii(“Times New Roman”);

rFonts.setEastAsia(“宋体”);

rpr.setRFonts(rFonts);

// 行

R r = objectFactory.createR();

// 文本

Text text = objectFactory.createText();

text.setValue(“这是一段普通文本”);

r.setRPr(rpr);

r.getContent().add(br);

r.getContent().add(text);

p.getContent().add(r);

p.setPPr(ppr);

// 添加到正文中

mainDocumentPart.addObjecthttp://www.cppcns.com(p);

// 导出

//..

2.Apache PDFBox Apache PDFBox是处理PDF文档的一个开源的Java工具。该项目允许创建新的PDF文档,处理现有文档以及从文档中提取内容的功能。Apache PDFBox还包括几个命令行实用程序。

String formTemplate = “/Users/xiaoming/Desktop/test_pdfbox.pdf”;

// 定义文档对象

PDDocument document = new PDDocument();

// 定义一页,大小A4

PDPage page = new PDPage(PDRectangle.A4);

document.addPage(page);

// 获取字体

PDType0Font font = PDType0Font.load(document, new File(“/Users/xiaoming/work/tmp/simsun.ttf”));

// 定义页面内容流

PDPageContentStream stream = new PDPageContentStream(document, page);

// 设置字体及文字大小

stream.setFont(font, 12);

// 设置画笔颜色

stream.setNonStrokingColor(Color.BLACK);

// 添加矩形

stream.addRect(29, 797, 100, 14);

// 填充矩形

stream.fill();

stream.setNonStrokingColor(Color.BLACK);

// 文本填充开始

stream.beginText();

// 设置行距

stream.setLeading(18f);

// 设置文字位置

stream.newLineAtOffset(30, 800);

// 填充文字

stream.showText(“呵呵”);

// 换行

stream.newLine();

stream.showText(“哈哈”);

stream.newLine();

stream.showText(“嘻嘻”);

// 文本填充结束

stream.endText();

// 关闭流

stream.close();

// 保存

document.save(formTemplate);

// 释放资源

document.close();

2.2 模版+数据生成PDF

FreeMarker+docx4j,适用于生成格式复杂且数据量大的PDF文档

Apache FreeMarker是一个模板引擎,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等)。模板是用FreeMarker模板语言(FTL)编写的,是一种简单的专用语言。

Office2003以上,Word是可以以XML文本格式存储的。先将要生成的PDF转换为Word文档 ,再将其保存为XML文本,通过模版引擎将数据填充到XML文本中,最后再反向转换为PDF文档。简单来说就是PDF->Word->XML->Word->PDF的流程。

步骤

描述

工具

1

word -> xml

手动

2

xml -> ftl

手动,参考《XML格式Word文档常用标签介绍》

3

ftl + obj = xml

freemarker

4

xml -> pdf

docx4j

步骤

1 把pdf文档对应的word(docx)制作出来

2e1c92b6795ed3ae5f228c7fbc24cf77.png

2 把word文档另存为xml文件

b16038d28fc22f2d674cbadcf5bcb882.png

3 将xml文件制作为freemarker模版(ftl)文件

28a841e63701c4cd80e1e9f9a82a7d15.png

4 将数据和ftl文件组装为xml文本

Map map = new HashMap<>();

map.put(“name”, “小明”);

map.put(“address”, “北京市朝阳区”);

map.put(“email”, “”);

StringWriter stringWriter = new StringWriter();

BufferedWriter writer = new BufferedWriter(stringWriter);

template.process(map, writer);

String xmlStr = stringWriter.toString();

5 使用docx4j将xml文本加载为word文档对象

ByteArrayInputStream in = new ByteArrayInputStream(xmlStr.getBytes());

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(in);

6 使用docx4j将word文档转存为pdf文档

String outputfilepath = “/Users/xiaoming/简历.pdf”;

FileOutputStream os = new FileOutputStream(new File(outputFilePath));

FOSettings foSettings = Docx4J.createFOSettings();

foSettings.setWmlPackage(wordMLPackage);

Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);

// Docx4J.toPDF(wordMLPackage, new FileOutputStream(new File(outputfilepath)));

2.3 Word转PDF

docx4j

WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(new File(“abc.docx”));

Mapper fontMapper = new IdentityPlusMapper();

// fontMapper.put(“华文行楷”, PhysicalFonts.get(“STXingkai”));

mlPackage.setFontMapper(fontMapper);

Out

2.4 合并多个PDF

Apache PDFBox,将多个PDF文档合并

String folderName = “/Users/xiaoming/pdfs”;

String destP编程客栈nt compare(String o1, String o2) {

return o1.compareTo(o2);

}

});

for (int i = 0; i < filesInFolder.length; i++) {

mergBXPoJBFyEePdf.addSource(folderName + File.separator + filesInFolder[i]);

}

mergePdf.setDestinationFileName(destPath);

mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());

示例代码

github.com/brandonbai/…

以上所述是小编给大家介绍的Java生成PDF文档方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

本文标题: 详解Java生成PDF文档方法

本文地址: http://www.cppcns.com/ruanjian/java/257514.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227754.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:37
下一篇 2026年3月16日 下午8:37


相关推荐

  • informix最新版本_sql权威指南 pdf

    informix最新版本_sql权威指南 pdf 最让人兴奋的是《informix实用全书》,PDF清晰版091229InformixV11.50.xC6        http://cid-62f8b4120839d1a2.skyd…Informix/2009-12-29InformixV11.50.TC6Windows32bitEnglish(CZ6QHEN)InformixV1…

    2022年10月20日
    5
  • Java入门基础学习总结[通俗易懂]

    Java入门基础学习总结[通俗易懂]基础(Basics)打开CMD的方式:1.开始+系统+命令提示符2.Win键+R输入cmd打开控制台(推荐使用)3.在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口4.资源管理器的地址栏前面加上cmd一个空格路径常用的Dos命令#盘符切换D:冒号需用英文模式#查看当前目录下的所有文件dir#切换目录cdchangedirectorycd.. 返回上级目录#清理屏幕cls(clearscreen)#退出终端exit#查看电脑的i

    2022年7月8日
    26
  • 建立友好城市有什么用_中国国际友好城市联合会

    建立友好城市有什么用_中国国际友好城市联合会原题连接Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。输入格式第1行,一个整数N,表示城市数。第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和

    2022年8月8日
    6
  • pycharm中unresolved reference怎么解决(配置问题)

    pycharm中unresolved reference怎么解决(配置问题)unresolvedre 怎么解决解决方法 进入 PyCharm gt Settings gt Build Excution Deployment gt Console gt PythonConsol 勾选上 Addsourceroo 进入 PyCharm gt Settings gt Project gt ProjectStruc 通过选中某一目录右键添加 sources 点击 Apply 和 OK 即可

    2026年3月17日
    1
  • 什么是多态?如何实现?只看这一篇就够了

    什么是多态?如何实现?只看这一篇就够了1 多态的概念 1 1 概念多态的概念 通俗来说 就是多种形态 具体点就是去完成某个行为 当不同的对象去完成时会产生出不同的状态 2 多态的定义及实现 2 1 多态的构成条件多态是在不同继承关系的类对象 去调用同一函数 产生了不同的行为 那么在继承中要构成多态还有两个条件 必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数 且派生类必须对基类的虚函数进行重写 2 2

    2026年3月19日
    1
  • 【超分辨】SRGAN详解及其pytorch代码解释

    【超分辨】SRGAN详解及其pytorch代码解释SRGAN 是一个超分辨网络 利用生成对抗网络的方法实现图片的超分辨 本文解释了 SRGAN 原理 同时通过 pytorch 代码实现

    2025年10月14日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号