最近项目需要实现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 文档相关推荐

  1. java xsl转换pdf_Java 生成PDF文档-阿里云开发者社区

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持 iText,生成PDF文档,还支持将XM ...

  2. 手把手教你使用 Java 在线生成 pdf 文档

    一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...

  3. Java iText生成PDF文档

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://mp.csdn.net/mdeditor/83963600# 1.简介 iText是一个非常著名的能够快速产生PDF文件的Java类 ...

  4. java pdf 中文_java-pdf-itext 生成pdf 文档(支持中文字体)

    java-pdf-itext 生成pdf 文档(支持中文字体) itext 版本:2.1.7 package com.demo.preview; import java.io.ByteArrayOut ...

  5. java pdf 首行缩进_java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  6. java生成pdf方法_详解Java生成PDF文档方法|chu

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...

  7. Java生成PDF文档 iText使用PDF模板一

    最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...

  8. java 绘制pdf_Java 在PDF文档中绘制图形

    本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...

  9. java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

最新文章

  1. 使用TCP协议干活,需要校验位吗?
  2. Maven报错Missing artifact jdk.tools:jdk.tools:jar:1.7--转
  3. java base64转bitmap,如何将Bitmap位图与base64字符串相互转换
  4. 19年计算机专硕学硕报名人数,2019年研招报考数据出炉!专硕的报考人数赶超学硕!...
  5. jquery获得当前元素父级元素_jquery怎么获取当前元素的父元素
  6. 结构体第一个成员是结构体,则为父结构体首地址demo(六)
  7. 卡巴斯基2009注册机[纯绿色版本]
  8. 网页英文 错位_浏览器不兼容,网页错位的简单解决方法
  9. 科技创新就要高浓度、高密度
  10. js身份证号码,电话号码验证
  11. 同样是技术出身,深夜看完王兴饭否的190条思考,越想越后怕!
  12. UFPS入门: Unity FPS 教程
  13. Socket中send()函数和rece()函数详解
  14. 泰迪杯数据挖掘挑战赛C题 通用论坛正文提取
  15. TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame
  16. 去除csdn右下角广告
  17. 2022年6月电子学会考级试卷真题解析(含答案和所有文档下载)
  18. Linux切换用户su root 与 su - root 的区别
  19. SCM采购管理系统核心功能模块
  20. 【spock】单测竟然可以如此丝滑

热门文章

  1. 深入浅出JDBC核心技术
  2. 推荐12个优质技术公众号!
  3. 推荐一些坚持原创的公众号
  4. 凉都秘境——六盘水市
  5. mac电脑循环次数多少算新_mac电池循环次数怎么计算?新版mac怎么查看剩余电量?...
  6. 华为全屋智能战略再升级 用三把钥匙打开未来家的大门
  7. 保护小程序,防止反编译:打造不怕反编译的小程序
  8. php天气预报小偷,帮朋友写的PHP天气预报小偷程序
  9. RTX3060是什么级别显卡 RTX3060显卡什么水平
  10. 柠檬浏览器 for linux,柠檬浏览器app官网下载_柠檬浏览器最新官网下载_18183软件下载...