您的位置:首页 > Web前端 > HTML

使用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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pdf html