【电子签章】HTML格式合同转化成PDF文件
一、主要思路
- 通过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文件
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权