(设置页脚和内容的距离)
+ *
+ * 页脚和页眉
+ * [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