所涉及到的JAR包地址: 下载地址
文档记录了生成PDF的4种场景:
第一部分:直接生成PDF文件;
第二部分:将HTML文件转成PDF文件;
第三部分:将字节流转成PDF文件,并放入servletResponse(本地不生成文件);
第四部分:将字节流转成PDF文件并打包成压缩包,并放入servletResponse(本地不生成文件);
第五部分:html转pdf,中文解决方案
第一部分,先记录下直接生成PDF文件:
Document document = new Document();
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\Users\\cdp\\Desktop\\HelloWorld.pdf"));
document.open();
// 使用iTextAsian.jar中的字体
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(baseFont);
document.add(new Paragraph("this is A Hello World PDF document"));
document.add(new Paragraph("this is b Hello World PDF document"));
document.add(new Paragraph("这里是中文段落", font));// 注意这里要设置paragaph的字体
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
document.close();
writer.close();
}
第二部分,记录下将html文件内容,转成pdf文件
Document document = new Document();
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\Users\\cdp\\Desktop\\HelloWorld.pdf"));
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new FileInputStream("C:\\Users\\cdp\\Desktop\\用户电子协议测试文档.html"), Charset.forName("UTF-8"));
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
document.close();
writer.close();
}
第三部分,将字节流转成PDF并放入servletResponse
// 组装完的最新文件内容
byte tag_bytes[] = templateContent.getBytes();
// 往输出流写入内容
Document document = new Document();
PdfWriter writer = null;
try {
out = response.getOutputStream();
writer = PdfWriter.getInstance(document, out);
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(tag_bytes),
Charset.forName("UTF-8"));
document.close();
writer.close();
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
document.close();
writer.close();
}
第四部分,生成PDF压缩包,放入servletResponse
zipOutputStream = new ZipOutputStream(response.getOutputStream());
for(Object object: lisst){
byte tag_bytes[] = templateContent.getBytes();
String fileame = customerInfo.getName() + "_" + customerInfo.getTrueName() + "_"
+ customerGoodsAccountFlow.getId() + ".pdf";
ZipEntry entry = new ZipEntry(fileame);
zipOutputStream.putNextEntry(entry);
// 往输出流写入内容
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, zipOutputStream);
writer.setCloseStream(false);//这一步很重要,是为了让writer不主动document的流
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(tag_bytes),
Charset.forName("UTF-8"));
document.close();
zipOutputStream.closeEntry();
}
记得关闭流
第五部分,HTML转PDF时,如果HTML文件含中文内容,则需要在html文件中设置字体:
<style type="text/css">
/*解决html转pdf文件中文不显示的问题*/
body {
font-family: SimSun;/*宋体*/
}
/*设定纸张大小*/
/* A4纸 */
/* @page{size:210mm*297mm} */
@page{size:a4}
p {
color: red;
}
</style>
其中, font-family: SimSun;/宋体/需要服务器本身含有该字体,若没有该字体,则通过给服务器加入字体文件来实现支持,(可以谷歌一波,给linux安装中文字体),当然这里也有一份帖子来介绍如果安装: 安装中文字体,友情链接