Springboot 中集成itextpdf HTML轉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>
代碼幫助類主要方法
/**
  * 生成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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市到旦,隨后出現(xiàn)的幾起案子旨巷,更是在濱河造成了極大的恐慌,老刑警劉巖添忘,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件采呐,死亡現(xiàn)場離奇詭異,居然都是意外死亡搁骑,警方通過查閱死者的電腦和手機斧吐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門又固,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人煤率,你說我怎么就攤上這事仰冠。” “怎么了蝶糯?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵洋只,是天一觀的道長。 經(jīng)常有香客問我昼捍,道長识虚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任妒茬,我火速辦了婚禮担锤,結果婚禮上,老公的妹妹穿的比我還像新娘乍钻。我一直安慰自己肛循,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布团赁。 她就那樣靜靜地躺著育拨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欢摄。 梳的紋絲不亂的頭發(fā)上熬丧,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音怀挠,去河邊找鬼析蝴。 笑死,一個胖子當著我的面吹牛绿淋,可吹牛的內(nèi)容都是我干的闷畸。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼吞滞,長吁一口氣:“原來是場噩夢啊……” “哼佑菩!你這毒婦竟也來了?” 一聲冷哼從身側響起裁赠,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤殿漠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后佩捞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绞幌,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年一忱,在試婚紗的時候發(fā)現(xiàn)自己被綠了莲蜘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭确。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖票渠,靈堂內(nèi)的尸體忽然破棺而出逐哈,到底是詐尸還是另有隱情,我是刑警寧澤问顷,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布鞠眉,位于F島的核電站,受9級特大地震影響择诈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜出皇,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一羞芍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郊艘,春花似錦荷科、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狞贱,卻和暖如春刻获,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞎嬉。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工蝎毡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氧枣。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓沐兵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親便监。 傳聞我的和親對象是個殘疾皇子扎谎,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350