diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/HtmlToPdfInterceptor.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/HtmlToPdfInterceptor.java index e6a4c99..75a37c0 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/HtmlToPdfInterceptor.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/HtmlToPdfInterceptor.java @@ -1,2 +1,37 @@ -package cn.iocoder.yudao.framework.common.util.pdf;public class HtmlToPdfInterceptor { +package cn.iocoder.yudao.framework.common.util.pdf; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * html转pdf拦截器 + * @author liqiang + * @date 2021/05/12 + */ +public class HtmlToPdfInterceptor extends Thread { + /** + * 输入流对象 + */ + private InputStream is; + + public HtmlToPdfInterceptor(InputStream is){ + this.is = is; + } + + @Override + public void run(){ + try{ + InputStreamReader isr = new InputStreamReader(is, "utf-8"); + BufferedReader br = new BufferedReader(isr); + String line = null; + while ((line = br.readLine()) != null) { + //输出内容 + System.out.println(line.toString()); + } + }catch (IOException e){ + e.printStackTrace(); + } + } } diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/WkHtmlToPdfUtil.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/WkHtmlToPdfUtil.java index bbad771..cd4281b 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/WkHtmlToPdfUtil.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/pdf/WkHtmlToPdfUtil.java @@ -1,2 +1,207 @@ -package cn.iocoder.yudao.framework.common.util.pdf;public class WkHtmlToPdfUtil { +package cn.iocoder.yudao.framework.common.util.pdf; + +import java.io.File; + +/** + * Input表单或JavaScript脚本支持:--enable-forms,下面这些是网友整理的参数说明 + * wkhtmltopdf [OPTIONS]... [More input files] + * 常规选项 + * --allow 允许加载从指定的文件夹中的文件或文件(可重复) + * --book* 设置一会打印一本书的时候,通常设置的选项 + * --collate 打印多份副本时整理 + * --cookie 设置一个额外的cookie(可重复) + * --cookie-jar 读取和写入的Cookie,并在提供的cookie jar文件 + * --copies 复印打印成pdf文件数(默认为1) + * --cover* 使用HTML文件作为封面。它会带页眉和页脚的TOC之前插入 + * --custom-header 设置一个附加的HTTP头(可重复) + * --debug-javascript 显示的javascript调试输出 + * --default-header* 添加一个缺省的头部,与页面的左边的名称,页面数到右边,例如: --header-left '[webpage]' --header-right '[page]/[toPage]' --header-line + * --disable-external-links* 禁止生成链接到远程网页 + * --disable-internal-links* 禁止使用本地链接 + * --disable-javascript 禁止让网页执行JavaScript + * --disable-pdf-compression* 禁止在PDF对象使用无损压缩 + * --disable-smart-shrinking* 禁止使用WebKit的智能战略收缩,使像素/ DPI比没有不变 + * --disallow-local-file-access 禁止允许转换的本地文件读取其他本地文件,除非explecitily允许用 --allow + * --dpi 显式更改DPI(这对基于X11的系统没有任何影响) + * --enable-plugins 启用已安装的插件(如Flash + * --encoding 设置默认的文字编码 + * --extended-help 显示更广泛的帮助,详细介绍了不常见的命令开关 + * --forms* 打开HTML表单字段转换为PDF表单域 + * --grayscale PDF格式将在灰阶产生 + * --help Display help + * --htmldoc 输出程序HTML帮助 + * --ignore-load-errors 忽略claimes加载过程中已经遇到了一个错误页面 + * --lowquality 产生低品质的PDF/ PS。有用缩小结果文档的空间 + * --manpage 输出程序手册页 + * --margin-bottom 设置页面下边距 (default 10mm) + * --margin-left 将左边页边距 (default 10mm) + * --margin-right 设置页面右边距 (default 10mm) + * --margin-top 设置页面上边距 (default 10mm) + * --minimum-font-size <) + * --no-background 不打印背景 + * --orientation 设置方向为横向或纵向 + * --page-height 页面高度 (default unit millimeter) + * --page-offset* 设置起始页码 (default ) + * --page-size 设置纸张大小: A4, Letter, etc. + * --page-width 页面宽度 (default unit millimeter) + * --password HTTP验证密码 + * --post Add an additional post field (repeatable) + * --post-file Post an aditional file (repeatable) + * --print-media-type* 使用的打印介质类型,而不是屏幕 + * --proxy 使用代理 + * --quiet Be less verbose + * --read-args-from-stdin 读取标准输入的命令行参数 + * --readme 输出程序自述 + * --redirect-delay 等待几毫秒为JS-重定向(default ) + * --replace* 替换名称,值的页眉和页脚(可重复) + * --stop-slow-scripts 停止运行缓慢的JavaScripts + * --title 生成的PDF文件的标题(第一个文档的标题使用,如果没有指定) + * --toc* 插入的内容的表中的文件的开头 + * --use-xserver* 使用X服务器(一些插件和其他的东西没有X11可能无法正常工作) + * --user-style-sheet 指定用户的样式表,加载在每一页中 + * --username HTTP认证的用户名 + * --version 输出版本信息退出 + * --zoom <) + *

+ * 页眉和页脚选项 + * --header-center* (设置在中心位置的页眉内容) + * --header-font-name* (default Arial)(设置页眉的字体名称) + * --header-font-size* (设置页眉的字体大小) + * --header-html* (添加一个HTML页眉,后面是网址) + * --header-left* (左对齐的页眉文本) + * --header-line* (显示一条线在页眉下) + * --header-right* (右对齐页眉文本) + * --header-spacing* (设置页眉和内容的距离,默认0) + * --footer-center* (设置在中心位置的页脚内容) + * --footer-font-name* (设置页脚的字体名称) + * --footer-font-size* (设置页脚的字体大小default ) + * --footer-html* (添加一个HTML页脚,后面是网址) + * --footer-left* (左对齐的页脚文本) + * --footer-line* 显示一条线在页脚内容上) + * --footer-right* (右对齐页脚文本) + * --footer-spacing* (设置页脚和内容的距离) + *

+ * 页脚和页眉 + * [page] 由当前正在打印的页的数目代替 + * [frompage] 由要打印的第一页的数量取代 + * [topage] 由最后一页要打印的数量取代 + * [webpage] 通过正在打印的页面的URL替换 + * [section] 由当前节的名称替换 + * [subsection] 由当前小节的名称替换 + * [date] 由当前日期系统的本地格式取代 + * [time] 由当前时间,系统的本地格式取代 + *

+ * 轮廓选项 + * --dump-outline 转储目录到一个文件 + * --outline 显示目录(文章中h1,h2来定) + * --outline-depth 设置目录的深度(默认为4) + *

+ * 表内容选项中 + * --toc-depth* Set the depth of the toc (default) + * --toc-disable-back-links* Do not link from section header to toc + * --toc-disable-links* Do not link from toc to sections + * --toc-font-name* Set the font used for the toc (default Arial) + * --toc-header-font-name* The font of the toc header (if unset use --toc-font-name) + * --toc-header-font-size* The font size of the toc header (default) + * --toc-header-text* The header text of the toc (default Table Of Contents) + * --toc-l1-font-size* Set the font size on level of the toc (default) + * --toc-l1-indentation* Set indentation on level of the toc (default) + * --toc-l2-font-size* Set the font size on level of the toc (default) + * --toc-l2-indentation* Set indentation on level of the toc (default) + * --toc-l3-font-size* Set the font size on level of the toc (default) + * --toc-l3-indentation* Set indentation on level of the toc (default) + * --toc-l4-font-size* Set the font size on level of the toc (default) + * --toc-l4-indentation* Set indentation on level of the toc (default) + * --toc-l5-font-size* Set the font size on level of the toc (default) + * --toc-l5-indentation* Set indentation on level of the toc (default) + * --toc-l6-font-size* Set the font size on level of the toc (default) + * --toc-l6-indentation* Set indentation on level of the toc (default) + * --toc-l7-font-size* Set the font size on level of the toc (default) + * --toc-l7-indentation* Set indentation on level of the toc (default) + * --toc-no-dots* Do not use dots, in the toc + * ------------------------------------------------------------------------------------------------------------ + * @author liqiang + * @date 2021/05/12 + */ +public class WkHtmlToPdfUtil { + + /** + * 页面大小 + */ + public static String PAGE_SIZE_A4 = " --page-size A4 "; + /** + * 页码数字 + */ + public static String FOOTER_CENTER = " --footer-center \"第[page]页\" "; + + /** + * 页码大小 + */ + public static String FOOTER_FONT_SIZE =" --footer-font-size 10 "; + + /** + * 页码字体 + */ + public static String FOOTER_FONT_NAME =" --footer-font-name \"Microsoft YaHei\" "; + + /** + * 打印参数 + */ + public static String DPI = " --dpi 300 "; + + + public static String LOAD_ERROR_HANDLING_IGNORE = " --load-error-handling ignore "; + /** + * 关闭缩放 + */ + public static String DISABLE_SMART_SHRINKING = " --disable-smart-shrinking "; + + /** + * html转pdf + * + * @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径 + * @param file pdf文件 + * @return 转换成功返回true + */ + public static boolean convert(String srcPath, File file,String toPdfTool,String params) { + + File parent = file.getParentFile(); + // 如果pdf保存路径不存在,则创建路径 + if (!parent.exists()) { + parent.mkdirs(); + } + StringBuilder cmd = new StringBuilder(); +// String toPdfTool; +// if (!System.getProperty("os.name").contains("Windows")) { +// // 根据系统 +// // 非windows 系统 +// toPdfTool = "/usr/local/bin/wkhtmltopdf"; +// } else { +// toPdfTool = "D:/htmlTopdf/wkhtmltopdf/bin/wkhtmltopdf.exe"; +// } + toPdfTool += "wkhtmltopdf "; + // 这里可以拼接页眉页脚等参数 参数详情在上方 + cmd.append(toPdfTool); + cmd.append(params); + cmd.append(srcPath); + cmd.append(" "); + cmd.append(file.getAbsolutePath()); + + boolean result = true; + try { + + Process proc = Runtime.getRuntime().exec(cmd.toString()); + HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream()); + HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream()); + error.start(); + output.start(); + proc.waitFor(); + } catch (Exception e) { + result = false; + e.printStackTrace(); + } + return result; + } + + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 360e961..b542e0b 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -211,4 +211,6 @@ public interface ErrorCodeConstants { ErrorCode ROLE_ERROR = new ErrorCode(1-003-005-004, "请分配角色后再查看"); ErrorCode POLICY_NOT_EXISTS = new ErrorCode(1-003-006-001, "政策法规不存在"); + + ErrorCode JOB_INFO_NOT_EXISTS = new ErrorCode(1-003-007-001, "工作汇报不存在"); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/JobInfoController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/JobInfoController.java index eb780ac..a47ff18 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/JobInfoController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/JobInfoController.java @@ -63,9 +63,9 @@ public class JobInfoController { @GetMapping("/get") @Operation(summary = "获得工作汇报") @Parameter(name = "id", description = "编号", required = true, example = "1024") - public CommonResult getJobInfo(@RequestParam("id") Long id) { + public CommonResult getJobInfo(@RequestParam("id") Long id) { JobInfoDO jobInfo = jobInfoService.getJobInfo(id); - return success(BeanUtils.toBean(jobInfo, JobInfoRespVO.class)); + return success(BeanUtils.toBean(jobInfo, JobInfoRespDetailVO.class)); } @GetMapping("/page") @@ -75,6 +75,13 @@ public class JobInfoController { return success(BeanUtils.toBean(pageResult, JobInfoRespVO.class)); } + @GetMapping("/jobDetail") + @Operation(summary = "获取详细信息") + public CommonResult getJobDetail(Long id) { + String s = jobInfoService.htmlToPdf(id); + return success(s); + } + @GetMapping("/export-excel") @Operation(summary = "导出工作汇报 Excel") @ApiAccessLog(operateType = EXPORT) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoPageReqVO.java index 5b9fb09..4ace346 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoPageReqVO.java @@ -25,4 +25,7 @@ public class JobInfoPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "pdfURl") + private String pdfUrl; + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespDetailVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespDetailVO.java index 1d5d4c7..e44b07f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespDetailVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespDetailVO.java @@ -1,23 +1,22 @@ package cn.iocoder.yudao.module.system.controller.admin.jobinfo.vo; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; +import lombok.Data; import java.time.LocalDate; -import java.util.*; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import com.alibaba.excel.annotation.*; @Schema(description = "管理后台 - 工作汇报 Response VO") @Data @ExcelIgnoreUnannotated -public class JobInfoRespVO { +public class JobInfoRespDetailVO { @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "26792") @ExcelProperty("id") @@ -27,6 +26,9 @@ public class JobInfoRespVO { @ExcelProperty("汇报标题") private String title; + @Schema(description = "汇报详情") + private String content; + @Schema(description = "汇报日期") @ExcelProperty("汇报日期") @JsonSerialize(using = LocalDateSerializer.class) // 序列化(响应) @@ -42,4 +44,7 @@ public class JobInfoRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "pdfURl") + private String pdfUrl; + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespVO.java index 9c3527f..7a50749 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoRespVO.java @@ -1,5 +1,10 @@ package cn.iocoder.yudao.module.system.controller.admin.jobinfo.vo; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -24,6 +29,9 @@ public class JobInfoRespVO { @Schema(description = "汇报日期") @ExcelProperty("汇报日期") + @JsonSerialize(using = LocalDateSerializer.class) // 序列化(响应) + @JsonDeserialize(using = LocalDateDeserializer.class) // 反序列化(请求) + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate jobDate; @Schema(description = "汇报人姓名", example = "赵六") @@ -34,4 +42,7 @@ public class JobInfoRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "pdfURl") + private String pdfUrl; + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoSaveReqVO.java index 33b2598..a72e31d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/jobinfo/vo/JobInfoSaveReqVO.java @@ -1,5 +1,10 @@ package cn.iocoder.yudao.module.system.controller.admin.jobinfo.vo; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -20,9 +25,15 @@ public class JobInfoSaveReqVO { private String content; @Schema(description = "汇报日期") + @JsonSerialize(using = LocalDateSerializer.class) // 序列化(响应) + @JsonDeserialize(using = LocalDateDeserializer.class) // 反序列化(请求) + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate jobDate; @Schema(description = "汇报人姓名", example = "赵六") private String jobName; + @Schema(description = "pdfURl") + private String pdfUrl; + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/jobinfo/JobInfoDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/jobinfo/JobInfoDO.java index ab149c5..62b5f97 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/jobinfo/JobInfoDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/jobinfo/JobInfoDO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.dal.dataobject.jobinfo; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDate; @@ -46,4 +47,9 @@ public class JobInfoDO extends BaseDO { */ private String jobName; + /** + * pdfUrl + */ + private String pdfUrl; + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoService.java index d700efc..d087b86 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoService.java @@ -53,4 +53,6 @@ public interface JobInfoService { */ PageResult getJobInfoPage(JobInfoPageReqVO pageReqVO); + //使用胡tool的TemplateEngine 填充jobTemp 并保存到本地 + String htmlToPdf(Long id); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoServiceImpl.java index e212164..7e8b74d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/jobinfo/JobInfoServiceImpl.java @@ -1,20 +1,28 @@ package cn.iocoder.yudao.module.system.service.jobinfo; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.extra.template.Template; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.TemplateUtil; +import cn.iocoder.yudao.framework.common.util.pdf.WkHtmlToPdfUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; -import java.util.*; import cn.iocoder.yudao.module.system.controller.admin.jobinfo.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.jobinfo.JobInfoDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.dal.mysql.jobinfo.JobInfoMapper; import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; @@ -27,6 +35,12 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; @Validated public class JobInfoServiceImpl implements JobInfoService { + @Value("${yudao.htmlToPdf.tools}") + private String htmlToPdfTools; + + @Value("${yudao.htmlToPdf.jobTemp}") + private String htmlToPdfJobTemp; + @Resource private JobInfoMapper jobInfoMapper; @@ -72,4 +86,29 @@ public class JobInfoServiceImpl implements JobInfoService { return jobInfoMapper.selectPage(pageReqVO); } + //使用胡tool的TemplateEngine 填充jobTemp 并保存到本地 + @Override + public String htmlToPdf(Long id) { + JobInfoDO jobInfo = getJobInfo(id); + //根据jobTemp 打开文件 + TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig(htmlToPdfJobTemp, TemplateConfig.ResourceMode.FILE)); + + Template template = engine.getTemplate("jobTemp.html"); + + String content = template.render(Dict.create().set("content", jobInfo.getContent())); + + // 写入文件并返回File对象 + File file = FileUtil.writeUtf8String(content, htmlToPdfJobTemp + "test.html"); + // 调用wkhtmltopdf工具转换为pdf + // 这里的htmlToPdfTools是wkhtmltopdf的工具路径,htmlToPdfJobTemp是html文件路径,test.pdf是输出pdf文件路径 + File file1 = new File(htmlToPdfJobTemp + "test.pdf"); + + String params = WkHtmlToPdfUtil.DPI + WkHtmlToPdfUtil.PAGE_SIZE_A4 + WkHtmlToPdfUtil.DISABLE_SMART_SHRINKING+WkHtmlToPdfUtil.LOAD_ERROR_HANDLING_IGNORE; + + WkHtmlToPdfUtil.convert(htmlToPdfJobTemp + "test.html", file1, "",params); + + return content; + } + + } \ No newline at end of file diff --git a/yudao-server/src/main/resources/application-dev.yaml b/yudao-server/src/main/resources/application-dev.yaml index a65e886..038087f 100644 --- a/yudao-server/src/main/resources/application-dev.yaml +++ b/yudao-server/src/main/resources/application-dev.yaml @@ -176,6 +176,9 @@ yudao: transfer-notify-url: https://yunai.natapp1.cc/admin-api/pay/notify/transfer # 支付渠道的【转账】回调地址 demo: false # 开启演示模式 tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc + htmlToPdf: + tools: D:\Program Files\wkhtmltopdf\bin #wkhtmltopdf 的安装路径 + jobTemp: D:\demo\ #模板文件路径 justauth: enabled: true diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 863011f..d598a75 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -228,6 +228,9 @@ yudao: wxa-subscribe-message: miniprogram-state: developer # 跳转小程序类型:开发版为 “developer”;体验版为 “trial”为;正式版为 “formal” tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc + htmlToPdf: + tools: D:\Program Files\wkhtmltopdf\bin #wkhtmltopdf 的安装路径 + jobTemp: D:\demo\ #模板文件路径 justauth: enabled: true