java pdf_Java 生成 PDF 文档
最近项目需要实现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.addObject(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
手动
3
ftl + obj = xml
freemarker
4
xml -> pdf
docx4j
步骤
1 把pdf文档对应的word(docx)制作出来
2 把word文档另存为xml文件
3 将xml文件制作为freemarker模版(ftl)文件
4 将数据和ftl文件组装为xml文本
Map map = new HashMap<>();
map.put("name", "小明");
map.put("address", "北京市朝阳区");
map.put("email", "xiaoming@abc.com");
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);
OutputStream os = new java.io.FileOutputStream("abc.pdf");
FOSettings foSettings = Docx4J.createFOSettings();
foSettings.setWmlPackage(mlPackage);
Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
复制代码
2.4 合并多个PDF
Apache PDFBox,将多个PDF文档合并
String folderName = "/Users/xiaoming/pdfs";
String destPath = "/Users/xiaoming/all.pdf";
PDFMergerUtility mergePdf = new PDFMergerUtility();
String[] filesInFolder = getFiles(folderName);
Arrays.sort(filesInFolder, new Comparator() {
@Override
public int compare(String o1, String o2){
return o1.compareTo(o2);
}
});
for (int i = 0; i < filesInFolder.length; i++) {
mergePdf.addSource(folderName + File.separator + filesInFolder[i]);
}
mergePdf.setDestinationFileName(destPath);
mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
复制代码
示例代码
java pdf_Java 生成 PDF 文档相关推荐
- java xsl转换pdf_Java 生成PDF文档-阿里云开发者社区
最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持 iText,生成PDF文档,还支持将XM ...
- 手把手教你使用 Java 在线生成 pdf 文档
一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...
- Java iText生成PDF文档
版权声明:本文为博主原创文章,未经博主允许不得转载.https://mp.csdn.net/mdeditor/83963600# 1.简介 iText是一个非常著名的能够快速产生PDF文件的Java类 ...
- java pdf 中文_java-pdf-itext 生成pdf 文档(支持中文字体)
java-pdf-itext 生成pdf 文档(支持中文字体) itext 版本:2.1.7 package com.demo.preview; import java.io.ByteArrayOut ...
- java pdf 首行缩进_java使用iText生成pdf文档的对齐方式
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
- java生成pdf方法_详解Java生成PDF文档方法|chu
最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...
- Java生成PDF文档 iText使用PDF模板一
最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...
- java 绘制pdf_Java 在PDF文档中绘制图形
本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...
- java使用iText生成pdf文档的对齐方式
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
最新文章
- 使用TCP协议干活,需要校验位吗?
- Maven报错Missing artifact jdk.tools:jdk.tools:jar:1.7--转
- java base64转bitmap,如何将Bitmap位图与base64字符串相互转换
- 19年计算机专硕学硕报名人数,2019年研招报考数据出炉!专硕的报考人数赶超学硕!...
- jquery获得当前元素父级元素_jquery怎么获取当前元素的父元素
- 结构体第一个成员是结构体,则为父结构体首地址demo(六)
- 卡巴斯基2009注册机[纯绿色版本]
- 网页英文 错位_浏览器不兼容,网页错位的简单解决方法
- 科技创新就要高浓度、高密度
- js身份证号码,电话号码验证
- 同样是技术出身,深夜看完王兴饭否的190条思考,越想越后怕!
- UFPS入门: Unity FPS 教程
- Socket中send()函数和rece()函数详解
- 泰迪杯数据挖掘挑战赛C题 通用论坛正文提取
- TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame
- 去除csdn右下角广告
- 2022年6月电子学会考级试卷真题解析(含答案和所有文档下载)
- Linux切换用户su root 与 su - root 的区别
- SCM采购管理系统核心功能模块
- 【spock】单测竟然可以如此丝滑
热门文章
- 深入浅出JDBC核心技术
- 推荐12个优质技术公众号!
- 推荐一些坚持原创的公众号
- 凉都秘境——六盘水市
- mac电脑循环次数多少算新_mac电池循环次数怎么计算?新版mac怎么查看剩余电量?...
- 华为全屋智能战略再升级 用三把钥匙打开未来家的大门
- 保护小程序,防止反编译:打造不怕反编译的小程序
- php天气预报小偷,帮朋友写的PHP天气预报小偷程序
- RTX3060是什么级别显卡 RTX3060显卡什么水平
- 柠檬浏览器 for linux,柠檬浏览器app官网下载_柠檬浏览器最新官网下载_18183软件下载...