Java指定格式的pdf導(dǎo)出

一檀蹋、導(dǎo)出工具類

傳入?yún)?shù)為需要渲染的數(shù)據(jù)内狸,以及模板的位置。
需要準(zhǔn)備好字體文件舌胶,同項(xiàng)目一起打包捆蜀。可以在”控制面板\外觀和個(gè)性化\字體“中找到想要的字體
其中工具類傳入的參數(shù)示例為:

List<QuestionExportVO> questionExportVOList  = new ArrayList<>();          
Map<String, Object> data = new HashMap<>();
data.put("questionExportVOList", questionExportVOList);
baos = PDFTemplateUtil.createPDF(data, "QuestionReplyDetails.ftl");
public class PDFTemplateUtil {
    /**
     * 通過模板導(dǎo)出pdf文件
     *
     * @param data 數(shù)據(jù)
     * @throws Exception
     */
    public static ByteArrayOutputStream createPDF(Object data, String templateName) throws Exception {
        // 創(chuàng)建一個(gè)FreeMarker實(shí)例, 負(fù)責(zé)管理FreeMarker模板的Configuration實(shí)例
        Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        // 指定FreeMarker模板文件的位置
        cfg.setClassForTemplateLoading(PDFTemplateUtil.class, "/templates");
        ITextRenderer renderer = new ITextRenderer();
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            // 設(shè)置 css中 的字體樣式(暫時(shí)僅支持宋體和黑體) 必須幔嫂,不然中文不顯示
            renderer.getFontResolver().addFont("/templates/font/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            renderer.getFontResolver().addFont("/templates/font/calibrib.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            // 設(shè)置模板的編碼格式
            cfg.setEncoding(Locale.CHINA, "UTF-8");
            // 獲取模板文件
            Template template = cfg.getTemplate(templateName, "UTF-8");
            StringWriter writer = new StringWriter();

            // 將數(shù)據(jù)輸出到html中
            template.process(data, writer);
            writer.flush();

            String html = writer.toString();
            // 把html代碼傳入渲染器中
            renderer.setDocumentFromString(html);
            renderer.layout();

            renderer.createPDF(out, false);
            renderer.finishPDF();
            out.flush();
            return out;
        }
    }
}

二辆它、配置模板

根據(jù)需求畫出想要的界面,注意并不是html履恩,而是ftl格式(可以先畫一個(gè)html锰茉,畫出想要的格式后,再改造成ftl)切心。
其中有很多ftl格式才有的標(biāo)簽飒筑,用于實(shí)現(xiàn)數(shù)據(jù)渲染≌阑瑁可以做到動(dòng)態(tài)增加表格协屡,比如:

<#list detail.images as image>
          <#if image ??>
               <img style="width: 99%;padding-left: 2px;padding-top: 2px;" src="${image}" alt="image"/>
          </#if>
</#list>

<#list detail.images as image>代表在集合中循環(huán)操作,??代表如果對(duì)象存在(不為null)的話

${(child.conclusion)!''}則代表如果為null的時(shí)候全谤,則用空字符串作為默認(rèn)輸出值

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8"/>
    <title></title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: SimSun;
            padding: 30px 20px 0;
        }

        section {
            display: block;
        }

        .preface p {
            line-height: 30px;
            display: inline-block;
        }

        section > table {
            page-break-inside: auto;
            -fs-table-paginate: paginate;
            border-spacing: 0;
            cellspacing: 0;
            cellpadding: 0;
            border-collapse: collapse;
            table-layout: fixed;
            width: 100%;
            font-size: 13px;
            text-align: left;
            word-wrap: break-word;
        }

        section table td {
            padding: 5px 0;
        }

        section table tr {
            page-break-inside: avoid;
            page-break-after: auto;
        }

        .topTitle section {
            width: 30%;
            font-size: 13px;
            display: inline-block;
            margin-top: 20px;
        }

        .outTitle section {
            font-size: 13px;
            display: inline-block;
        }

        .detail {
            margin-top: 20px;
        }

        .box3 img {
            width: 100%;
        }

        .box3 p {
            font-size: 12px;
        }

        img {
            width: 50%;
        }
    </style>
</head>

<body>

<#if questionExportVOList ??>
    <section class="detail">
        <table border="1" cellspacing="0" cellpadding="0">
            <#list questionExportVOList as data>
                <tr style="font-weight: bold;font-size: 14px;text-align: center;">
                    <td colspan="2" width="100%">問題歸屬成果:${(data.stageOutcomeName)!''}</td>
                </tr>
                <#list data.questionDetails as detail>
                    <tr>
                        <td colspan="2" width="100%" style="font-family: Calibri;font-weight: bold;font-size: 12px;background-color:yellow;">&nbsp;&nbsp;${(detail.serialNumber)!''}</td>
                    </tr>
                    <tr>
                        <th rowspan="7">
                            <#list detail.images as image>
                                <#if image ??>
                                    <img style="width: 99%;padding-left: 2px;padding-top: 2px;" src="${image}" alt="image"/>
                                </#if>
                            </#list>

                        </th>
                        <td><b style="font-size: 12px;">問題所屬圖紙或模型:</b>${(detail.fileName)!''}</td>
                    </tr>
                    <tr>
                        <td><b style="font-size: 12px;">問題標(biāo)題:</b>${(detail.questionTitle)!''}</td>
                    </tr>
                    <tr>
                        <td><b style="font-size: 12px;">問題描述:</b>${(detail.questionDesc)!''}</td>
                    </tr>
                    <tr>
                        <td>專業(yè):${(detail.major)!''}</td>
                    </tr>
                    <tr>
                        <td>知悉人員:${(detail.knowingStaff)!''}</td>
                    </tr>
                    <tr>
                        <td>主責(zé)人員:${(detail.participants)!''}</td>
                    </tr>
                    <tr>
                        <td>上傳附件:${(detail.attachmentName)!''}</td>
                    </tr>
                    <#if detail.children ??>
                        <#list detail.children as child>
                            <tr style="font-weight: bold;font-size: 12px;">
                                <td colspan="2" width="100%">${(child.operate)!''}</td>
                            </tr>
                            <#if child.conclusion ??>
                                <tr>
                                    <td>復(fù)核人員:${(child.createBy)!''}</td>
                                    <#if child.conclusion == "同意">
                                        <td>復(fù)核結(jié)論:<b style="color: green;">${(child.conclusion)!''}</b></td>
                                    <#else >
                                        <td>復(fù)核結(jié)論:<b style="color: red;">${(child.conclusion)!''}</b></td>
                                    </#if>
                                </tr>
                            <#else >
                                <tr>
                                    <td colspan="2" width="100%">回復(fù)人員:${(child.createBy)!''}</td>
                                </tr>
                            </#if>
                            <#if child.replyContent ??>
                                <tr>
                                    <td colspan="2" width="100%">${(child.replyContent)!''}</td>
                                </tr>
                            </#if>
                        </#list>
                    </#if>
                </#list>
            </#list>
        </table>
    </section>
</#if>

</body>

</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肤晓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌补憾,老刑警劉巖漫萄,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盈匾,居然都是意外死亡腾务,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門削饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岩瘦,“玉大人,你說我怎么就攤上這事葵孤〉Eィ” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵尤仍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我狭姨,道長(zhǎng)宰啦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任饼拍,我火速辦了婚禮赡模,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘师抄。我一直安慰自己漓柑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布叨吮。 她就那樣靜靜地躺著辆布,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茶鉴。 梳的紋絲不亂的頭發(fā)上锋玲,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音涵叮,去河邊找鬼惭蹂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛割粮,可吹牛的內(nèi)容都是我干的盾碗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼舀瓢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼廷雅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤榜轿,失蹤者是張志新(化名)和其女友劉穎幽歼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谬盐,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甸私,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了飞傀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皇型。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砸烦,靈堂內(nèi)的尸體忽然破棺而出弃鸦,到底是詐尸還是另有隱情,我是刑警寧澤幢痘,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布唬格,位于F島的核電站,受9級(jí)特大地震影響颜说,放射性物質(zhì)發(fā)生泄漏购岗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一门粪、第九天 我趴在偏房一處隱蔽的房頂上張望喊积。 院中可真熱鬧,春花似錦玄妈、人聲如沸乾吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绎签。三九已至,卻和暖如春瞭郑,著一層夾襖步出監(jiān)牢的瞬間辜御,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工屈张, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擒权,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓阁谆,卻偏偏與公主長(zhǎng)得像碳抄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子场绿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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