富文本(html)轉(zhuǎn)pdf

1.添加依賴

      <!--解決中文顯示問題-->
    <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
  <!--生成html代碼-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.2</version>
        </dependency>
      <!--生成pdf-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>
        <!--xml模板-->
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13</version>
        </dependency>

2.生成pdf在頁(yè)面預(yù)覽

@RequestMapping("/showPdf")
    public void showPdf(HttpServletResponse response){
        try {
            response.setContentType("application/pdf");
            //inline設(shè)置是強(qiáng)制瀏覽器顯示畅蹂,attachment設(shè)置時(shí)強(qiáng)制瀏覽器下載
            response.setHeader("Content-Disposition", "inline; filename= file");
            // 1.新建document
            Document document = new Document();
            // 2.建立一個(gè)書寫器(Writer)與document對(duì)象關(guān)聯(lián)站超,通過書寫器(Writer)可以將文檔寫入到磁盤中。
            //創(chuàng)建 PdfWriter 對(duì)象 第一個(gè)參數(shù)是對(duì)文檔對(duì)象的引用麦射,第二個(gè)參數(shù)是文件的實(shí)際名稱,在該名稱中還會(huì)給出其輸出路徑。
            PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
            // 3.打開文檔
            document.open();
            //要解析的html
            //html轉(zhuǎn)換成普通文字,方法如下:
            org.jsoup.nodes.Document  contentDoc = Jsoup.parseBodyFragment("<h1 align=\"center\">" + "測(cè)試主題"+ "</h1>");
            org.jsoup.nodes.Document.OutputSettings outputSettings = new org.jsoup.nodes.Document.OutputSettings();
            outputSettings.syntax(org.jsoup.nodes.Document.OutputSettings.Syntax.xml);
            contentDoc.outputSettings(outputSettings);
            String parsedHtml = contentDoc.outerHtml();
            System.out.println(parsedHtml);
            //這兒的font-family不支持漢字,{font-family:仿宋} 是不可以的宵凌。
            InputStream cssIs = new ByteArrayInputStream("* {font-family: PingFang-SC-Medium.otf;}".getBytes("UTF-8"));
            //第四個(gè)參數(shù)是html中的css文件的輸入流
            //第五個(gè)參數(shù)是字體提供者,使用系統(tǒng)默認(rèn)支持的字體時(shí)止后,可以不傳瞎惫。
            Charset charset = Charset.defaultCharset();
            XMLWorkerHelper.getInstance().parseXHtml(writer, document,  new ByteArrayInputStream(parsedHtml.getBytes()), null,charset,new FontProviderUtil());

            // XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(parsedHtml.getBytes()));
            // 5.關(guān)閉文檔
            document.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.中文顯示問題

重寫XMLWorkerFontProvider類

public class FontProviderUtil extends XMLWorkerFontProvider {
    @Override
    public Font getFont(final String fontname, final String encoding,
                        final boolean embedded, final float size, final int style,
                        final BaseColor color) {
        BaseFont bf = null;
        try {
            bf = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Font font = new Font(bf, size, style, color);
        font.setColor(color);
        return font;
    }
}

4.替換字符串中的${xxx}特殊字符

重寫mybatis替換占位符的方法去實(shí)現(xiàn)

// 重寫mybatis中解決占位符替換問題
public class VariableTokenHandler implements TokenHandler {
    private Map<String, String> variables = new HashMap<>();
    public VariableTokenHandler(Map<String, String> variables) {
        this.variables = variables;
    }
    @Override
    public String handleToken(String content) {
        String value = variables.get(content);
            return value ;
    }
}

5.調(diào)用

 Map<String,String> params = new HashMap<>() ;
        params.put("name","zzp") ;
        params.put("age","25") ;
        String sqlTemplate = "123insert into user(username,age,sequence,${age}) values(${name},${age},${name}.nextval)" ;
        VariableTokenHandler handler = new VariableTokenHandler(params);
        // 替換sql模板中的${xxx}占位符
        GenericTokenParser parser = new GenericTokenParser("${", "}", handler);
        String retContent = parser.parse(sqlTemplate);
        System.out.println(retContent);

6.問題

生成的富文本xml中,出現(xiàn)替換不了的占位符,可能是占位符不對(duì),如:${name}變成了${name<u></u>}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坯门,一起剝皮案震驚了整個(gè)濱河市微饥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古戴,老刑警劉巖欠橘,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異现恼,居然都是意外死亡肃续,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門叉袍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來始锚,“玉大人,你說我怎么就攤上這事喳逛∏瓢疲” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姐呐。 經(jīng)常有香客問我殿怜,道長(zhǎng),這世上最難降的妖魔是什么曙砂? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任头谜,我火速辦了婚禮,結(jié)果婚禮上鸠澈,老公的妹妹穿的比我還像新娘柱告。我一直安慰自己,他們只是感情好笑陈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布际度。 她就那樣靜靜地躺著,像睡著了一般涵妥。 火紅的嫁衣襯著肌膚如雪甲脏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天妹笆,我揣著相機(jī)與錄音,去河邊找鬼娜氏。 笑死拳缠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贸弥。 我是一名探鬼主播窟坐,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绵疲!你這毒婦竟也來了哲鸳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤盔憨,失蹤者是張志新(化名)和其女友劉穎徙菠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郁岩,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婿奔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了问慎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍摊。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖如叼,靈堂內(nèi)的尸體忽然破棺而出冰木,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布踊沸,位于F島的核電站歇终,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雕沿。R本人自食惡果不足惜练湿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望审轮。 院中可真熱鬧肥哎,春花似錦、人聲如沸疾渣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榴捡。三九已至杈女,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吊圾,已是汗流浹背达椰。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留项乒,地道東北人啰劲。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像檀何,于是被迫代替她去往敵國(guó)和親蝇裤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容