<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.3</version>
</dependency>
public static byte[] html2pdf(String html, String waterMarkName) throws IOException, DocumentException, CssResolverException {
String data = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"> <html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">";
html = data+html.replace("<br>", "<br/>").replace("<hr>", "<hr/>").replace("<img>", "<img/>").replace("<param>", "<param/>")
.replace("<link>", "<link/>").replace("<td>", "<td/>");
Document document = new Document(PageSize.A4);
ByteArrayOutputStream docout = new ByteArrayOutputStream();
PdfWriter pdfWriter = PdfWriter.getInstance(document, docout);
document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
InputStream inputStream = null;
pdfWriter.setViewerPreferences(PdfWriter.HideToolbar);
pdfWriter.setPageEvent(new BackGroundPdf(waterMarkName));
PdfContentByte under = pdfWriter.getDirectContentUnder();
Properties properties = System.getProperties();
String property = properties.getProperty("os.name");
boolean windows = property.contains("Windows");
BaseFont bfChinese = null;
if (windows) {
bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} else {
String FONT_PATH = "/usr/share/fonts/chinese/SIMYOU.TTF";
bfChinese = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
under.beginText();
under.setColorFill(BaseColor.LIGHT_GRAY);
under.setFontAndSize(bfChinese, 30);
for (float y = 0; y < 1000; y = y + 350) {
for (float x = 0; x < 800; x = x + 200) {
under.setTextMatrix(x, y);
under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, y, x, 45);
}
}
under.endText();
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)), inputStream, StandardCharsets.UTF_8, new AsianFontProvider());
document.close();
return docout.toByteArray();
}
static class AsianFontProvider extends XMLWorkerFontProvider {
@Override
public Font getFont(final String fontname, String encoding, float size, final int style) {
try {
Properties properties = System.getProperties();
String property = properties.getProperty("os.name");
boolean windows = property.contains("Windows");
BaseFont bfChinese = null;
if (windows) {
bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} else {
String FONT_PATH = "/usr/share/fonts/chinese/SIMYOU.TTF";
bfChinese = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
return new Font(bfChinese, size, style);
} catch (Exception ignored) {
}
return super.getFont(fontname, encoding, size, style);
}
}
public class BackGroundPdf extends PdfPageEventHelper {
private String waterMarkName = "";
public String getWaterMarkName() {
return waterMarkName;
}
public void setWaterMarkName(String waterMarkName) {
this.waterMarkName = waterMarkName;
}
public BackGroundPdf(){
}
public BackGroundPdf(String waterMarkName){
this.waterMarkName = waterMarkName;
}
@SneakyThrows
@Override
public void onStartPage(PdfWriter pdfWriter, Document document) {
PdfContentByte under = pdfWriter.getDirectContentUnder();
Properties properties = System.getProperties();
String property = properties.getProperty("os.name");
boolean windows = property.contains("Windows");
BaseFont bfChinese = null;
if (windows) {
bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} else {
String FONT_PATH = "/usr/share/fonts/chinese/SIMYOU.TTF";
bfChinese = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
under.beginText();
under.setColorFill(BaseColor.LIGHT_GRAY);
under.setFontAndSize(bfChinese, 30);
for (float y = 0; y < 1000; y = y + 350) {
for (float x = 0; x < 800; x = x + 200) {
under.setTextMatrix(x, y);
under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, y, x, 45);
}
}
under.endText();
super.onStartPage(pdfWriter, document);
}