使用itextpdf 将HTML转成PDF文件,并做电子签章
2017-09-05 14:53
781 查看
一,业务需求:
1,公司APP项目需要给用户展示一些协议,协议上面要有签章。
二,设计思路:
1,将协议html文件 做成freemarker 模板
2,将需要替换的数据 和 模板 输入到txt文件 或者html
3,然后再将txt文件 转成pdf
4,再将pdf 进行电子签章 并上传到服务器 给用户展示
三,项目环境
1,spring boot+freemarker
2,eclipse
四,具体代码
1,freemaker部分
下面是spring boot freemarker
@org.springframework.context.annotation.Configuration
public class FreeMarkerConfig {
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@Bean
public Configuration getFreeMarkerConfiguration(){
return freeMarkerConfigurer.getConfiguration();
}
public void resolveMap(Map<String,Object> model, String templateName,Writer wr){
try {
Template template = this.getFreeMarkerConfiguration().getTemplate(templateName);
template.process(model, wr);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}
@Autowired
private FreeMarkerConfig fmc;
在你使用的类中 注入即可使用
下面组装freemarker 替换参数
paramMap.put("name", "123");
paramMap.put("tils", "234");
paramMap.put("weaponMap ", "");
paramMap.put("weaponMaps ", "");
以上value没有指定 一般都为List<Map<String,Object>> List<Object> 等数据,网上有很多freemaker 循环用法
----------------------------------- freemarker 模板----------------------------------
<!doctype html>
<html lang="en">
<head>
<title>freemakr测试</title>
</head>
<style>
<!--可以将样式直接写在此处 -->
</style>
<body>
<p>你的名字:${name}</p>
<table>
<tr>
<td>第一行</td>
<td>第二行</td>
<td>第三行</td>
<td>第四行</td>
</tr>
<tbody>
<#list weaponMap as col>
<tr>
<td>${col["first"]}</td>
<td>${col["second"]}</td>
<td>${col["three"]}</td>
<td>${col["four"]}</td>
</tr>
</#list>
</tbody>
</table>
<p></p>
<table>
<tr>
<td>第一排</td>
<td>第二排</td>
<td>第三排</td>
</tr>
<tbody>
<#list weaponMaps as col>
<tr>
<td>${col_index + 1}</td><!--序号 相当于 jsp for each varStatus -->
<td>${col["time"]?string('yyyy-MM-dd')}</td><!--时间格式化 -->
<#if col_has_next> <!--判断是否还有下一个 -->
<td>你好</td>
</#if>
<#if !col_has_next> <!--反上-->
<td>你好吗</td>
</#if>
</tr>
</#list>
</tbody>
</table>
</p>
</div>
<p class="date"> 中华:${tils}</p>
</body>
</html>
--------------------------------------end -------------------------------------------------------
2,freemarker 代码
Writer writer = new OutputStreamWriter(new FileOutputStream(classpath + "/freemarker/freemarker.txt"), "UTF-8"); //指定替换后的模板输入路径
fmc.resolveMap(paramMap, "freemarker.html", writer); //调用freemarker 替换模板里面的内容
HtmlToPDF.htmlToPdf(classpath + "/freemarker/freemarker.txt", classpath + "/freemarker", name, classpath + "simhei.ttf");//调用下面代码中的工具类,name 就是PDF 的文件名 自己可以定义
后面的simhei.ttf 为字体文件
3,HTML TO PDF 代码
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
public class HtmlToPDF {
public static void htmlToPdf(String txt,String path,String name,String ttf){
try {
Document document = new Document(PageSize.A4); //A4纸大小 可以选择
PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream(path+"/"+name));
document.open(
4000
);
FileReader reader = new FileReader(txt);
BufferedReader br = new BufferedReader(reader);
String temStr = null;
String inputStr="";
while ((temStr = br.readLine()) != null) {
inputStr +=temStr;
}
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(inputStr.getBytes()), null, new MyFontProvidesr(ttf));
br.close();
reader.close();
document.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("转换完成");
}
}
}
class MyFontProvidesr extends XMLWorkerFontProvider {
private String ttf; //字体文件
public MyFontProvidesr(String ttf) {
super();
this.ttf = ttf;
}
public Font getFont(final String fontname, final String encoding,
final boolean embedded, final float size, final int style,
final BaseColor color) {
BaseFont bf = null;
try {
bf = BaseFont.createFont(ttf, BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font font = new Font(bf, size, style, color);
font.setColor(color);
return font;
}
}
------ 到这里已经生产了PDF 支持中文,接下来调用第三方签章接口,由于对接接口都差不多,按着第三方的demo 就行了,这里就不贴代码了
一,maven坐标:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
1,公司APP项目需要给用户展示一些协议,协议上面要有签章。
二,设计思路:
1,将协议html文件 做成freemarker 模板
2,将需要替换的数据 和 模板 输入到txt文件 或者html
3,然后再将txt文件 转成pdf
4,再将pdf 进行电子签章 并上传到服务器 给用户展示
三,项目环境
1,spring boot+freemarker
2,eclipse
四,具体代码
1,freemaker部分
下面是spring boot freemarker
@org.springframework.context.annotation.Configuration
public class FreeMarkerConfig {
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@Bean
public Configuration getFreeMarkerConfiguration(){
return freeMarkerConfigurer.getConfiguration();
}
public void resolveMap(Map<String,Object> model, String templateName,Writer wr){
try {
Template template = this.getFreeMarkerConfiguration().getTemplate(templateName);
template.process(model, wr);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}
@Autowired
private FreeMarkerConfig fmc;
在你使用的类中 注入即可使用
下面组装freemarker 替换参数
paramMap.put("name", "123");
paramMap.put("tils", "234");
paramMap.put("weaponMap ", "");
paramMap.put("weaponMaps ", "");
以上value没有指定 一般都为List<Map<String,Object>> List<Object> 等数据,网上有很多freemaker 循环用法
----------------------------------- freemarker 模板----------------------------------
<!doctype html>
<html lang="en">
<head>
<title>freemakr测试</title>
</head>
<style>
<!--可以将样式直接写在此处 -->
</style>
<body>
<p>你的名字:${name}</p>
<table>
<tr>
<td>第一行</td>
<td>第二行</td>
<td>第三行</td>
<td>第四行</td>
</tr>
<tbody>
<#list weaponMap as col>
<tr>
<td>${col["first"]}</td>
<td>${col["second"]}</td>
<td>${col["three"]}</td>
<td>${col["four"]}</td>
</tr>
</#list>
</tbody>
</table>
<p></p>
<table>
<tr>
<td>第一排</td>
<td>第二排</td>
<td>第三排</td>
</tr>
<tbody>
<#list weaponMaps as col>
<tr>
<td>${col_index + 1}</td><!--序号 相当于 jsp for each varStatus -->
<td>${col["time"]?string('yyyy-MM-dd')}</td><!--时间格式化 -->
<#if col_has_next> <!--判断是否还有下一个 -->
<td>你好</td>
</#if>
<#if !col_has_next> <!--反上-->
<td>你好吗</td>
</#if>
</tr>
</#list>
</tbody>
</table>
</p>
</div>
<p class="date"> 中华:${tils}</p>
</body>
</html>
--------------------------------------end -------------------------------------------------------
2,freemarker 代码
Writer writer = new OutputStreamWriter(new FileOutputStream(classpath + "/freemarker/freemarker.txt"), "UTF-8"); //指定替换后的模板输入路径
fmc.resolveMap(paramMap, "freemarker.html", writer); //调用freemarker 替换模板里面的内容
HtmlToPDF.htmlToPdf(classpath + "/freemarker/freemarker.txt", classpath + "/freemarker", name, classpath + "simhei.ttf");//调用下面代码中的工具类,name 就是PDF 的文件名 自己可以定义
后面的simhei.ttf 为字体文件
3,HTML TO PDF 代码
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
public class HtmlToPDF {
public static void htmlToPdf(String txt,String path,String name,String ttf){
try {
Document document = new Document(PageSize.A4); //A4纸大小 可以选择
PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream(path+"/"+name));
document.open(
4000
);
FileReader reader = new FileReader(txt);
BufferedReader br = new BufferedReader(reader);
String temStr = null;
String inputStr="";
while ((temStr = br.readLine()) != null) {
inputStr +=temStr;
}
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(inputStr.getBytes()), null, new MyFontProvidesr(ttf));
br.close();
reader.close();
document.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("转换完成");
}
}
}
class MyFontProvidesr extends XMLWorkerFontProvider {
private String ttf; //字体文件
public MyFontProvidesr(String ttf) {
super();
this.ttf = ttf;
}
public Font getFont(final String fontname, final String encoding,
final boolean embedded, final float size, final int style,
final BaseColor color) {
BaseFont bf = null;
try {
bf = BaseFont.createFont(ttf, BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font font = new Font(bf, size, style, color);
font.setColor(color);
return font;
}
}
------ 到这里已经生产了PDF 支持中文,接下来调用第三方签章接口,由于对接接口都差不多,按着第三方的demo 就行了,这里就不贴代码了
一,maven坐标:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
相关文章推荐
- 使用PDF.js如何显示pdf文件的电子签章
- itext使用html标签生成pdf文件
- 使用iText 将html页面转PDF文件(itext+freemarker)
- 使用Itext把html转换成pdf文件
- 使用freemaker和itext从html模板生成pdf文件
- 使用iText操作pdf文件
- 使用itext组件生成PDF文件
- 使用itext将html生成pdf中文换行问题解决方案2
- Itext 生成 pdf文件使用方法:
- 使用abcpdf将html转换成pdf文件
- 使用iText把html转成pdf
- 滴水穿石--Java 生成PDF文件--iText使用之插入图片和中文乱码
- 使用jacob调用Windows的com对象,转换Office文件为pdf、html等
- 使用iText操作pdf文件
- 生成PDF文件-使用iText制作复杂表格
- java使用IText生成PDF格式文件
- 使用HTMLControl类加载PDF文件
- iText – 使用Java将HTML转换为PDF
- 使用iText操作pdf文件
- 滴水穿石--Java 生成PDF文件--iText使用之入门