1:jar包
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.8</version>
</dependency>
2:测试类
package test;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
public class Tes {
public static String htmlFile = "D:\\tmp\\q\\template.html";
public static String pdfFile = "D:\\tmp\\q\\template.pdf";
public void before() {
File pdf = new File(pdfFile);
if(pdf.exists())
pdf.delete();
}
//public void htmp2pdf(){
public static void main(String[] args) {
Document document = null;
PdfWriter pdfWriter = null;
try {
document = new Document(PageSize.A4);
pdfWriter = PdfWriter.getInstance(document,
new FileOutputStream(pdfFile));
document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
//读取模板文件并且写入String中
InputStream in = new FileInputStream(htmlFile);
InputStreamReader isr = new InputStreamReader(in, "utf-8");
BufferedReader brd = new BufferedReader(isr);
StringBuffer sbf = new StringBuffer();
String line = "";
while((line=brd.readLine())!=null) {
sbf.append(line);
}
String htmlTemplete = sbf.toString();
//此处替换特定字符或者拼接html代码的处理
//平台收费说明
htmlTemplete = htmlTemplete.replaceAll("###NAME###", "工会");
htmlTemplete = htmlTemplete.replaceAll("###YEARS###", "2019");
htmlTemplete = htmlTemplete.replaceAll("###ACTIVITY_NAME###", "额度发放内测0914");
htmlTemplete = htmlTemplete.replaceAll("###CONSUMPTION_AMOUNT###", "500");
htmlTemplete = htmlTemplete.replaceAll("###POUNDAGE_AMOUNT###", "12.5");
htmlTemplete = htmlTemplete.replaceAll("###YYYYMMDD###", "2019年9月5日");
//AmountConvertUtil.amount2CNYUnit(new BigDecimal(paymentAmount));
//模板不支持svg格式图片
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(htmlTemplete.getBytes("UTF-8")), Charset.forName("utf8"), new AsianFontProvider());
System.out.println("complete");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(document!=null)
//如果不关闭则会生成空的破损的pdf
document.close();
}
}
/*public static void main(String[] args) {
String q = "512.62";
BigDecimal bds=new BigDecimal("0.025");
BigDecimal bd=new BigDecimal(q);
System.out.println(bd);
BigDecimal multiply = bd.multiply(bds);
System.out.println(multiply);
DecimalFormat df = new DecimalFormat("0.00");
//手续费
String result = df.format(multiply);
System.out.println(result);
}*/
}
3:引用
package com.unicom.groupmall.manager.util;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
public class AsianFontProvider extends XMLWorkerFontProvider {/*
public AsianFontProvider(){
super(null, null);
}
@Override
public Font getFont(final String fontname, String encoding, float size, final int style) {
String fntname = fontname;
if (fntname == null) {
fntname = "/app/gmfront/groupmall2.0/groupmall-manager/simkai.ttf";
//fntname = "宋体";
}
if (size == 0) {
size = 1;
}
return super.getFont(fntname, encoding, size, style);
}
*/
@Override
public Font getFont(final String fontname, String encoding, float size, final int style) {
try {
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
return new Font(bfChinese, size, style);
} catch (Exception e) {
}
return super.getFont(fontname, encoding, size, style);
}
}
4:模版 template.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>说明函</title>
<style type="text/css">
p {letter-spacing: 3px}
p.big {line-height: 200%}
p {font-size: 14pt}
p.pt {font-size: 15pt}
</style>
</head>
<body>
<div class="text" style=" text-align:center;">
<font face="宋体">
<h4><p class="pt">说明函</p></h4>
</font>
</div>
<div>
<font face="宋体"><u><p><br/>###NAME###:<br/><br/></p></u></font>
<font face="宋体">
<p class="big">
自2017年以来,安达市自2017年以来,安达市自2017年以来,安达市自2017年以来,安达市自2017年以来,安达市自2017年以来,安达市
</P>
</font>
<br/>
<font face="宋体">
<p class="big">
安达市自2017年以来安达市自2017年以来安达市自2017年以来安达市自2017年以来安达市自2017年以来安达市自2017年以来安达市自2017年以来
</P>
</font>
<br/>
<font face="宋体">
<p class="big">
在###ACTIVITY_NAME###中,<u><p>###NAME###</p></u>安达市自2017年以来<u><p>###CONSUMPTION_AMOUNT###元</p></u>。安达市自2017年以来安达市自2017年以来安达市自2017年以来=<u><p>###NAME###</p></u>安达市自2017年以来*费率(2.5%)。因此,本次信息技术服务费金额为<u><p>###CONSUMPTION_AMOUNT###</p></u>元*2.5%=<u><p>###POUNDAGE_AMOUNT###元</p></u>。
</P>
</font>
<br/>
<font face="宋体">
<h4><p class="big"><br/> 收款账户信息:<br/></p></h4>
<p class="big"> 安达市自2017年以来<br/></p>
<p class="big"> 安达市自2017年以来<br/></p>
<p class="big"> 安达市自2017年以来<br/><br/><br/></p>
</font>
</div>
<div class="text" style=" text-align:right;">
<p class="big">安达市自2017年以来</p>
<p>###YYYYMMDD###</p>
</div>
</body>
</html>