代码地址如下:
http://www.demodashi.com/demo/12476.html

一、主要思路

  • 通过itextpdf 生成想要的pdf 文件
  • 通过itextpdf 中 XMLWorkerHelper 组件将html 转化成 pdf 文件
  • 针对中文字符使用itext-asian进行中文字符处理

二、程序实现

1.添加程序依赖

	<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.12</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.12</version>
</dependency>

2.使用itextpdf生成pdf

 	/**
* 绘制一个PDF文件
* @param target 生成地址
*/
public static void draw(String target) throws IOException, DocumentException {
Document document = new Document(PageSize.B5,20,20,30,20);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(target));
document.open(); // 设置文档属性
document.addAuthor("Geek");
document.addCreationDate();
document.addCreator("http://www.demodashi.com/");
document.addTitle("Geek Pdf Demo");
document.addSubject("PDF生成的Demo"); // 设置中文字体和字体样式
BaseFont chineseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(chineseFont, 10, Font.NORMAL);
Font font1 = new Font(chineseFont, 8, Font.NORMAL); // 设置编号
Paragraph paragraph = new Paragraph("编号:A08485743-1", font1);
paragraph.setAlignment(Element.ALIGN_RIGHT);
document.add(paragraph); // 创建表格
PdfPTable pdfTable = new PdfPTable(2);
float[] widths = {0.06f, 0.06f};
pdfTable.setWidths(widths);
//设置表格占PDF文档100%宽度
pdfTable.setWidthPercentage(100);
//水平方向表格控件居中
pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_CENTER); PdfPCell Cell = new PdfPCell();
Cell.setColspan(2);
Cell.setPhrase(new Paragraph("支付宝还款电子回单", font));
Cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
Cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
pdfTable.addCell(Cell); PdfPCell Cell1 = new PdfPCell();
Cell1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
Cell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); Cell1.setPhrase(new Paragraph("支付宝还款电子回单", font));
pdfTable.addCell(Cell1);
Cell1.setPhrase(new Paragraph("11", font));
pdfTable.addCell(Cell1); document.add(pdfTable);
document.close();
writer.close();
}

这里只是一个简单的小例子,复杂的结构,还需要了解下itextpdf的组件.

顺便提一句,在这种情况下也可以尝试pdfbox组件试一下

效果图如下:

3.将html文件模板转化成pdf

   在实际应用中,大部分的合同同时html格式的,但是在一些系统中,需要对合同的法律效力进行认证。这时就会用到电子签章,目前国内的签章系统大多是对PDF文件进行签章。所以很多公司就会使用HTML转PDF的格式。转换的工具很多,但是的确不怎么好用。

现在给大家推荐这种方式,也是我们线上使用的方式,效果很不错。

public static void draw(String src,String target)throws IOException, DocumentException{
Document document = new Document(PageSize.B5,20,20,30,20);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(target));
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(src), null, Charset.forName("UTF-8"),new ChineseFontProvider(6));
document.close();
}

itextpdf是老外们做的插件,所以对中文不是特别友好,好在推出了中文包,但是需要稍作修改


/**
* @Description: 中文处理
* @File: ChineseFontProvider
* @author: Geek
* @date 2018/1/25 上午11:25
*/
public class ChineseFontProvider extends XMLWorkerFontProvider { private int fontSize; public ChineseFontProvider(){
this.fontSize = 0;
} public ChineseFontProvider(int fontSize){
this.fontSize = fontSize;
}
@Override
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("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Font font = null;
if (fontSize != 0){
font = new Font(bf, fontSize, style, color);
} else {
font = new Font(bf, size, style, color);
}
font.setColor(color);
return font;
} public int getFontSize() {
return fontSize;
} public void setFontSize(int fontSize) {
this.fontSize = fontSize;
}
}

效果图如下:

三、程序目录结构



【电子签章】HTML格式合同转化成PDF文件

代码地址如下:
http://www.demodashi.com/demo/12476.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

【电子签章】HTML格式合同转化成PDF文件的更多相关文章

  1. 在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理

    在一些内部OA或者流转的文件,或者给一些客户的报价文件.合同,或者一些医院出示的给保险机构的病历资料等,有时候可能都希望快速的使用电子签章的处理方式来给文件盖上特定的印章,本篇随笔介绍基于Vue&am ...

  2. ofd文件电子签章实现方法

    前言 文档处理一般经过三个环节:流.版.签:流式软件负责编辑,如:office.wps等.版式软件负责文档定型,保证显示样式不跑偏:版式文件格式有两种:pdf.ofd.签章软件负责对版式文档签章.签章 ...

  3. 验证pdf文件的电子章签名

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  4. 基于CA认证(结合文档在线预览)的电子签章解决方案

    分享一个基于CA认证(结合文档在线预览)的电子签章实现思路,恰巧是最近项目中遇到的,欢迎大家一起讨论. 一. 项目背景 在公司业务系统中,按照传统的签章方式,存在以下痛点: 1.成本高,体现在纸质合同 ...

  5. 如何通过WPS 2013 API 将Office(Word、Excel和PPT)文件转PDF文件

    1. 描述 PDF 文件是一种便携文件格式,是由Adobe公司所开发的独特的跨平台文件格式.PDF文件以PostScript语言图象模型为基础,无论在哪种打印机上都可保证精确的颜色和准确的打印效果,即 ...

  6. linux在线预览pdf文件开发思路

    准备:swftools,flexpaper 基本思路: 1,将pdf文件转化成swf文件 2,使用flexpaper预览swf文件 主要代码: 1,在linux中安装swftools.官网下载swft ...

  7. word和.txt文件转html 及pdf文件, 使用poi jsoup itext心得

    word和.txt文件转html 及pdf文件, 使用poi jsoup  itext心得本人第一次写博客,有上面不足的或者需要改正的希望大家指出来,一起学习交流讨论.由于在项目中遇到了这一个问题,在 ...

  8. 如何给pdf文件中的一页添加水印

    如题所述,项目需求.要把一份文件尾部加上签章,首先想到的就是水印. 开始试过了无论是word还是wps所谓的水印其实就是页脚或页眉统一格式,无法单一一个页面操作,要加所有的页面都有. 纵然wps有个功 ...

  9. Itext生成pdf文件

    来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...

随机推荐

  1. 序列(seq)

    序列(seq) 题目描述 给定 N,A,BN,A,B,构造一个长度为 NN 的排列,使得: 排列长度为 N: 最长上升子序列长度为 A: 最长下降子序列长度为 B. 我们有 SPJ,有解任意给出一组, ...

  2. Teleportation(tel)

    Teleportation(tel) 题目描述 Zy大帝拥有n个星球,因为距离非常遥远,所以Zy在他所居住的1号星球和他的军事基地霸中所在的2号星球建造了两个传送门,这样从1号星球到2号星球就只需要2 ...

  3. Fabric 和 Sawtooth 技术分析(下)

    http://blog.talkingdata.com/?p=6172 在前一篇文章(Fabric和Sawtooth技术分析(上))中,我们着重跟大家分享了 Fabric 相关的内容,在本篇文章中,我 ...

  4. 【POJ3667】Hotel(线段树)

    题意:有n个依次编号的元素,要求维护以下两个操作: 1.询问整个数列中是否有长度>=x的连续的一段未被标记的元素,若无输出0,若有输出最小的开始编号ans并将[ans,ans+x-1]标记 2. ...

  5. poi导出excel文件(桃)

    1.基本可以通用的工具类 package com.idcsol.apps.common.excel; import java.io.IOException; import java.io.Output ...

  6. [LeetCode] Sudoku Solver 解数独,递归,回溯

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  7. Eclipse 导入项目乱码问题

    1.编码不对 a.对某文件或某工程更改编码: 鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码(G ...

  8. Facebook为什么使用PHP编程语言?

    当日本计算机科学家松本行弘决定创造一种名叫 Ruby (这种技术支撑了 Twitter.Hulu以及其他许多现代 Web 流行网站) 的程序语言时,他是从 1966 年一部名为 Babel-17 的科 ...

  9. (19)python scrapy框架

    安装scrapy pycharm 建个纯python工程 settings里 环境变量设置 C:\Python27;C:\Python27\Scripts; 下载win32api https://so ...

  10. Codeforces 615D Multipliers (数论)

    题目链接 Multipliers 题意很明确. 很显然答案可以表示成X ^ EXP % MOD 首先我们令N为输入的n个数的乘积.并且设N = (P1 ^ C1) * (P2 ^ C2) * ... ...