依赖包 pom.xml 配置
5.5.11
5.2.0
com.itextpdf
itextpdf
${itextPdf.version}
com.itextpdf
itext-asian
${itextAsian.version}
com.itextpdf.tool
xmlworker
${itextPdf.version}
代码帮助类主要方法
/**
* 生成PDF文件的主要方法
* @param filePath 生成pdf文件存放的完整绝对路径 example: **/test.pdf
* @param context pdf 正文
* @param watermark pdf 每页的水印, 建议不要过长 8个字符差不多了, 太长需要调节字体大小, 否则无法显示完整
*/
public static void createPDF(String filePath, String content, String waterMark) {
Assert.notNull(filePath, "FilePath can not be null");
Assert.notNull(content, "Content can not be null");
Assert.notNull(waterMark, "WaterMark can not be null");
Document document = new Document(PageSize.A4);
try {
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));
writer.setPageEvent(new CustomEvent(waterMark));
document.addTitle("PDF标题");
document.open();
// 额外添加内容的方法 如果只是普通文本转pdf, 用下面注释的代码即可, 注释后面的代码为html to pdf
// BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
// BaseFont.EMBEDDED);
// Font font = new Font(baseFont);
// document.add(new Paragraph(content, font));
ByteArrayInputStream in = new ByteArrayInputStream(content.getBytes());
ByteArrayInputStream is = new ByteArrayInputStream("".getBytes());
XMLWorkerHelper.getInstance().parseXHtml(writer, document, in,is,new PdfFont());
} catch (Exception e) {
e.printStackTrace();
} finally {
document.close();
}
}
/**
* 中文字体支持
*/
static class PdfFont extends XMLWorkerFontProvider {
@Override
public Font getFont(String fontname, String encoding, boolean embedded,
float size, int style, BaseColor color) {
String font = fontname;
if (font == null) {
font = "宋体";
}
if (size <= 0) {//size<0 会使内容重叠在一体
size = 10.5f;
}
return super.getFont(font, encoding, embedded, size, style, color);
}
}
/**
* 事件处理类, 用于监听pdf页码增加时, 每页增加水印
*/
static class CustomEvent extends PdfPageEventHelper {
private String waterMark;
public CustomEvent(String waterMark) {
this.waterMark = waterMark;
}
@Override
public void onStartPage(PdfWriter writer, Document document) {
try {
// 加入水印
PdfContentByte waterMar = writer.getDirectContentUnder();
// 开始设置水印
waterMar.beginText();
// 设置水印透明度
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.2f
gs.setFillOpacity(0.1f);
// 设置水印字体参数及大小
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.EMBEDDED);
waterMar.setFontAndSize(baseFont,60);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
waterMar.showTextAligned(Element.ALIGN_CENTER, waterMark , 300, 500, 45);
//结束设置
waterMar.endText();
waterMar.stroke();
} catch (Exception e) {
e.printStackTrace();
}
}
}
如此即可正常解析html标签和css样式,生产pdf文件。
需要注意的是, 正常在windows环境, 中文字体齐全, 支持较好, 生产得pdf一般没问题,
但是在Linux环境下, 没有中文字体库, 生产pdf后, 正文会不显示中文内容。
所以需要添加中文字体集, 解决办法参考:
https://blog.csdn.net/ieeso/article/details/81902005