范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBoot将html页面转化为pdf文件

  废话不多说,先看效果图。
  本示例重要功能点: 访问 url 直接下载 pdf 文件,前后端分离的项目可能通过这种方式下载 pdf 文件; 将 html 页面(含中文、图片)转换成 pdf 文件
  技术栈: Flying Saucer thymeleaf 1、创建 Spring Boot 项目
  进入 http://start.spring.io 创建 Spring Boot 项目,Spring Boot 版本为 2.7.0,选择如下依赖: Starter:spring-boot-starter-web spring-boot-starter-thymeleaf lombok 2、修改 pom.xml 文件,添加将 html 页面转换成 pdf 文件需要的依赖:     org.xhtmlrenderer     flying-saucer-pdf     9.1.22       commons-io     commons-io     2.11.0       ognl     ognl     3.1.29       com.github.jtidy     jtidy     1.0.2 3、创建演示数据需要的实体类 —— Student.javaimport lombok.Builder; import lombok.Data;  @Data @Builder public class Student {     private Integer id;     private String name;     private String gender;     private Integer age; }4、创建具体的业务处理类 —— PdfService.javaimport com.lowagie.text.DocumentException; import com.lowagie.text.pdf.BaseFont; import com.wangc.downloadpdf.entity.Student; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import org.w3c.tidy.Tidy; import org.xhtmlrenderer.pdf.ITextRenderer;  import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.List;  @Slf4j @Service public class PdfService {      @Resource     private TemplateEngine templateEngine;      public ByteArrayInputStream exportPdf(String template, List students) throws Exception {         Context context = new Context();         context.setVariable("students", students);         String content = convertToXhtml(templateEngine.process(template, context));          ByteArrayInputStream byteArrayInputStream = null;         try {             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();             ITextRenderer renderer = new ITextRenderer();             renderer.getFontResolver().addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);             renderer.setDocumentFromString(content);             renderer.layout();             renderer.createPDF(byteArrayOutputStream, false);             renderer.finishPDF();             byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());         } catch (DocumentException e) {             log.error(e.getMessage(), e);         }          return byteArrayInputStream;     }      private String convertToXhtml(String htmlContent) throws UnsupportedEncodingException {         Tidy tidy = new Tidy();         tidy.setInputEncoding("UTF-8");         tidy.setOutputEncoding("UTF-8");         tidy.setXHTML(true);         ByteArrayInputStream inputStream = new ByteArrayInputStream(htmlContent.getBytes(StandardCharsets.UTF_8));         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();         tidy.parseDOM(inputStream, outputStream);         return outputStream.toString("UTF-8");     }  }5、创建控制器 —— PdfController.javaimport com.wangc.downloadpdf.entity.Student; import com.wangc.downloadpdf.service.PdfService; import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.ModelAndView;  import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream;  @Controller public class PdfController {      @Resource     private PdfService pdfService;      @GetMapping("/downloadPdf")     public void downloadPdf(HttpServletResponse response) throws Exception {         List students = createTestData();         ByteArrayInputStream byteArrayInputStream = pdfService.exportPdf("students", students);          response.setContentType("application/octet-stream");         response.setHeader("Content-Disposition", "attachment; filename=receipt.pdf");         IOUtils.copy(byteArrayInputStream, response.getOutputStream());     }      // 效果预览     @GetMapping("/view")     public ModelAndView view() throws Exception {         List students = createTestData();          ModelAndView mv = new ModelAndView();         mv.setViewName("students");         mv.addObject("students", students);         return mv;     }      // 测试数据     private List createTestData() {         final List students = IntStream.range(1, 10)                 .mapToObj(v -> Student.builder()                         .id(v)                         .name("学生" + v)                         .age(16)                         .gender(v % 2 == 0 ? "男" : "女")                         .build())                 .collect(Collectors.toList());         return students;     } }6、创建 html 模板 —— students.html            Students View                   

Id 姓名 性别 年龄
7、启动项目   访问 http://localhost:9090/view 查看 html 页面效果。访问 http://localhost:9090/downloadPdf 下载 pdf 文件。

18年的那支火箭,今年可以拿到冠军吗18年西决勇士与火箭史诗级的对决,应该有不少人,至今记忆犹新,津津乐道。曾经把勇士逼到悬崖边的那支火箭队,如果放在今年,可以拿到冠军吗?18年火箭阵容詹姆斯。哈登场均可以砍下30。你的蓝牙信号可能正在使你被跟踪科幻网6月12日讯(刘亚珠)蓝牙技术是一种无线数据和语音通信开放的全球规范,使当前的一些便携移动设备和计算机设备在无电缆的情况下近距离无线连接互联网。蓝牙模式已经渗透进入我们生活的华为应该是现在大厂里对35岁以上的人最友好的刚才看到网友爆料,36岁拿到华为offer,咨询要不要去,纠结后面出来不好找工作。都说华为有35岁政策,其实淘汰的都是能力不行的,其他大厂可能不到35就被毕业了。就我认识的各种大厂王传福拿出新的杀手锏,比亚迪双箭齐发连续三个月销量超10万台,并成为首个万亿市值的自主车企,全球排名第三,比亚迪双喜临门。无可阻挡的前行步伐之下,王传福又拿出新的杀手锏,比亚迪这一次双箭齐发。1。力压大众全球排名第三李佳琦露出618另一面报名参加活动吧。618前夕,一位经营服饰的商家收到了好几条各个电商平台小二发来的消息,但已参加了无数次大促活动的商家却兴致缺缺。在电商平台经营鸡爪店的冯斌告诉字母榜,往年618,他晨意帮忙租车公司失联,网约车司机停交租金结果车被拖走,公司这样回应我想退车找不到公司,但车却被公司给拖走了!6月10日,长沙市民吴先生通过今日头条长沙频道找到潇湘晨报晨意帮忙记者,希望能够帮忙联系上公司。去年10月,吴先生在长沙市岳麓区东方红大厦刘春红来自农村的奥运冠军,29次破世界纪录却因禁药成一生污点2004年雅典奥运会,女子举重69公斤级,这枚金牌从一开始中国队就没有竞争对手,世锦赛新科冠军刘春红几乎在这个项目具有碾压级别的实力,半年前的世锦赛第一次参赛的刘春红连获挺举抓举和纳达尔服用兴奋剂?WADA力挺网坛天王这是关于医疗与道德的辩论在今年的法网赛事上,网坛天王纳达尔再创佳绩,斩获生涯第14个法网冠军,同时也是生涯第22个大满贯冠军。要知道,纳达尔已经年满36周岁,在这个年纪还拥有强大的统治力,这确实值得大家的号外41岁乒乓球老将波尔骨折,德甲联赛决赛大逆转,杜塞庆功乒坛常青树波尔比赛中肋骨骨折,坚持比赛体育精神值得钦佩号外41岁乒乓球老将波尔,在2022德甲联赛决赛中肋骨骨折。周六在法兰克福的Ballsporthalle球场,杜塞尔多夫(Bo中国女排天津球员李盈莹适合加盟的土超球队维持球员竞技状态,需要一定数量的比赛。通过比赛,可以积累丰富的比赛经验,检验个人训练水平,反思个人备赛策略,而这种经验从长远来说,对于球员成长是非常有帮助的,比赛经验越丰富,就越能被勇士剔除!从夺冠功勋到万人唾弃,球队已经没有他的容身之地全场26投14中,三分球14中7狂砍43分10篮板4助攻,库里在总决赛G4倾其所有,将一条腿踏入悬崖的勇士队及时拉了回来,系列赛如愿进入天王山决战。事实上,球队领袖的疯狂表演掩盖了
故事连环画大盗贼第一次出现浙江少年儿童出版社。。。。。。浙江5大富豪,4位曾登顶中国首富,还有一位是梅赛德斯奔驰大股东在改革开放之后,我国在经济的发展方面取得了非常傲人的成绩。近几年的疫情虽然严重,但是我们的经济发展增幅,依旧位于世界前列。而我国东南部的浙江省,更是我国最发达的几个省份之一,可以作中超最新积分榜泰山绝杀亚泰稳居第2,浙江队2球完胜攀升第8今天,中超联赛第9轮先战2场,山东泰山21击败长春亚泰,稳居联赛第2位,克雷桑连场破门,儒尼奥尔扳平比分,陈蒲打进绝杀入球浙江队20击败大连人,升至积分榜第8位,穆谢奎攻破旧主球门浙江有一座小城,叫仙居公元1007年,宋真宗赵恒,将目光锁在叫永安的小城,这里群山叠翠,云雾缭绕,是当时的宗教圣地。洞天名山屏蔽周卫,而多神仙之宅。于是便下诏,赐名仙居。这大概是浙江仙居,历史上第一次出陈亚男秀恩爱,新男友是健身房老板肌肉发达,两人一起锻炼产生感情7月4日,陈亚男在社交平台上更新一组健身视频,因与视频中的教练互动暧昧,引发网友热议。画面中,她身穿一袭黑色的健身衣,头发随意扎起,身材整体看起来很苗条。对比以往精致的妆容,此次陈贝克汉姆夫妇庆祝结婚纪念日,23年感情不变,小贝放飞告白气球日前,贝克汉姆和维多利亚夫妇开启了一段愉快浪漫的法国意大利之旅,这也是为了庆祝二人结婚23周年。虽然早就退役了,但是小贝夫妇依旧是足球圈时尚界的宠儿,他们的一举一动都能上热搜。19黄健翔若明年亚洲杯国足能进前八,可以说进世界杯有一线希望直播吧8月1日讯今天,亚足联官方宣布了2026年世界杯亚洲区参赛名额和具体赛制,确定亚洲区预选赛直通名额为6个,亚洲附加赛直通名额为2个,还有0。5个洲际附加赛名额。著名足球评论员中国天才加入日本籍,为其效力,以打败中国为荣,退役却想回国中国天才加入日本籍,为其效力,以打败中国为荣,退役却想回国姚明退役后,中国男篮迎来低谷。在世界大赛的舞台上,男篮很难取胜。我们曾经是亚洲霸主,但在过去两届亚洲杯上,我们都未能闯入前CUBA新科MVP邹阳,8画面4细节对比,模板很像火箭新星文水清清昨晚,清华大学8986击败广东工业大学实现三连冠,邹阳25分10篮板4助攻3抢断,力压25分9篮板6助攻的状元王岚嵚,捧起总决赛MVP奖杯,于是球迷热议,邹阳有望成为明年状韩国白富美金智善,不顾一切嫁给中国穷小伙,他们是如何结缘的如果您喜欢这篇文章,请点击右上方的关注。感谢您的鼓励与支持,希望能给您带来舒适愉悦的阅读体验。15年前,一位来自韩国的白富美女孩爱上了中国的一位穷小伙,更是女追男不顾家人反对嫁到了40岁瓦妮莎近照,清瘦了好多!1家4口观战女足赛,晒二女儿球衣40岁的科比遗孀瓦妮莎通过个人INS状态,分享了一组现场观战女足比赛的照片,她带着三个女儿现场助阵天使城女足的比赛,并且在赛后与女足球员好友合影,看得出来,这次亮相瓦妮莎的身材恢复