Commit 83d9d057 authored by wangxl's avatar wangxl

1

parent 178121a9
......@@ -120,7 +120,7 @@
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
<version>2.3.28</version>
</dependency>
<dependency>
......@@ -192,26 +192,57 @@
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!-- IText -->
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext7-core -->
<!-- Flying Saucer Core -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>${itext.version}</version>
<type>pom</type>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-core</artifactId>
<version>9.1.22</version>
</dependency>
<!-- Flying Saucer iText Integration -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.22</version>
</dependency>
<!-- Thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdftest</artifactId>
<version>7.1.16</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.8</version>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>4.0.3</version>
<version>6.0.0</version>
</dependency>
<!-- IText -->
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext7-core -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>${itext.version}</version>
<type>pom</type>
</dependency>
<dependency>
......@@ -242,18 +273,6 @@
<version>${itext.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>pdftest</artifactId>-->
<!-- <version>${itext.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdftest</artifactId>
<version>7.1.16</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
......
......@@ -300,6 +300,19 @@ public class ComProjectTaskDTO extends BaseDTO {
@ApiModelProperty(value = "项目组成员_参加单位数", position = 25)
private Integer workCount;
/** 附件Id */
@ApiModelProperty(value = "附件Id", position = 4 )
private String fileId;
/** 附件Id */
@ApiModelProperty(value = "附件Id", position = 1 )
private String downloadId;
/** 附件名 */
@ApiModelProperty(value = "附件名", position = 6)
private String fileName;
/** URL */
@ApiModelProperty(value = "URL", position = 7)
private String downloadUrl;
/** 合作单位 */
private List<ComProjectCooperativeUnitsDTO> cooperativeUnits;
/** 项目主要参与单位 */
......
package com.yiboshi.science.rest.v1;
import com.itextpdf.text.DocumentException;
import com.yiboshi.arch.base.ResponseCode;
import com.yiboshi.arch.base.ResponseDataModel;
import com.yiboshi.science.base.Pagination;
import com.yiboshi.science.config.annotation.Logs;
......@@ -16,8 +17,7 @@ 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.ProjectInfoToPDF;
import com.yiboshi.science.utils.StringUtil;
import com.yiboshi.science.utils.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -26,6 +26,7 @@ import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.util.*;
......@@ -86,8 +87,19 @@ public class ComProjectController extends BaseController<ComProjectService, ComP
@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(PDF.createPDF(response,"tmp-report.html",new ComProjectDTO()));
} catch (Exception e) {
return new ResponseDataModel(ResponseCode.SERVER_ERROR, "");
}
}
@ApiOperation(value = "项目信息导出", httpMethod = "POST", notes = "项目信息导出")
@RequestMapping("/export1/{id}")
@PostMapping
public void export1(@PathVariable String id) {
comProjectService.export(id, request, response);
}
/**
......@@ -159,7 +171,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("审核成功");
}
......@@ -219,4 +231,5 @@ public class ComProjectController extends BaseController<ComProjectService, ComP
ProjectInfoToPDF.generateProjectPDF(dto, outputPath);
return ResponseDataModel.ok("项目信息导入成功!");
}
}
\ No newline at end of file
......@@ -68,12 +68,7 @@ public class ComProjectBudgetServiceImpl extends BaseServiceImpl<ComProjectBudge
newVO.setLevel(e.getTreeCode());
if (Objects.nonNull(e.getSystemCode())) {
try {
String[] arr = e.getSystemCode().split(",");
Integer[] li = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
li[i] = Integer.valueOf(arr[i]);
}
newVO.setSource(li);
getParaItem(newVO, e.getSystemCode());
} catch (Exception ex) {
logsExceptionService.logs(null, ex, "获取参数异常!");
}
......@@ -94,14 +89,9 @@ public class ComProjectBudgetServiceImpl extends BaseServiceImpl<ComProjectBudge
budgetList.forEach((e) -> {
if (Objects.nonNull(e.getSystemCode())) {
try {
String[] arr = e.getSystemCode().split(",");
Integer[] li = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
li[i] = Integer.valueOf(arr[i]);
}
e.setSource(li);
getParaItem(e, e.getSystemCode());
} catch (Exception ex) {
logsExceptionService.logs(null, ex, "获取参数异常!");
logsExceptionService.logs(null, ex, "经费配置异常!");
}
}
});
......@@ -109,6 +99,15 @@ public class ComProjectBudgetServiceImpl extends BaseServiceImpl<ComProjectBudge
return budgetList;
}
private void getParaItem(ComProjectBudgetDTO e, String systemCode) {
String[] arr = systemCode.split(",");
Integer[] li = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
li[i] = Integer.valueOf(arr[i]);
}
e.setSource(li);
}
@Transactional
public void insertBudgetList(List<ComProjectBudgetDTO> budgetList, String objectId) {
ComProjectBudget E = new ComProjectBudget();
......
package com.yiboshi.science.service.impl;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.URLUtil;
import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -16,11 +18,13 @@ import com.yiboshi.science.param.query.ComProjectQueryVO;
import com.yiboshi.science.service.*;
import com.yiboshi.science.utils.*;
import lombok.AllArgsConstructor;
import org.apache.velocity.VelocityContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
......@@ -88,9 +92,9 @@ public class ComProjectServiceImpl extends BaseServiceImpl<ComProjectDAO, ComPro
@Autowired
private final HtmlBuilder htmlBuilder;
@Autowired
private ComProjectFundPlanService comProjectFundPlanService;
private ComProjectFundPlanService comProjectFundPlanService;
@Autowired
private ComProjectUnitPaymentService comProjectUnitPaymentService;
private ComProjectUnitPaymentService comProjectUnitPaymentService;
@Autowired
private ComProjectKpitService comProjectKpitService;
@Autowired
......@@ -958,7 +962,7 @@ public class ComProjectServiceImpl extends BaseServiceImpl<ComProjectDAO, ComPro
}
public void export(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) {
public void export1(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) {
ComProjectDTO p = this.getProjectById(id);
if (null != p) {
String strDateFormat = p.getProjType().equals(1) ? "yyyy-MM-dd HH:mm:ss" : "yyyy-MM-dd";
......@@ -1000,14 +1004,6 @@ public class ComProjectServiceImpl extends BaseServiceImpl<ComProjectDAO, ComPro
}
p.setBudget(item);
}
// if (null == p.getEquipments() || p.getEquipments().size() < 4) {
// int count = p.getEquipments() == null ? 0 : p.getEquipments().size();
// List<ComProjectEquipmentDTO> item = p.getEquipments() == null ? new ArrayList<>() : p.getEquipments();
// for (int i = 1; i <= 4 - count; i++) {
// item.add(new ComProjectEquipmentDTO());
// }
// p.setEquipments(item);
// }
List<String> str = comProjectResultsService.getNameByObjectId(p.getId());
if (p.getProjType().equals(1)) {
WordUtils utl = new WordUtils();
......@@ -1018,6 +1014,27 @@ public class ComProjectServiceImpl extends BaseServiceImpl<ComProjectDAO, ComPro
}
}
public void export(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) {
String filename = System.currentTimeMillis() + ".pdf";
response.reset();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "inline; filename=" + URLUtil.encode(filename, CharsetUtil.CHARSET_UTF_8));
VelocityContext context = new VelocityContext();
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DATE);
context.put("reportYear", 2024);
context.put("year", calendar.get(Calendar.YEAR));
context.put("month", month >= 10 ? month : "0" + month);
context.put("day", day >= 10 ? day : "0" + day);
try (ServletOutputStream outputStream = response.getOutputStream()) {
PdfUtil.pdfFile(context, "/template/tmp-report.html", outputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取项目编号
*
......
......@@ -460,8 +460,6 @@ public class ComProjectTaskServiceImpl extends BaseServiceImpl<ComProjectTaskDAO
@Transactional
public void audit(ComProjectAudit dto, String auditUnitId, String treeCode) {
// false 报上级或返回下一级 true报到最高级或返回个人
int state = 0;
ComProjectTask task = this.getById(dto.getAuditObjectId());
if (null == task)
throw new BusinessException("审核对象不存在!");
......
......@@ -65,7 +65,7 @@ public class HtmlBuilder {
return host;
}
private static Map<String, Object> obj2Map(Object obj) {
public static Map<String, Object> obj2Map(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
// 获取f对象对应类中的所有属性域
Field[] fields = obj.getClass().getDeclaredFields();
......
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;
}
}
}
......@@ -26,8 +26,6 @@ import java.nio.charset.StandardCharsets;
*/
public class PdfUtil {
static {
// Velocity初始化
Velocity.setProperty(RuntimeConstants.OUTPUT_ENCODING, StandardCharsets.UTF_8);
......@@ -49,9 +47,9 @@ public class PdfUtil {
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");
......@@ -60,7 +58,9 @@ public class PdfUtil {
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);
......
package com.yiboshi.science.utils;
import org.springframework.util.ResourceUtils;
import java.io.File;
import java.io.FileNotFoundException;
/**
* @Description: 项目静态资源文件工具类
* 仅可用于包含在web项目中的资源文件路径,资源文件必须放置于 web 模块下
* @Author: junqiang.lu
* @Date: 2019/1/4
*/
public class ResourceFileUtil {
/**
* 获取资源文件
*
* @param relativePath 资源文件相对路径(相对于 resources路径,路径 + 文件名)
* eg: "templates/pdf_export_demo.ftl"
* @return
* @throws FileNotFoundException
*/
public static File getFile(String relativePath) throws FileNotFoundException {
if (relativePath == null || relativePath.length() == 0) {
return null;
}
if (relativePath.startsWith("/")) {
relativePath = relativePath.substring(1);
}
File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX
+ relativePath);
return file;
}
/**
* 获取资源绝对路径
*
* @param relativePath 资源文件相对路径(相对于 resources路径,路径 + 文件名)
* eg: "templates/pdf_export_demo.ftl"
* @return
* @throws FileNotFoundException
*/
public static String getAbsolutePath(String relativePath) throws FileNotFoundException {
return getFile(relativePath).getAbsolutePath();
}
/**
* 获取资源父级目录
*
* @param relativePath 资源文件相对路径(相对于 resources路径,路径 + 文件名)
* eg: "templates/pdf_export_demo.ftl"
* @return
* @throws FileNotFoundException
*/
public static String getParent(String relativePath) throws FileNotFoundException {
return getFile(relativePath).getParent();
}
/**
* 获取资源文件名
*
* @param relativePath 资源文件相对路径(相对于 resources路径,路径 + 文件名)
* eg: "templates/pdf_export_demo.ftl"
* @return
* @throws FileNotFoundException
*/
public static String getFileName(String relativePath) throws FileNotFoundException {
return getFile(relativePath).getName();
}
}
\ No newline at end of file
......@@ -43,7 +43,7 @@
ic.unit_link_name,ic.unit_link_mobile,ic.unit_link_email,ic.unit_link_fax,ic.subject_scope,ic.proj_abstract,ic.proj_keywords,
ic.total_funding,ic.gov_funding,ic.unit_funding,ic.self_funding,ic.other_funding,
ic.research_content,ic.technology_target, ic.economy_target, ic.achievement_target, ic.technology_reports_target, ic.other_target,
ic.proj_attribute,ic.remark,ic.year_target,ic.year1_goal,ic.year2_goal,ic.year3_goal,
ic.proj_attribute,ic.remark,ic.year_target,ic.year1_goal,ic.year2_goal,ic.year3_goal,ic.file_id,
c.id download_id,c.download_url,c.file_name
from com_project a
left join com_project_task pt on pt.proj_id=a.id
......
This diff is collapsed.
This diff is collapsed.
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