Commit c00d65d1 authored by 徐俊's avatar 徐俊

Merge branch 'master' of http://gitlab.yiboshi.com/XuJun/yn-health-science

# Conflicts:
#	science-admin/src/main/resources/application.yml
parents bf1699a7 d417aa48
......@@ -205,6 +205,7 @@
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
......
......@@ -14,8 +14,8 @@ import com.yiboshi.science.rest.BaseController;
import com.yiboshi.science.service.ComFileService;
import com.yiboshi.science.service.ComProjectService;
import com.yiboshi.science.service.ComProjectTaskService;
import com.yiboshi.science.utils.*;
import com.yiboshi.science.service.SystemParameterService;
import com.yiboshi.science.utils.PdfUtil;
import com.yiboshi.science.utils.ProjectInfoToPDF;
import com.yiboshi.science.utils.StringUtil;
import io.swagger.annotations.Api;
......@@ -44,15 +44,15 @@ public class ComProjectController extends BaseController<ComProjectService, ComP
@Autowired
private ComProjectService comProjectService;
@Autowired
private SystemParameterService systemParameterService;
@Autowired
private ComProjectTaskService comProjectTaskService;
@Autowired
private ComFileService comFileService;
@Autowired
private SystemParameterService systemParameterService;
/**
* 功能:分页查询
*
......@@ -87,13 +87,25 @@ public class ComProjectController extends BaseController<ComProjectService, ComP
return ResponseDataModel.ok(comProjectService.getCount(e));
}
@ApiOperation(value = "项目信息导出", httpMethod = "POST", notes = "项目信息导出")
@RequestMapping("/export1/{id}")
@PostMapping
public void export1(@PathVariable String id) {
comProjectService.export(id, request, response);
}
@ApiOperation(value = "项目信息导出", httpMethod = "POST", notes = "项目信息导出")
@RequestMapping("/export/{id}")
@PostMapping
public void export(@PathVariable String id) {
comProjectService.export(id,request,response);
public ResponseDataModel<byte[]> export(@PathVariable String id) {
try {
return ResponseDataModel.ok(PdfUtil.createPDF(response, "tmp-report.html", new ComProject()));
} catch (Exception e) {
return new ResponseDataModel(ResponseCode.SERVER_ERROR, "");
}
}
/**
* 根据id获取项目信息
*
......@@ -163,7 +175,7 @@ public class ComProjectController extends BaseController<ComProjectService, ComP
@PostMapping
@RequestMapping("/audit")
@Logs(value = CommonEnum.logType.projectAudit)
public ResponseDataModel<String> audit(@Validated @RequestBody ComProjectAuditDTO comProjectAudit, BindingResult bindingResult) {
public ResponseDataModel<String> audit(@Validated @RequestBody ComProjectAuditDTO comProjectAudit, BindingResult bindingResult) {
comProjectService.audit(comProjectAudit, SecurityUserHolder.getUnitId(), SecurityUserHolder.getUnitCode());
return ResponseDataModel.ok("审核成功");
}
......
package com.yiboshi.science.rest.v1;
import com.itextpdf.text.DocumentException;
import com.yiboshi.arch.base.ResponseDataModel;
import com.yiboshi.science.base.Pagination;
import com.yiboshi.science.config.annotation.Logs;
......@@ -8,24 +9,22 @@ import com.yiboshi.science.entity.ComProjectAudit;
import com.yiboshi.science.entity.ComProjectTask;
import com.yiboshi.science.entity.SelectListItem;
import com.yiboshi.science.enumeration.CommonEnum;
import com.yiboshi.science.param.dto.ComDownloadDTO;
import com.yiboshi.science.param.dto.ComFileDTO;
import com.yiboshi.science.param.dto.ComProjectTaskDTO;
import com.yiboshi.science.param.dto.DataStatisticsDTO;
import com.yiboshi.science.param.query.ComProjectTaskQueryVO;
import com.yiboshi.science.rest.BaseController;
import com.yiboshi.science.service.ComProjectTaskService;
import com.yiboshi.science.service.SystemParameterService;
import com.yiboshi.science.utils.StringUtil;
import com.yiboshi.science.utils.TaskInfoToPDFUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
......@@ -142,4 +141,28 @@ public class ComProjectTaskController extends BaseController<ComProjectTaskServi
return ResponseDataModel.ok(list);
}
@ApiOperation(value = "项目导出", httpMethod = "POST", notes = "项目导出")
@RequestMapping("/export/{id}")
@PostMapping
public void export(@PathVariable String id) throws DocumentException, IOException {
try {
ComProjectTaskDTO dto=ComProjectTaskService.getTaskByProjId(id);
// 生成PDF文件字节数组
byte[] pdfBytes = TaskInfoToPDFUtil.createContractPdf(ComProjectTaskService.getTaskByProjId(id));
// 设置响应头
response.setContentType("application/pdf");
String fileName = new String((dto.getProjName() + ".pdf").getBytes("UTF-8"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setContentLength(pdfBytes.length);
// 写入响应流
try (ServletOutputStream out = response.getOutputStream()) {
out.write(pdfBytes);
out.flush();
}
} catch (Exception e) {
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().write("导出PDF失败:" + e.getMessage());
}
}
}
\ No newline at end of file
package com.yiboshi.science.utils;
import com.itextpdf.text.pdf.BaseFont;
import com.lowagie.text.DocumentException;
import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.apache.velocity.app.Velocity;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import static java.lang.System.in;
public class PDF {
/**
* 将HTML模板转换为PDF输出流
* @return PDF字节数组
*/
public static byte[] createPDF(HttpServletResponse response,String temp,Object dataModel) throws IOException, TemplateException, DocumentException {
Map<String, Object> dataMap = HtmlBuilder.obj2Map(dataModel);
// 配置FreeMarker
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
cfg.setDefaultEncoding("utf-8");
cfg.setClassLoaderForTemplateLoading(PDF.class.getClassLoader(), "template");
cfg.setTemplateLoader(new ClassTemplateLoader(PDF.class.getClassLoader(), "/template"));
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// 获取模板
Template template = cfg.getTemplate(temp, "utf-8");
// 处理模板,生成HTML内容
StringWriter tmpText = new StringWriter();
template.process(dataMap, tmpText);
String htmlContent = tmpText.toString();
// 创建PDF渲染器
ITextRenderer renderer = new ITextRenderer();
// 设置中文字体
String simPath = ResourceFileUtil.getAbsolutePath("/fonts/simsun.ttc");
String msyhPath = ResourceFileUtil.getAbsolutePath("/fonts/msyh.ttc");
renderer.getFontResolver().addFont(simPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.getFontResolver().addFont(msyhPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 渲染HTML内容
renderer.setDocumentFromString(htmlContent);
renderer.layout();
// 创建一个ByteArrayOutputStream来保存生成的PDF
response.setContentType("application/octet-stream;charset=UTF-8");
OutputStream outputStream = response.getOutputStream();
// 输出PDF到字节数组
renderer.createPDF(outputStream);
//创建存放文件内容的数组
byte[] buff = new byte[1024];
//所读取的内容使用n来接收
int n;
//当没有读取完时,继续读取,循环
while ((n = in.read(buff)) != -1) {
//将字节数组的数据全部写入到输出流中
outputStream.write(buff, 0, n);
}
//强制将缓存区的数据进行输出
outputStream.flush();
//关流
outputStream.close();
in.close();
// 关闭输出流
return buff;
}
public static boolean createPDF(String temp,Object dataModel,String outputPath) throws IOException, TemplateException, DocumentException {
Map<String, Object> dataMap = HtmlBuilder.obj2Map(dataModel);
// 配置FreeMarker
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
cfg.setDefaultEncoding("utf-8");
cfg.setClassLoaderForTemplateLoading(PDF.class.getClassLoader(), "template");
cfg.setTemplateLoader(new ClassTemplateLoader(PDF.class.getClassLoader(), "/template"));
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// 获取模板
Template template = cfg.getTemplate(temp, "utf-8");
// 处理模板,生成HTML内容
StringWriter tmpText = new StringWriter();
template.process(dataMap, tmpText);
String htmlContent = tmpText.toString();
// 创建PDF渲染器
ITextRenderer renderer = new ITextRenderer();
// 设置中文字体
String simPath = ResourceFileUtil.getAbsolutePath("/fonts/simsun.ttc");
String msyhPath = ResourceFileUtil.getAbsolutePath("/fonts/msyh.ttc");
renderer.getFontResolver().addFont(simPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.getFontResolver().addFont(msyhPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 渲染HTML内容
renderer.setDocumentFromString(htmlContent);
renderer.layout();
// 创建输出文件
File outputFile = new File(outputPath);
// 确保父目录存在
outputFile.getParentFile().mkdirs();
// 创建文件输出流
try (OutputStream outputStream = new FileOutputStream(outputFile)) {
// 输出PDF到文件
renderer.createPDF(outputStream);
outputStream.flush();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
......@@ -8,15 +8,27 @@ import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import com.itextpdf.text.pdf.BaseFont;
import com.lowagie.text.DocumentException;
import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import org.xhtmlrenderer.pdf.ITextRenderer;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import static java.lang.System.in;
/**
* PDF工具
......@@ -67,4 +79,53 @@ public class PdfUtil {
}
}
public static byte[] createPDF(HttpServletResponse response, String temp, Object dataModel) throws IOException, TemplateException, DocumentException {
Map<String, Object> dataMap = HtmlBuilder.obj2Map(dataModel);
// 配置FreeMarker
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
cfg.setDefaultEncoding("utf-8");
cfg.setClassLoaderForTemplateLoading(PdfUtil.class.getClassLoader(), "template");
cfg.setTemplateLoader(new ClassTemplateLoader(PdfUtil.class.getClassLoader(), "/template"));
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// 获取模板
freemarker.template.Template template = cfg.getTemplate(temp, "utf-8");
// 处理模板,生成HTML内容
StringWriter tmpText = new StringWriter();
template.process(dataMap, tmpText);
String htmlContent = tmpText.toString();
// 创建PDF渲染器
ITextRenderer renderer = new ITextRenderer();
// Java代码示例
// renderer.getSharedContext().setDPI(1); // 提高DPI减少锯齿
// 设置中文字体
String simPath = ResourceFileUtil.getAbsolutePath("/fonts/simsun.ttc");
String msyhPath = ResourceFileUtil.getAbsolutePath("/fonts/msyh.ttc");
renderer.getFontResolver().addFont(simPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.getFontResolver().addFont(msyhPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 渲染HTML内容
renderer.setDocumentFromString(htmlContent);
renderer.layout();
// 创建一个ByteArrayOutputStream来保存生成的PDF
response.setContentType("application/octet-stream;charset=UTF-8");
OutputStream outputStream = response.getOutputStream();
// 输出PDF到字节数组
renderer.createPDF(outputStream);
//创建存放文件内容的数组
byte[] buff = new byte[1024];
//所读取的内容使用n来接收
int n;
//当没有读取完时,继续读取,循环
while ((n = in.read(buff)) != -1) {
//将字节数组的数据全部写入到输出流中
outputStream.write(buff, 0, n);
}
//强制将缓存区的数据进行输出
outputStream.flush();
//关流
outputStream.close();
in.close();
// 关闭输出流
return buff;
}
}
package com.yiboshi.science.utils;
public class WordUtil {
}
......@@ -8,7 +8,11 @@ spring:
application:
name: science-admin
profiles:
<<<<<<< HEAD
active: @profileActive@
=======
active: 'local'
>>>>>>> d417aa486ddbc29fdb249b64c51f5d822bf31efb
http:
encoding:
force: true
......
......@@ -2,6 +2,7 @@
package com.yiboshi.science.base;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
......@@ -13,6 +14,6 @@ import org.apache.ibatis.annotations.Param;
* @version 2018-08
*/
@SuppressWarnings("all")
public interface BaseDAO<V extends PaginationVO,D extends BaseDTO ,E>{
public interface BaseDAO<V extends PaginationVO,D extends BaseDTO ,E>extends BaseMapper<E> {
Page<D> getListByPage(Page<V> page, @Param("ew") Wrapper<V> queryWrapper);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment