java生成pdf方法_详解Java生成PDF文档方法|chu
最近项目需要实现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+freemarkerdocx4j或PDFBox
数据量小docx4jPDFBox
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的流程。步骤描述工具1word -> xml手动
3ftl + obj = xmlfreemarker
4xml -> pdfdocx4j
步骤
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生成PDF文档方法|chu相关推荐
- java 配置文件的路径_详解java配置文件的路径问题
详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...
- java的注解方式_详解Java注解的实现与使用方法
详解Java注解的实现与使用方法 Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性.在如今各种框架及开发中非常常见,特此说明一下. 如何创建一个注解 每一个自定义的注解都由四 ...
- java同步异步调用_详解java 三种调用机制(同步、回调、异步)
1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...
- java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题
先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...
- java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?
线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...
- java注解 源码_详解Java注解教程及自定义注解
详解Java注解教程及自定义注解 更新时间:2016-02-26 11:47:06 作者:佚名 我要评论(0) Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个 ...
- java集合for循环_详解Java中list,set,map的遍历与增强for循环
详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...
- java的自动装箱_详解Java 自动装箱与拆箱的实现原理
详解Java 自动装箱与拆箱的实现原理 发布于 2020-7-4| 复制链接 本篇文章主要介绍了详解Java 自动装箱与拆箱的实现原理,小妖觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小妖 ...
- java中this.getclass()_详解java中this.getClass()和super.getClass()的实例
详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. ...
最新文章
- 数据结构与算法(3)——树(二叉、二叉搜索树)
- mysql+5.5.18+linux+下载,mysql5.7.18+linux安装二进制包与运行
- jQuery(UI)常用插件
- jQuery获取iframe的document对象的方法
- 用原生JavaScript实现无缝轮播
- linux备份mysql需要暂停服务吗_【MySQL运维】线上MySQL数据库停服迁移流程
- 钉钉密聊安不安全 钉钉密聊别人能看到吗
- 自定义字体 (暂不支持中文)
- 消消乐实现下坠_手把手教你如何实现iOS消消乐小游戏Demo
- 台积电5nm来了!谁会是第一个吃螃蟹的人
- 寻找Cisco MARS的替代者
- 使用 Windows 7 VHD启动计算机
- 关于Vue vue-cli安装遇到的一些问题
- Silverlight入门:第五部分 - 整合其它控件
- 斯坦纳树算法概述及习题
- 【数字信号处理】基于DFT的滤波系列4之加窗(含MATLAB代码)
- PCB的板层设计和布线
- [转载]波斯亡国君为何选择大唐避难?
- Cadence Allegro 如何添加Artwork光绘底片文件?
- python画频率统计图
热门文章
- 使用ssh对服务器进行登录
- 计算机基础知识(基础入门小白专属)六
- js计算时间差(相差多少分钟)(时分)
- android service 自动停止,【Android】Service那点事儿
- 09-Scrum过程-评审会(Review Meeting) 反思会(Retrospective Meeting)
- python : folium
- 好用的revit软件:MEP绘制管道风管时,提示不可见如何解决?
- STM32F4设置NVIC中断优先级分组
- 孙源即将分享 DynamicCocoa 实现细节
- 微信小程序CMS系统开发教程开发初级