之前在工作中遇到过一个需求,是将用户填写的申报,由固定模板的来生成pdf,后来想到先把内容生成html,
然后再把html格式的内容转换成pdf。
之前在网上找了很多,有很多内容都是转载的,后来折腾了好几天才试出一个真实能用的,所以在这里记录一下。方便以后查阅,也希望能帮到别人。
1.所需jar包
core-renderer.jar ,iText-2.0.8.jar
2、示例html
2233322dsss--你好--dss2
html中要注意的是字体的设置,
font-family:SimSun;
在下面的java代码中,也需要加载对应的字体,不然会出现中文显示不出来的情况
3、java代码
package wqb.pdf.test;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.pdf.BaseFont;
/**
* html转pdf
*
* @author wqb
*
*/
public class PdfDemoTest {
public static void main(String[] args) throws Exception {
//读取html的流
InputStream inputStream = PdfDemoTest.class.getResourceAsStream("test.html");
//流转换成字符串
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = inputStream.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
String html = out.toString();
String pdffile = "C:\\wqb\\test.pdf";
OutputStream os = new FileOutputStream(pdffile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
// writer.setPageEvent(header);
ITextFontResolver fontResolver = renderer.getFontResolver();
// 添加字体支持,路径可以自身项目的实际情况设置,我这里是本地项目,而且为了方便测试,就写成固定的了
// 实际项目中,可以获取改字体所在真实的服务器的路径,这个方法是本地地址和网络地址都支持的
// 这里面添加的是宋体
fontResolver.addFont("C:\\software\\eclipse-neon\\workspace\\htmlToPdfDemo\\bin\\SIMSUN.TTC",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(os);
os.flush();
os.close();
}
}
4、实际效果
总结:示例代码比较简单,只是单纯的实现了导出pdf而已。在真实业务场景中,html的内容一般是用template或者Velocity 生成。并且字体的路径也不能写死,可以根据自己的项目情况采用合适的读取办法。
需要注意的是字体,一定要设置!!!
对html的规范要求极高,例如:页面中 等标签必须闭合!!!
示例代码下载地址
比较缺分,所以资源要分了。谅解