依賴包 pom.xml 配置
<properties>
<itextPdf.version>5.5.11</itextPdf.version>
<itextAsian.version>5.2.0</itextAsian.version>
</properties>
<dependencies>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>${itextPdf.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>${itextAsian.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>${itextPdf.version}</version>
</dependency>
</dependencies>
代碼幫助類主要方法
/**
* 生成PDF文件的主要方法
* @param filePath 生成pdf文件存放的完整絕對路徑 example: **/test.pdf
* @param context pdf 正文
* @param watermark pdf 每頁的水印习寸, 建議不要過長 8個字符差不多了步藕, 太長需要調(diào)節(jié)字體大小惦界, 否則無法顯示完整
*/
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();
// 額外添加內(nèi)容的方法 如果只是普通文本轉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 會使內(nèi)容重疊在一體
size = 10.5f;
}
return super.getFont(font, encoding, embedded, size, style, color);
}
}
/**
* 事件處理類, 用于監(jiān)聽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);
// 設置水印字體參數(shù)及大小
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.EMBEDDED);
waterMar.setFontAndSize(baseFont,60);
// 設置透明度
waterMar.setGState(gs);
// 設置水印對齊方式 水印內(nèi)容 X坐標 Y坐標 旋轉角度
waterMar.showTextAligned(Element.ALIGN_CENTER, waterMark , 300, 500, 45);
//結束設置
waterMar.endText();
waterMar.stroke();
} catch (Exception e) {
e.printStackTrace();
}
}
}
如此即可正常解析html標簽和css樣式,生產(chǎn)pdf文件咙冗。
需要注意的是沾歪, 正常在windows環(huán)境, 中文字體齊全雾消, 支持較好灾搏, 生產(chǎn)得pdf一般沒問題,
但是在Linux環(huán)境下立润, 沒有中文字體庫狂窑, 生產(chǎn)pdf后, 正文會不顯示中文內(nèi)容范删。
所以需要添加中文字體集蕾域, 解決辦法參考:
https://blog.csdn.net/ieeso/article/details/81902005