html生成pdf并生成書簽

通過html生成pdf捉撮,可使用睿印 工具包栋艳,睿印java工具包是集成openhtmltopdf抓谴,pdfbox的開源工具包钧椰,集成了thymeleaf 動(dòng)態(tài)腳本蛛壳,并可自動(dòng)加載字體杏瞻,默認(rèn)支持中文顯示。

  1. 首先新建java maven項(xiàng)目衙荐,引入jar包
<dependency>
  <groupId>ink.rayin</groupId>
  <artifactId>rayin-htmladapter-openhtmltopdf</artifactId>
  <version>1.0.8</version>
</dependency>
  1. 新建html捞挥,保存至test/resources下,命名為element1.html
<!DOCTYPE html>
<html lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8"/>
    <style>
       body {
                  font-family: FangSong,HanaMinB;
                  line-height: 1.2;
                  /*設(shè)置背景色*/
                  /*background: #00FF00 ;*/
                  /*設(shè)置背景圖片*/
                  /*background-image:url(data:image/gif;base64,AAAA) no-repeat fixed top;*/
              }
              /** 指定pdf紙張大小 **/
              @page {
                  size: A4 ;
                  margin: 1cm;
                  /*margin-bottom: 1cm;*/
                  /*border: thin solid black;*/
              }

              .page_break { page-break-after:always;}

              .seclev2 {
                text-indent:20pt;
              }
              .seclev2c {
                   text-indent:40pt;
               }
            a {
                text-decoration:none;
             }
         a:link {
            color:#000000;
         }
         a:visited {color:#00FF00;}
    </style>
</head>
<body>
<!-- 該部分為書簽生成使用到的tag href #后的名稱對(duì)應(yīng)的下方的id 名稱-->
<bookmarks>
    <bookmark name="第一章" href="#section1">
        <bookmark name="1.1 xxx" href="#subsec11"/>
        <bookmark name="1.2 xxx" href="#subsec12"/>
        <bookmark name="1.3 xxx" href="#subsec13"/>
    </bookmark>
    <bookmark name="第二章" href="#section2">
        <bookmark name="2.1 xxxx" href="#subsec21"/>
        <bookmark name="2.2 xxxx" href="#subsec22"/>
        <bookmark name="2.3 xxx" href="#subsec23"/>
    </bookmark>
    <bookmark name="第三章" href="#section3">
        <bookmark name="3.1 xxx" href="#subsec31"/>
        <bookmark name="3.2 xxx" href="#subsec32"/>
        <bookmark name="3.3 xxx" href="#subsec33"/>
    </bookmark>
</bookmarks>

<div style="page-break-after:always;"></div>
<div id="section1" class="seclev1"><h1>第一章</h1></div>
<div id="subsec11" class="seclev2"><h2>1.1 xxxx</h2>
    <div>內(nèi)容</div>
</div>

<div id="subsec12" class="seclev2"><h2>1.2 xxxx</h2>
    <div>內(nèi)容</div>
</div>

<div id="subsec13" class="seclev2"><h2>1.3 xxxx</h2>
    <div>內(nèi)容</div>
</div>
<div style="page-break-after:always;"></div>
<div id="section2" ><h1>第二章</h1></div>
<div id="subsec21" class="seclev2"><h2>2.1 xxxx</h2>
    <div>內(nèi)容</div>
</div>
<div id="subsec22" class="seclev2"><h2>2.2 xxxx</h2>
    <div>內(nèi)容</div>
</div>

<div id="subsec23" class="seclev2"><h2>2.3 xxxx</h2>
    <div>內(nèi)容</div>
</div>

<div style="page-break-after:always;"></div>
<div id="section3"><h1>第三章</h1></div>
<div id="subsec31" class="seclev2"><h2>3.1 xxxx</h2>
    <div>內(nèi)容</div>
</div>
<div id="subsec32" class="seclev2"><h2>3.2 xxxx</h2>
    <div>內(nèi)容</div>
</div>
<div id="subsec33" class="seclev2"><h2>3.3 xxxx</h2>
    <div>內(nèi)容</div>
</div>
</body>
</html>
  1. 項(xiàng)目test中新建測試類
@Slf4j
public class PDFGeneratorOpenhtmltopdfTest {
    static PdfGenerator pdfGenerator;
    static  {
        try {
            pdfGenerator = new PdfBoxGenerator();
            pdfGenerator.init();

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

    @Test
    public void markbooksTest() throws Exception {
        log.info("markbooksTest start time:" + new Timestamp(System.currentTimeMillis()));

        String outputFileClass = ResourceUtil.getResourceAbsolutePathByClassPath("");

        // 生成pdf路徑
        // generate pdf path
        String outputFile = new File(outputFileClass)
                .getParentFile().getParent()
                + "/tmp/"
                + "markbooks_"+System.currentTimeMillis() + ".pdf";

        //數(shù)據(jù)參數(shù)可以為空
        pdfGenerator.generatePdfFileByHtmlAndData(ResourceUtil.getResourceAbsolutePathByClassPath("element1.html"),null,outputFile);

        log.info("markbooksTest end time:" + new Timestamp(System.currentTimeMillis()));
    }
}
  1. 生成PDF如下


    帶書簽的pdf

至此大功告成赫模!

pdfbox讀取pdf書簽

生成的pdf標(biāo)簽也可以通過pdfbox來讀取树肃。

@Test
public void bookmarksTest() throws IOException {
        PDDocument pdfWithBookmarks = PDDocument.load(ResourceUtil.getResourceAsStream("bookmark.pdf"));
        PDDocumentOutline pdo = pdfWithBookmarks.getDocumentCatalog().getDocumentOutline();
        printBookmark(pdfWithBookmarks, pdo, "");
        pdfWithBookmarks.close();
 }
 
//遞歸獲取書簽
 public void printBookmark(PDDocument pd, PDOutlineNode bookmark, String indentation) throws IOException{
        PDOutlineItem current = bookmark.getFirstChild();
        while (current != null) {
            PDPage currentPage = current.findDestinationPage(pd);
            // 獲取書簽對(duì)應(yīng)對(duì)的頁碼
            Integer pageNumber = pd.getDocumentCatalog().getPages().indexOf(currentPage) + 1;

            System.out.println(indentation + current.getTitle() + "----------------" + pageNumber);
            printBookmark(pd, current, indentation + "    ");
            current = current.getNextSibling();
        }
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瀑罗,隨后出現(xiàn)的幾起案子胸嘴,更是在濱河造成了極大的恐慌,老刑警劉巖斩祭,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劣像,死亡現(xiàn)場離奇詭異,居然都是意外死亡摧玫,警方通過查閱死者的電腦和手機(jī)耳奕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門绑青,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屋群,你說我怎么就攤上這事闸婴。” “怎么了芍躏?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵邪乍,是天一觀的道長。 經(jīng)常有香客問我对竣,道長庇楞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任否纬,我火速辦了婚禮吕晌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘临燃。我一直安慰自己睛驳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布谬俄。 她就那樣靜靜地躺著柏靶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溃论。 梳的紋絲不亂的頭發(fā)上屎蜓,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音钥勋,去河邊找鬼炬转。 笑死,一個(gè)胖子當(dāng)著我的面吹牛算灸,可吹牛的內(nèi)容都是我干的扼劈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼菲驴,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼荐吵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赊瞬,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤先煎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后巧涧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薯蝎,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年谤绳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了占锯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袒哥。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖消略,靈堂內(nèi)的尸體忽然破棺而出堡称,到底是詐尸還是另有隱情,我是刑警寧澤艺演,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布粮呢,位于F島的核電站,受9級(jí)特大地震影響钞艇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豪硅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一哩照、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懒浮,春花似錦飘弧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稽穆,卻和暖如春冠王,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舌镶。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工柱彻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人餐胀。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓哟楷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親否灾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卖擅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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