精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

完美!SpringBoot + HTML模板高效生成PDF文檔

開(kāi)發(fā) 前端
OpenHtmlToPdf 是一個(gè)功能強(qiáng)大的開(kāi)源Java庫(kù),專為將HTML內(nèi)容轉(zhuǎn)換為高質(zhì)量的PDF文檔而設(shè)計(jì)。它以其出色的HTML和CSS兼容性、靈活的配置選項(xiàng)以及易于集成的特點(diǎn)而廣泛的認(rèn)可和應(yīng)用。?

環(huán)境:SpringBoot3.2.8

1. 簡(jiǎn)介

OpenHtmlToPdf是一個(gè)開(kāi)源的Java庫(kù),專為將HTML內(nèi)容轉(zhuǎn)換為PDF文檔而設(shè)計(jì)。它支持大部分CSS樣式和部分HTML5特性,使得從網(wǎng)頁(yè)或HTML模板生成高質(zhì)量的PDF文件變得簡(jiǎn)單高效。OpenHtmlToPdf不僅提供了基礎(chǔ)的HTML到PDF的轉(zhuǎn)換功能,還允許用戶通過(guò)豐富的配置選項(xiàng)來(lái)自定義PDF文檔的樣式和輸出設(shè)置。該組件的引入,極大地簡(jiǎn)化了項(xiàng)目中生成PDF文檔的工作流程,無(wú)論是用于生成報(bào)告、合同、還是電子書等場(chǎng)景,都能輕松應(yīng)對(duì)。

接下來(lái)我們將在SpringBoot項(xiàng)目中,通過(guò)Freemarker模板引擎渲染HTML模板,并利用OpenHtmlToPdf庫(kù)將渲染后的HTML內(nèi)容轉(zhuǎn)換為PDF文檔,最后通過(guò)HTTP響應(yīng)將PDF文件提供給用戶下載。

2. 實(shí)戰(zhàn)案例

2.1 引入依賴

<!-- 該庫(kù)進(jìn)行HTML的解析 -->
<dependency>    
  <groupId>org.jsoup</groupId>    
  <artifactId>jsoup</artifactId>   
  <version>1.18.1</version> 
</dependency>
<!-- 將HTML內(nèi)容轉(zhuǎn)換為PDF文檔 -->
<dependency>
  <groupId>com.openhtmltopdf</groupId>
  <artifactId>openhtmltopdf-core</artifactId>
  <version>${openhtmltopdf.version}</version>
</dependency>
<dependency>
  <groupId>com.openhtmltopdf</groupId>
  <artifactId>openhtmltopdf-pdfbox</artifactId>
  <version>${openhtmltopdf.version}</version>
</dependency>

接下來(lái)是準(zhǔn)備需要的資源

2.2 資源準(zhǔn)備

要支持中文,需要進(jìn)行字體的準(zhǔn)備,我這里使用的BabelStoneHan.ttf

圖片圖片

我們要通過(guò)freemarker模板技術(shù)生成HTML文檔,還需要準(zhǔn)備ftl模板,內(nèi)容如下:

<html>
 <head>
  <meta charset="UTF-8">
  <title>用戶列表</title>
  <style>
    body {font-family: "BabelStoneHan",sans-serif;}
    table {width: 100%;border-collapse: collapse;}
    th,td {border: 1px solid black;padding: 8px;text-align: left;}  
    th {background-color: #f2f2f2;}  
</style>
 </head>
 <body>
  <div class="title-container">
    <h2>XXXOOO全部用戶列表信息</h2>
  </div>
  <div class="content-container">
    <table>  
      <tr>  
        <th>編號(hào)</th>  
        <th>姓名</th>  
        <th>性別</th>  
        <th>身份證</th>  
        <th>年齡</th>  
        <th>郵箱</th>  
        <th>頭像</th>  
      </tr> 
      <#list users as user>
        <tr>  
          <td>${user.id}</td>  
          <td>${user.name}</td>  
          <td>${user.sex}</td>  
          <td>${user.idNo}</td>  
          <td>${user.age}</td>  
          <td>${user.email}</td>  
          <td><img src="https://img0.baidu.com/it/u=3366443890,3137275928&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500" alt="Avatar" style="width:50px;"></td>
        </tr>
      </#list>
    </table> 
  </div>
 </body>
</html>

模板保存路徑如下

圖片圖片

基礎(chǔ)資源都準(zhǔn)備好后,接下來(lái)就是進(jìn)入代碼編寫了

2.3 基礎(chǔ)配置&準(zhǔn)備數(shù)據(jù)

對(duì)freemarker進(jìn)行基本的配置,如:編碼,模板路徑等。

@Bean
Configuration config(ResourceLoader loader) {
  freemarker.template.Configuration cfg = null ;
  try {
    cfg = new Configuration(Configuration.VERSION_2_3_33);
    // 設(shè)置模板路徑
    File baseDir = loader.getResource("classpath:/templates/").getFile() ; 
    TemplateLoader templateLoader = new FileTemplateLoader(baseDir) ;
    cfg.setTemplateLoader(templateLoader) ;
    // 設(shè)置編碼
    cfg.setDefaultEncoding("UTF-8") ;
    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER)  ;
  } catch (IOException e) {
    e.printStackTrace() ;
  }
  return cfg ;
}

以后要具體使用模板都會(huì)通過(guò)這里的Configuration獲取。

準(zhǔn)備數(shù)據(jù),這里為了足夠的簡(jiǎn)單,并不去DB查詢數(shù)據(jù)。

private static final List<User> DATAS = new ArrayList<>() ;
static {
  for (int i = 0; i < 10; i++) {
    DATAS.add(new User(
        i + 0L, 
        "姓名 - " + i, 
        new Random().nextInt(3) % 2 == 0 ? "男" : "女", 
        "身份證 - " + i, 
        new Random().nextInt(100), 
        i + "@qq.com", 
        "avatar.png") // 頭像實(shí)際在模板中寫死了
      ) ;
  }
}

以上工作做完后接下來(lái)就可以進(jìn)行PDF的生成了。我這里會(huì)直接通過(guò)一個(gè)Controller接口生成&下載PDF文檔。

2.4 生成PDF

@RestController
@RequestMapping("/users")
public class UserController {
  private final Configuration cfg ;
  public UserController(Configuration cfg) {
    this.cfg = cfg ;
  }
  
  // 生成PDF
  @GetMapping("/gen")
  public Object gen(HttpServletResponse response) {
    // 設(shè)置文件下載Header
    String fileName = new String("用戶列表.pdf".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) ;
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    response.setContentType("application/octet-stream") ;
    try {
      // 獲取模板
      Template template = this.cfg.getTemplate("users.ftl") ;
      // 準(zhǔn)備模板需要的數(shù)據(jù)
      Map<String, Object> root = new HashMap<>() ;
      root.put("users", DATAS) ;
      // 生成HTML內(nèi)容到內(nèi)存中
      ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
      Writer out = new OutputStreamWriter(baos) ;
      template.process(root, out) ;
      
      // 將上面生成的HTML內(nèi)容進(jìn)行解析
      Document document = Jsoup.parse(baos.toString(StandardCharsets.UTF_8), "UTF-8") ;
      // 設(shè)置HTML語(yǔ)法
      document.outputSettings().syntax(Document.OutputSettings.Syntax.html) ;
      // 構(gòu)建PDF文檔,最后將上面的Document進(jìn)行輸出
      PdfRendererBuilder builder = new PdfRendererBuilder();
      // 使用字體,字體名要與模板中CSS樣式中指定的字體名相同
      builder.useFont(new ClassPathResource("/fonts/BabelStoneHan.ttf").getFile(), "BabelStoneHan", 1, BaseRendererBuilder.FontStyle.NORMAL, true);
      builder.toStream(response.getOutputStream()) ;
      builder.useFastMode() ;
      builder.withW3cDocument(new W3CDom().fromJsoup(document), new ClassPathResource("/templates/").getPath());
      builder.run() ;
    } catch (Exception e) {
      e.printStackTrace() ;
    }
    return "生成成功" ;
  }
}

測(cè)試訪問(wèn)/users/gen接口。

圖片圖片

PDF文檔正常生成了。

總結(jié):OpenHtmlToPdf 是一個(gè)功能強(qiáng)大的開(kāi)源Java庫(kù),專為將HTML內(nèi)容轉(zhuǎn)換為高質(zhì)量的PDF文檔而設(shè)計(jì)。它以其出色的HTML和CSS兼容性、靈活的配置選項(xiàng)以及易于集成的特點(diǎn)而廣泛的認(rèn)可和應(yīng)用。

責(zé)任編輯:武曉燕 來(lái)源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2024-08-30 11:28:09

2024-09-30 08:10:22

2023-02-26 10:16:19

JavaPDF文檔

2024-09-03 08:26:59

Spring格式模板

2022-11-23 07:30:11

2023-12-12 13:42:00

微服務(wù)生態(tài)系統(tǒng)Spring

2023-12-29 09:04:01

前端文件處理庫(kù)PDF.js

2024-08-13 10:36:25

SpringScrew數(shù)據(jù)庫(kù)

2010-08-25 08:58:32

HTML

2021-09-15 07:33:33

Java開(kāi)發(fā)在線

2024-11-29 12:58:13

2023-07-04 08:38:22

AIDevOps軟件

2025-07-11 04:00:00

2009-08-24 18:00:52

ASP.NET模板生成

2025-09-26 02:00:00

Spring接口開(kāi)發(fā)

2012-07-19 09:38:04

Office 2013

2025-07-14 05:00:00

監(jiān)控系統(tǒng)工具

2021-03-18 07:33:54

PDF DinkToPdfC++

2023-07-06 22:29:22

pdftkPDF書簽

2020-10-09 09:40:59

GNOME桌面主題桌面應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

极品尤物一区二区三区| 在线激情影院一区| 日韩免费在线播放| 在线免费看黄视频| 色综合久久久| 午夜在线电影亚洲一区| 欧美一进一出视频| 国产一级一片免费播放放a| 国产精品17p| 欧洲精品一区二区三区在线观看| 国产日韩视频在线播放| 日本高清视频网站| 日本伊人精品一区二区三区观看方式| 日韩欧美国产精品一区| 毛片在线视频播放| 98在线视频| 香蕉国产精品偷在线观看不卡| 久久久综合视频| 欧美又大又粗又长| √天堂中文官网8在线| 精品少妇一区| 亚洲综合色噜噜狠狠| 欧美污视频久久久| 精品国产av一区二区| 首页综合国产亚洲丝袜| 欧美日本中文字幕| 日本在线观看网址| 欧美美女啪啪| 日韩丝袜情趣美女图片| 宅男噜噜噜66国产免费观看| 欧美黑人猛交的在线视频| 国产欧美日韩视频一区二区| 不卡一区二区三区视频| 中文字幕一级片| 一区二区毛片| 亚洲乱码国产乱码精品精| 久久6免费视频| 成人免费看视频网站| 一区二区三区加勒比av| 亚洲最大色综合成人av| 你懂的在线播放| 日韩精品三区四区| 午夜剧场成人观在线视频免费观看| 国精产品久拍自产在线网站| 亚洲区小说区图片区qvod| 欧美videossexotv100| 99久久99精品| 国产精品蜜月aⅴ在线| 色综合久久综合网| 日本免费黄视频| 国产777精品精品热热热一区二区| 亚洲欧洲综合另类在线| 欧美爱爱视频网站| 永久免费在线观看视频| 国产精品白丝av| 国产日韩综合一区二区性色av| 纪美影视在线观看电视版使用方法| 精品按摩偷拍| 亚洲精品www久久久| 97中文字幕在线观看| 天堂久久av| 精品裸体舞一区二区三区| 国偷自产av一区二区三区麻豆| 日韩在线亚洲| 精品三级av在线| 国产无套精品一区二区三区| 凹凸成人在线| 亚洲成色777777女色窝| 韩国日本美国免费毛片| 你懂得影院夜精品a| 欧美午夜一区二区三区| 性欧美1819| 免费一级欧美在线观看视频| 欧美精品在线视频| 日韩av加勒比| 成人高潮a毛片免费观看网站| 日韩精品在线一区| 91人妻一区二区| 欧美理伦片在线播放| 亚洲人午夜色婷婷| 殴美一级黄色片| 中文一区一区三区免费在线观看| 欧美日韩aaaa| www.日本精品| 琪琪一区二区三区| 亚洲综合精品伊人久久| 你懂的网站在线| 久久久久国产一区二区三区四区 | 亚洲欧洲久久| 成人午夜在线影视| 亚洲成av人片www| 18岁视频在线观看| 91成人小视频| 欧美精品一区二区不卡| 午夜激情在线观看视频| 日本在线一区二区| 亚洲精品在线免费观看视频| 97伦伦午夜电影理伦片| 在线免费观看日本欧美爱情大片| 久久免费视频这里只有精品| 国产精品久久久久久久久夜色| 欧美在线三级| 2020久久国产精品| 国产精品久久久久久久久久久久久久久久久久 | 亚洲男女性事视频| 午夜三级在线观看| 亚洲精品综合| 国产精品自拍偷拍| 国精品人妻无码一区二区三区喝尿 | 97视频在线免费观看| 中文字幕久久久久| 9久草视频在线视频精品| 日本午夜精品一区二区| 国产在线xxx| 欧美日韩亚洲丝袜制服| 国产黑丝在线观看| 97精品国产| 亚洲日本欧美日韩高观看| 午夜国产小视频| 国产女优一区| www.成人av.com| 日本在线观看www| 欧美日韩在线影院| 亚洲精品鲁一鲁一区二区三区| 欧美最新另类人妖| 97香蕉久久夜色精品国产| 一级片在线免费观看视频| 久久日韩粉嫩一区二区三区| a级片一区二区| 成人黄色图片网站| 日韩精品免费视频| 一区二区三区免费高清视频 | 亚洲精品videosex极品| 男操女免费网站| 性欧美xxxx免费岛国不卡电影| 欧美精品情趣视频| 一区二区久久精品66国产精品 | 国产二区不卡| 精品国精品国产自在久不卡| 国产色产综合产在线视频| 亚洲色欲久久久综合网东京热| 99精品美女视频在线观看热舞| 亚洲视频免费一区| aaa在线视频| 26uuu国产一区二区三区| 精品成在人线av无码免费看| 国产精久久一区二区| 日韩小视频在线观看| 精人妻无码一区二区三区| www国产成人免费观看视频 深夜成人网| 搞av.com| 国产精品毛片av| 久久免费视频网| 少妇一级淫片免费看| 亚洲第一在线综合网站| 女同性恋一区二区三区| 亚洲精品视频啊美女在线直播| 国产精品综合久久久久久| 黄色网址在线免费观看| 91.com视频| 丝袜美腿小色网| 国产精品18久久久久久久久| 黄色录像特级片| 97视频一区| 91精品91久久久久久| 免费观看成年在线视频网站| 91九色最新地址| 色婷婷国产精品免| 韩国欧美国产1区| 免费的一级黄色片| 久久男人av| 欧美专区在线视频| 成人免费在线电影| 91精品国产一区二区三区香蕉| 国产suv精品一区二区68| 国产999精品久久久久久| 免费观看国产精品视频| 久久99高清| 国产在线精品播放| 欧美野外wwwxxx| 日韩av一区二区在线观看| www.欧美色| 最新国产成人在线观看| 欧美做受高潮中文字幕| 亚洲欧美久久久| 亚洲最大免费| 卡一精品卡二卡三网站乱码| 日本久久精品视频| 国产在线观看91| 亚洲精品99久久久久| 美女黄页在线观看| 亚洲一区在线观看网站| 波多野结衣av在线观看| 国产一区二区在线观看视频| www.射射射| 白嫩亚洲一区二区三区| 欧美激情在线一区| 国产视频精品久久| 欧美一区二区观看视频| 影音先锋亚洲天堂| 国产精品久久夜| 国产白袜脚足j棉袜在线观看| 久久一区亚洲| 成人区一区二区| 禁断一区二区三区在线| 99电影在线观看| 国产成人精品一区二三区在线观看| 操日韩av在线电影| 国产色在线视频| 福利视频第一区| 国产麻豆xxxvideo实拍| 美腿丝袜亚洲色图| 男女激情无遮挡| 午夜精品毛片| 久久99精品久久久久久青青日本 | 国产伊人精品在线| 筱崎爱全乳无删减在线观看| 久热精品视频在线观看| 日本成人一区| 欧美成人vr18sexvr| 中文字幕丰满人伦在线| 欧美日韩在线第一页| 成人免费视频网站入口::| 国产日韩av一区| 成人免费无码大片a毛片| 国产综合色视频| 天天爽夜夜爽一区二区三区| 99在线精品免费视频九九视| 中文字幕人妻熟女人妻洋洋| 日韩激情免费| 欧美激情导航| 国产欧美三级电影| 91视频最新| 国精品产品一区| 国产精品777| 台湾佬中文娱乐网欧美电影| 欧美激情视频播放| 一色桃子av在线| 不卡伊人av在线播放| 黄网站免费在线播放| 中文字幕国产日韩| sese一区| 一本久久综合亚洲鲁鲁| 视频二区在线| 色婷婷综合久色| 中日韩黄色大片| 午夜伊人狠狠久久| 国产精品美女久久久久av爽| 亚洲午夜av在线| 国产一级特黄aaa大片| 亚洲午夜视频在线| 免费在线看黄网址| 亚洲一区二区三区自拍| 欧美日韩在线观看免费| 亚洲三级电影网站| 麻豆视频在线免费看| 亚洲乱码精品一二三四区日韩在线 | 亚洲欧美偷拍一区| 欧美日韩国产精品一区二区不卡中文| 日本黄色片视频| 福利一区福利二区微拍刺激| av资源免费观看| 色天天综合色天天久久| 国产在线观看第一页| 欧美日韩午夜精品| 国产毛片一区二区三区va在线| 91精品国产aⅴ一区二区| 国产视频在线免费观看| 日韩欧美aaaaaa| 丰满人妻一区二区三区免费视频| 亚洲精品xxx| 久久久资源网| 色av中文字幕一区| 最近中文字幕免费mv2018在线| 欧美日韩国产成人高清视频| 黄色视屏在线免费观看| 日本久久中文字幕| 欧美特黄色片| 99在线首页视频| 日韩欧美在线精品| 亚洲国产婷婷香蕉久久久久久99| 亚洲国产精品久久久天堂| 大荫蒂性生交片| 久久影院亚洲| 成人av毛片在线观看| 不卡大黄网站免费看| 欧洲女同同性吃奶| 亚洲人一二三区| 久久青青草原亚洲av无码麻豆| 欧美日韩一区二区在线观看视频| 精品人妻无码一区二区| 精品在线欧美视频| 精品人妻无码一区二区色欲产成人 | 最新亚洲国产精品| 电影k8一区二区三区久久 | 亚洲第一综合天堂另类专 | 欧美成人免费在线观看| rebdb初裸写真在线观看| 国产精品久久一区| 国产主播性色av福利精品一区| 色播五月综合| 国产精品v欧美精品v日本精品动漫| 国产一区二区三区精彩视频| 国产综合色视频| 国产亚洲精品熟女国产成人| 亚洲综合一区二区三区| 亚洲高清在线看| 欧美电视剧在线看免费| www.亚洲.com| 91av视频在线观看| 视频二区欧美毛片免费观看| 日韩av一级大片| 亚洲精品资源| 免费欧美一级片| 亚洲国产精华液网站w| 日韩免费一级片| 日韩一区二区三免费高清| 国产区高清在线| 538国产精品一区二区在线| 深夜日韩欧美| 欧美一区免费视频| 亚洲日本国产| 男插女视频网站| 国产精品一二二区| 非洲一级黄色片| 五月婷婷激情综合网| a视频免费在线观看| 伊人一区二区三区久久精品| 美女在线视频免费| 国产福利久久| 欧美日韩精品一本二本三本| 中文字幕22页| 国产精品三级电影| 精品久久久久久久久久久久久久久久| 亚洲精品一区二区三区影院| 亚洲综合伊人久久大杳蕉| 国产人妖伪娘一区91| av在线不卡免费观看| 国模吧无码一区二区三区| 成人福利视频在线看| 久久久久成人网站| 精品久久五月天| 先锋成人av| **亚洲第一综合导航网站| 国产精品7m凸凹视频分类| 性刺激的欧美三级视频| 日本一区二区成人在线| 亚洲精品一区二三区| 在线精品91av| 国产精品第一| 一个色的综合| 激情文学综合插| 成人在线观看免费完整| 欧美一区二区三区免费观看视频 | 91视频免费播放| 中文字幕超碰在线| 亚洲欧美国内爽妇网| 欧美美女日韩| 先锋在线资源一区二区三区| 免费高清成人在线| 欧美一区免费观看| 日韩一区二区三区在线视频| 中文字幕有码在线观看| 国产精品国产一区二区| 99国产精品久久久久久久| 成人午夜剧场视频网站| 欧美在线观看你懂的| 午夜免费播放观看在线视频| 91久久国产婷婷一区二区| 日本欧美韩国国产| 欧美性大战久久久久xxx| 久久久高清一区二区三区| 国产91av在线播放| 精品国产欧美一区二区三区成人| 年轻的保姆91精品| 日韩欧美亚洲日产国产| 麻豆久久久久久| 欧美卡一卡二卡三| 日韩av在线免费观看| 成人啊v在线| 真人做人试看60分钟免费| 不卡影院免费观看| 日韩xxx视频| 欧美大片免费观看在线观看网站推荐 | 狠狠躁夜夜躁人人爽天天天天97 | 国产成人精品网址| 91国产丝袜播放在线| 一区二区亚洲精品国产| www久久久| 日本毛片在线免费观看| 国产精品少妇自拍| 空姐吹箫视频大全| 国产精品9999| 国语精品一区| 欧美人妻一区二区三区| 日韩午夜三级在线| 欧美不卡高清一区二区三区| 日本成人在线不卡| 国产亚洲一本大道中文在线| 国产熟女一区二区三区四区|