1.引入maven

<!--pdf-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>4.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>font-asian</artifactId>
            <version>7.2.3</version>
        </dependency>

2.工具类

public class PdfUtil {

static {
        // Velocity初始化
        Velocity.setProperty(RuntimeConstants.OUTPUT_ENCODING, StandardCharsets.UTF_8);
        Velocity.setProperty(RuntimeConstants.INPUT_ENCODING, StandardCharsets.UTF_8);
        Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        Velocity.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
        Velocity.init();
    }

/**
     * 据模板生成pfd格式文件
     * @param context      上下文对象
     * @param template     pdf模板
     * @param outputStream 生成ofd文件输出流
     */
    public static void pdfFile(Context context, String template, OutputStream outputStream) {
        try (PdfWriter pdfWriter = new PdfWriter(outputStream)) {
            PdfDocument pdfDocument = new PdfDocument(pdfWriter);
            pdfDocument.setDefaultPageSize(PageSize.A4);

ConverterProperties properties = new ConverterProperties();
            FontProvider fontProvider = new FontProvider();
            // 字体设置,解决中文不显示问题
            PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");
            fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H");
            properties.setFontProvider(fontProvider);

Template pfdTemplate = Velocity.getTemplate(template, "UTF-8");
            StringWriter writer = new StringWriter();
            pfdTemplate.merge(context, writer);
            HtmlConverter.convertToPdf(writer.toString(), pdfDocument, properties);
            pdfDocument.close();
        } catch (Exception e) {
            throw new RuntimeException("PFD文件生成失败", e);
        }
    }

}

3.工具类调用

@GetMapping("/downDetailPdf")
@ApiOperation(value = "导出对账单详情pdf", notes = "导出对账单详情pdf)")
public void downDetailPdf(StatementLinePageRequest request, HttpServletResponse response)  {String statementCode = request.getStatementCode();String companyId = request.getCompanyId();if (StringUtils.isEmpty(statementCode) && StringUtils.isEmpty(statementCode)) {throw new RuntimeException(EnterpriseExcelptionEnum.PARAM_NULL.getMsg());}try {XLBaseResponse<StatementHeaderResponse> statementResponse = statementService.getStatementResponse(statementCode, companyId);if(!statementResponse.isOk() || null == statementResponse.getBody()){throw new RuntimeException("对账单不存在");}XLBaseResponse<StatementDetailPageResponse> detailPage = statementService.getDetailPage(statementCode, companyId, request);if(detailPage.isOk()){StatementDetailPageResponse body = detailPage.getBody();VelocityContext context = new VelocityContext();StatementHeaderResponse top = statementResponse.getBody();context.put("top", top);context.put("lines", 集合);String fileName = new String("对账单详情-".getBytes(), "ISO-8859-1") + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN) + ".pdf";response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf8");response.setHeader("Content-Disposition", "attachment; filename=" + fileName);response.setHeader("Cache-Control", "no-store");response.addHeader("Cache-Control", "max-age=0");PdfUtil.pdfFile(context,"templates/statementDetailsPdf.html", response.getOutputStream());}} catch (Exception e) {log.info("导出对账单详情pdf-异常:",e);throw new RuntimeException(EnterpriseExcelptionEnum.EXECUTE_FAILED.getMsg());}
}

4.html模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head><body><div class="ant-spin-container"><table><tr><td class="code">对账单编号:</td><td class="code">$!{top.statementCode}</td><td style="width: 176px;"><div class="status">$!{top.statementStatus}</div></td></tr></table></div>#if( !$orderChange)<div class="a1"><span class="src-display-modules-ReconciliationCollaboration-components-Modification-index__title--2ferw">本单有变更:</span><div class="src-display-modules-ReconciliationCollaboration-components-Modification-index__modificationData--2ViAS"><div class="src-display-modules-ReconciliationCollaboration-components-Modification-index__modificationItem--1nVb4">#foreach($order in $orderChange)<img src="templates/img/xxx.png" class="src-display-modules-ReconciliationCollaboration-components-Modification-index__linkIcon--G_CVd"><span>$order.statementCode</span><span class="src-display-modules-ReconciliationCollaboration-components-Modification-index__status--3LcrS">#if(!$line.statementStatus == 'DRAFT')草稿#elseif(!$line.statementStatus == 'SENT')已发送#elseif(!$line.statementStatus == 'RECEIVED')已接收#elseif(!$line.statementStatus == 'PART_ACCEPTED')部分确认#elseif(!$line.statementStatus == 'ACCEPTED')全部确认#elseif(!$line.statementStatus == 'SENT_FAIL')发送失败#else拒绝#end</span>#end</div></div></div>#end<div class="src-display-modules-ReconciliationCollaboration-Payables-Detail-index__statistic--uYrBi"><div class="src-display-modules-ReconciliationCollaboration-Payables-Detail-index__title--YJ_hx">统计</div><div class="src-display-modules-ReconciliationCollaboration-Payables-Detail-index__statisticData--Zxjwg"><div class="src-display-modules-ReconciliationCollaboration-Payables-Detail-index__statisticLabel--278xi"><div>总条目</div><div>总税额</div><div>总金额(不含税)</div><div>价税合计</div></div><div class="src-display-modules-ReconciliationCollaboration-Payables-Detail-index__statisticValue--agxcR"><div>$!{top.totalEntries}</div><div>$!{top.taxAmount}</div><div>$!{top.detailAmount}</div><div>$!{top.totalAmount}</div></div></div></div><div class="src-display-modules-ReconciliationCollaboration-Payables-Detail-index__dataList--3C17F"><div class="ant-spin-nested-loading"><table class="ant-table-fixed" style="width: max-content; "><tbody class="ant-table-tbody">#foreach($line in $lines)<tr class="ant-table-row ant-table-row-level-0" data-row-key="886490"><td class="" style="text-align: center;"><span class="ant-table-row-indent indent-level-0" style="padding-left: 0px;"></span><span>$line.lineNum</span></td><td class="" style="text-align: center;"><div style="color: rgb(153, 153, 153);">$line.changeFlag</div></td><td class="" style="text-align: center;"><div class="ellipsisText" style="width: 136px;"><span>#if(!$line.isConfirm == 1)待确认#elseif(!$line.isConfirm == 2)已确认#else拒绝#end</span></div></td><td class=""><div class="ellipsisText" style="width: 200px;"><span>$line.goodsCode</span></div></td></tr>#end</tbody></table></div></div></body>
</html>

注意

spring boot 转pdf (html转pdf)相关推荐

  1. 精通spring——深入java ee开发核心技术 pdf_2019精通Spring Boot 42讲 高清pdf完整版

    <精通springboot42讲价值99元入门到实教程>2019年最新spring boot教程,共计42讲从入门到精通,真正的实战教程. 课程内容和技术栈都会使⽤最新稳定版本,课程数量也 ...

  2. 玩转 Jasper Report(3)Spring Boot 2.4 集成 Jasper Report 导出 PDF

    文章目录 1 摘要 2 核心 Maven 依赖 3 核心代码 3.1 PDF 导出工具类 3.2 Jasper 导出模板 jrxml 文件 3.3 自定义字体配置 3.4 二维码设置 3.5 PDF导 ...

  3. Spring Boot:自定义starter

    来源:阿杜的世界 号外:最近整理了一下以前编写的一系列Spring Boot内容,整了个<Spring Boot基础教程>的PDF,关注我,回复:001,快来领取吧-!更多内容持续整理中, ...

  4. Spring Boot(2)---Spring Boot文档及其导航说明

    Spring Boot文档及其导航说明 TagsSpring Boot, Spring Boot中文官方文档 本节简要介绍Spring Boot参考文档.它作为文档其余部分的导航. 1.关于文档 Sp ...

  5. 超详细的Spring Boot教程,搞定面试官!

    前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  6. springboot实战pdf_腾讯架构师Spring Boot实战篇(PDF文档)

    前言: 什么是Spring Boot?? Spring Boot应用本质上就是一个基于Spring框架的应用 Spring Boot的核心是什么? 自动配置 起步依赖 Actuator 命令行界面(C ...

  7. springboot实战pdf_Java程序员中秋节福利发送:Spring boot+Redis实战文档「PDF」

    中秋节越来越近了,平日里,各大公司拼员工拼技术拼实力:到了节日,则要拼奖金.拼福利.拼假期,还要拼创意.今天,小编为大家也准备了一份中秋节礼物,让我们一起来看看礼物是啥吧! Spring boot文档 ...

  8. 深入实践 Spring Boot PDF 百度云盘下载

    1.深入实践 Spring Boot PDF,百度云链接~~ 免费下载! 之前为了学习Spring boot,在网上找的资源 (如有侵权,请联系博主,立马删除),电子文档还是比较清晰.这里记录一下,方 ...

  9. Spring boot基于itext实现定制化模板pdf生成功能

    最近被安排公司项目的一个活:根据给定的模板生成pdf,很多公司的项目涉及这种xxx单的生成,我这里是个检查单的生成,具体内容下面给出,和各位csdner一起分享学习一下,如有不对多多指教. 首先先看下 ...

  10. Spring Boot 提取pdf中的文字

    Spring Boot 提取pdf中的文字 提取pdf中的文字,由于字体不同,可能会提取出来乱码.(友情提示:建议先pdf文件转成图片,然后调用百度api提取文字,准确率高.跳转链接:https:// ...

最新文章

  1. java 读出数字声音_【求助】已经计算出的数字结果,想用声音播放出来。怎么弄!!!...
  2. 热门 | Google Brain前员工深度盘点2017人工智能和深度学习各大动态
  3. Dev-DXperience12.2版的新产品介绍:DXTREME
  4. arm-none-eabi-gcc 嵌入式交叉编译器安装 极简教程
  5. openssh升级后root_又一root神器停止营业!时至今日你还需要root吗
  6. jspstudy启动mysql失败_解决Mysql5.7.17在windows下安装启动时提示不成功问题
  7. android 开发日积月累,移动端h5开发常用ui框架
  8. WordPress收费下载插件Erphpdown v11.0
  9. Oracle dbv 坏块信息,【dbv】使用dbv工具检验数据文件是否有坏块
  10. IOS开发—系统定位
  11. [NOI2008]糖果雨
  12. 如何写出好文案,不妨看看这篇(上)
  13. Excel里如何设置保留几位小数
  14. Python数据分析 2.Matplotlib绘图—常用统计图
  15. 绿联外围设备_什么是外围设备(外围设备的类型和列表)?
  16. CHIL-SQL-UNIQUE 约束
  17. 魅力月全食,怎么看才过瘾?
  18. python:私有变量和私有方法
  19. 电工学复习【9】-- 触发器和时序逻辑电路
  20. js 转 ts 文件

热门文章

  1. 论文模型构建的步骤_最新论文:智能安全情报分析模型的构建
  2. LINQ编程之LINQ to SQL
  3. 硬件加密算法HITAG2流程分析
  4. 【Python】爬取理想论坛单帖爬虫
  5. 数据库关系运算:自然连接,投影,交,除,并
  6. openlayers 地图上加图标_OpenLayers教程:地图标注
  7. Metasploit-模块介绍
  8. 处理视频的md5值,完成视频防屏蔽功能
  9. mysql错误代码1068_数据库1068错误
  10. 解答2020国庆节建模竞赛题(第2赛季第18轮)