[h2]1、准备jar包[/h2]itextpdf-5.5.13.jar、itext-asian-5.2.0.jar、xmlworker-5.5.13.jar
其中itextpdf-5.5.13.jar为pdf文件包,itext-asian-5.2.0.jar为语言包,若不引进该jar包会中文乱码,xmlworker-5.5.13.jar为html文件转换包
jar包链接: https://pan.baidu.com/s/1-S_oVsckHevYRGcAWDYkMg 提取码: bkxd 复制这段内容后打开百度网盘手机App,操作更方便哦
[h2][/h2][h2]2、准备html文件[/h2]生成pdf文件对于模板html文件要求较高,html文件中所有标签必须成对出现,如等,同时html文件头部需替换成
,否则会造成pdf文件生成失败。
若只有Word模板文件,可以通过相关网站转成html文件再进行上述处理。
Word在线转html传送门:http://www.docpe.com/word/word-to-html.aspx
[h2]3、Html转pdf[/h2]Html2Pdf工具类转换pdf
package test.pdf;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
publicclass Html2Pdf {
@SuppressWarnings("resource")
publicstaticvoid main(String[] args) {
// html模板文件路径
String htmlUrl = "D:/测试文件/pdf/contract.html";
Document document = null;
PdfWriter pdfWriter = null;
try {
document = new Document(PageSize.LETTER);
// 创建pdf输出流
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("D:\\测试文件\\pdf\\testpdf20190629.pdf"));
// 打开pdf文件
document.open();
// 设置文件创建人、作者等等信息,可按照要求设置
document.addAuthor("test");
document.addCreator("test");
document.addSubject("test");
document.addCreationDate();
document.addTitle("XHTML toPDF");
// 读取html模板内容
InputStream in = new FileInputStream(htmlUrl);
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();
// 转换占位符
htmlTemplete = htmlTemplete.replaceAll("ownerName", "html转pdf测试");
// 准备将html文件转换为pdf,AsianFontProvider为字体设置类,设置中文字体,否则中文无法展示
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(htmlTemplete.getBytes("UTF-8")),Charset.forName("utf8"),new AsianFontProvider());
// 添加图片信息,可设置绝对位置以及图片的缩略大小,此处添加图片是另起一页进行添加,暂时无法添加到html文件的固定位置,若有相关需要可以看下篇文章,利用pdf模板生成pdf文件
Image image = Image.getInstance("D:\\测试文件\\pic\\timg.jpg");
image.setAbsolutePosition(10, 60);
image.scalePercent(30);
document.add(image);
// 关闭文件
document.close();
System.out.println("Done");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document != null)
// 如果不关闭则会生成空的破损的pdf
document.close();
}
}
}
AsianFontProvider类,用于语言转换
package test.pdf;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
publicclass AsianFontProvider extends XMLWorkerFontProvider{
public Font getFont(final String fontname, final String encoding,
finalbooleanembedded, finalfloatsize, finalintstyle,
final BaseColor color) {
BaseFont bf = null;
try {
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font font = new Font(bf, size, style, color);
font.setColor(color);
returnfont;
}
}
[h2]总结[/h2]优点:
1、 可以在html中灵活设置模板文件的字体大小、间距、字体颜色等等html支持的样式标签
2、 修改模板文件方便快捷,若需修改或添加相关内容,只需要做迭代增加即可,无需重新设置原先的模板内容,这点比pdf模板生成pdf好的多,下篇具体讲
3、 一般生成pdf文件功能中,前端已经有相关html文件,无需自己编写html(但还是要注意html文件格式规范)。
4、 好吧,暂时还没想到
缺点
1、 该方法对html文件格式规范较高,格式错误无法转换pdf
2、 如果pdf中有图片需要替换,那这部分功能比较难实现,html模板方法中,图片现在暂时只能添加到pdf文件新页中。查过了资料,有一种方法是先通过html生成一个临时的pdf文件,然后对临时的pdf文件进行IO流读取操作,再进行图片具体位置的替换处理。个人觉得这个操作有点难受,会多生成一个临时pdf文件,占用服务器空间,而且读写操作频繁,可能会出现未知的其它问题,不推荐使用
|
|