Springboot 中集成itextpdf HTML轉(zhuǎn)PDF并添加水印(支持中文)

依賴包 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>
代碼幫助類(lèi)主要方法
/**
  * 生成PDF文件的主要方法
  * @param filePath 生成pdf文件存放的完整絕對(duì)路徑  example: **/test.pdf
  * @param context  pdf 正文
  * @param watermark pdf 每頁(yè)的水印, 建議不要過(guò)長(zhǎng) 8個(gè)字符差不多了, 太長(zhǎng)需要調(diào)節(jié)字體大小, 否則無(wú)法顯示完整 
  */
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標(biāo)題");
            document.open();

            // 額外添加內(nèi)容的方法 如果只是普通文本轉(zhuǎn)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 會(huì)使內(nèi)容重疊在一體
                size = 10.5f;
            }
            return super.getFont(font, encoding, embedded, size, style, color);
        }

    }

/**
  * 事件處理類(lèi), 用于監(jiān)聽(tīng)pdf頁(yè)碼增加時(shí), 每頁(yè)增加水印
  */
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();
                // 開(kāi)始設(shè)置水印
                waterMar.beginText();
                // 設(shè)置水印透明度
                PdfGState gs = new PdfGState();
                // 設(shè)置填充字體不透明度為0.2f
                gs.setFillOpacity(0.1f);
                // 設(shè)置水印字體參數(shù)及大小
                BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
                        BaseFont.EMBEDDED);
                waterMar.setFontAndSize(baseFont,60);
                // 設(shè)置透明度
                waterMar.setGState(gs);
                // 設(shè)置水印對(duì)齊方式 水印內(nèi)容 X坐標(biāo) Y坐標(biāo) 旋轉(zhuǎn)角度
                waterMar.showTextAligned(Element.ALIGN_CENTER, waterMark , 300, 500, 45);
                //結(jié)束設(shè)置
                waterMar.endText();
                waterMar.stroke();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

如此即可正常解析html標(biāo)簽和css樣式,生產(chǎn)pdf文件。
需要注意的是, 正常在windows環(huán)境, 中文字體齊全, 支持較好, 生產(chǎn)得pdf一般沒(méi)問(wèn)題,
但是在Linux環(huán)境下, 沒(méi)有中文字體庫(kù), 生產(chǎn)pdf后, 正文會(huì)不顯示中文內(nèi)容。
所以需要添加中文字體集, 解決辦法參考:
https://blog.csdn.net/ieeso/article/details/81902005

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容