-
- /**
- * 导出调查问卷
- */
- @ApiLog("导出调查问卷")
- @PostMapping("/print/{id}")
- @ApiOperationSupport(order = 23)
- @ApiOperation(value = "导出报告", notes = "导出报告")
- public void print(@PathVariable Long id, HttpServletResponse response) {
- BackendGradeEntity record = backendGradeService.getById(id);
-
- //如果record为空,直接返回错误信息
- if(record == null){
- throw new RuntimeException("未找到该记录");
- }
-
- Map
values = new HashMap<>(); - Field[] fields = BackendGradeEntity.class.getDeclaredFields();
- //通过反射拿到对象的属性名并且赋值给map
- for (Field field : fields) {
- field.setAccessible(true);
- try {
- Object value = field.get(record);
- values.put(field.getName(), value);
- } catch (IllegalAccessException e) {
- // 处理访问异常
- e.printStackTrace();
- }
- }
-
- //通过用户id查询用户信息
- BackendUserinformationEntity user = backendUserinformationService.getById(record.getUserId());
- //获取用户性别
- Integer sex = null;
- if (user!= null){
- sex = user.getSex();
- }
-
- //添加用户性别
- values.put("sex", sex==1?"男":"女");
-
- String totalTime = values.get("totalTime").toString();
- double timeInSeconds = Double.parseDouble(totalTime) * 60; // 将分钟转换为秒
- int minutes = (int) timeInSeconds / 60;
- int seconds = (int) timeInSeconds % 60;
- String formattedTime = minutes + "分钟" + seconds + "秒";
- values.put("totalTime", formattedTime);
-
- //增加打印日期为当前日期
- values.put("printDate", DateUtil.format(LocalDate.now(), "yyyy年MM月dd日"));
- //修改map中的startTime 和 endTime 格式由2023-09-19T15:34:25 为 2023-09-19 15:34:25
- String startTime = values.get("startTime").toString().replace("T", " ");
- String endTime = values.get("endTime").toString().replace("T", " ");
- values.put("startTime", startTime);
- values.put("endTime", endTime);
-
- //将 正确率 错误率 未答题率 乘100再填回,因为数据存的是小数
- values.put("errorRate", Double.parseDouble(values.get("errorRate").toString())*100);
- values.put("accuracy", Double.parseDouble(values.get("accuracy").toString())*100);
- values.put("unansweredRate", Double.parseDouble(values.get("unansweredRate").toString())*100);
-
-
-
- String fileName = null;
- String tplName = null;
- if(true){
- fileName = "报告";
- tplName = "intuitionReport.ftl";
- }
- fileName = fileName + "-" + (values.get("userName")==null?UUID.randomUUID():values.get("userName"));
- String file = printer.print(values, tplName, fileName);
-
- //下载文件
- InputStream inStream = null;
- try {
- inStream = new FileInputStream(file);
- response.reset();
- response.setContentType("application/pdf");
- response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(new File(file).getName(), "UTF-8"));
- response.setCharacterEncoding("UTF-8");
- IoUtil.copy(inStream, response.getOutputStream());
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (inStream != null) {
- try { inStream.close(); } catch (IOException e) { e.printStackTrace(); }
- }
- }
- }
-
-
- /**
- * 批量导出报告
- */
- @ApiLog("批量导出报告")
- @PostMapping("/print/batch")
- @ApiOperationSupport(order = 23)
- @ApiOperation(value = "批量导出", notes = "批量导出报告")
- public void printBatch(@RequestParam String ids, HttpServletResponse response) {
- List
records = backendGradeService.listByIds(Func.toLongList(ids)); -
- String uuid = UUID.randomUUID().toString();
-
- int size = records.size();
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
- String zipName = LocalDateTime.now().format(formatter)+"-"+size+"records.zip";
-
- Path zipPath = Paths.get(pathProperties.getPdf(), zipName);
- File zipFile = zipPath.toFile();
- if(zipFile.exists()){
- zipFile.delete();//如果文件存在则先删除旧的文件
- }
-
- List
files = null; - try{
- if(!zipFile.getParentFile().exists()){
- Files.createDirectories(zipPath.getParent());
- }
-
- files = records.stream()
- // .filter(j -> j.getStatus() == 4)
- .map(record -> {
-
- Map
values = new HashMap<>(); - Field[] fields = BackendGradeEntity.class.getDeclaredFields();
- //通过反射拿到对象的属性名并且赋值给map
- for (Field field : fields) {
- field.setAccessible(true);
- try {
- Object value = field.get(record);
- values.put(field.getName(), value);
- } catch (IllegalAccessException e) {
- // 处理访问异常
- e.printStackTrace();
- }
- }
-
-
- //通过用户id查询用户信息
- BackendUserinformationEntity user = backendUserinformationService.getById(record.getUserId());
- //获取用户性别
- Integer sex = null;
- if (user!= null){
- sex = user.getSex();
- }
-
- //添加用户性别
- values.put("sex", sex==1?"男":"女");
-
- //处理总时长
- String totalTime = values.get("totalTime").toString();
- double timeInSeconds = Double.parseDouble(totalTime) * 60; // 将分钟转换为秒
- int minutes = (int) timeInSeconds / 60;
- int seconds = (int) timeInSeconds % 60;
- String formattedTime = minutes + "分钟" + seconds + "秒";
- values.put("totalTime", formattedTime);
-
- //增加打印日期为当前日期
- values.put("printDate", DateUtil.format(LocalDate.now(), "yyyy年MM月dd日"));
- //修改map中的startTime 和 endTime 格式由2023-09-19T15:34:25 为 2023-09-19 15:34:25
- String startTime = values.get("startTime").toString().replace("T", " ");
- String endTime = values.get("endTime").toString().replace("T", " ");
- values.put("startTime", startTime);
- values.put("endTime", endTime);
-
-
- //将 正确率 错误率 未答题率 乘100再填回,因为数据存的是小数
- values.put("errorRate", Double.parseDouble(values.get("errorRate").toString())*100);
- values.put("accuracy", Double.parseDouble(values.get("accuracy").toString())*100);
- values.put("unansweredRate", Double.parseDouble(values.get("unansweredRate").toString())*100);
-
-
- String fileName = null;
- String tplName = null;
- if(true){
- fileName = "报告";
- tplName = "intuitionReport.ftl";
- }
- fileName = fileName + "-" + (values.get("userName")==null?UUID.randomUUID():values.get("userName")+UUID.randomUUID().toString());
- String f = printer.print(values, tplName, uuid+"/"+fileName);
- return new File(f);
- }).collect(Collectors.toList());
-
-
- // Path tempDir = Files.createTempDirectory("temp");
- // List
copiedFiles = new ArrayList<>(); - // for (File file : files) {
- // Path source = Paths.get(file.getPath());
- // Path destination = tempDir.resolve(file.getName());
- // Files.copy(source, destination);
- // copiedFiles.add(destination.toFile());
- // }
- // // 在这里调用添加水印的方法
- // PDFWatermarkExample.addWatermarkExample(copiedFiles);
- //
- // files = copiedFiles;
- // try {
- // // 删除临时文件夹及其所有文件
- // FileUtils.deleteDirectory(tempDir.toFile());
- // } catch (IOException e) {
- // // 处理删除错误
- // e.printStackTrace();
- // }
-
- ZipTool.zipFile(files, zipPath.toFile().getAbsolutePath());
- }catch(Exception e){
- e.printStackTrace();
- }finally {
- if(files != null){
- for(File f : files){
- if(f.exists()) f.delete();
- }
- }
- Path dirPath = Paths.get(pathProperties.getPdf(), uuid);
- if(dirPath.toFile().exists()){
- dirPath.toFile().delete();
- }
- }
-
- //下载文件
- InputStream inStream = null;
- try {
- if(!zipFile.exists()){
- return ;
- }
- inStream = new FileInputStream(zipFile);
- response.reset();
- response.setContentType("application/zip");
- response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8"));
- response.setCharacterEncoding("UTF-8");
- IoUtil.copy(inStream, response.getOutputStream());
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (inStream != null) {
- try { inStream.close(); } catch (IOException e) { e.printStackTrace(); }
- }
- }
-
- //这里删除临时文件夹内的压缩包,因为存着也没什么用浪费空间
- //通过zipPath获取绝对路径
- String absolutePath = zipPath.toFile().getAbsolutePath();
- //删除absolutepath文件夹,以及所有文件
- deleteDirectoryRecursively(new File(absolutePath));
-
-
- }
下面是加水印
- package org.springblade.common.tool;
- import com.itextpdf.text.*;
- import com.itextpdf.text.pdf.*;
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.util.List;
-
- public class PDFWatermarkExample {
- public static void addWatermark(String inputFile, String outputFile, String watermarkText) {
- try {
- PdfReader reader = new PdfReader(inputFile);
- PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
- int numberOfPages = reader.getNumberOfPages();
-
- for (int i = 1; i <= numberOfPages; i++) {
- PdfContentByte content = stamper.getUnderContent(i);
- PdfGState gs = new PdfGState();
- gs.setFillOpacity(0.5f); // 设置水印透明度
- content.setGState(gs);
-
- ColumnText.showTextAligned(
- content,
- Element.ALIGN_CENTER,
- new Phrase(watermarkText, new Font(Font.FontFamily.HELVETICA, 40)),
- reader.getPageSizeWithRotation(i).getWidth() / 2,
- reader.getPageSizeWithRotation(i).getHeight() / 2,
- 45
- );
- }
-
- stamper.close();
- reader.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public static void addWatermarkMulti(String inputFile, String outputFile, String watermarkText) {
- try {
- PdfReader reader = new PdfReader(inputFile);
- PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
- int numberOfPages = reader.getNumberOfPages();
-
- for (int i = 1; i <= numberOfPages; i++) {
- PdfContentByte content = stamper.getOverContent(i);
- PdfGState gs = new PdfGState();
- gs.setFillOpacity(0.05f); // 设置水印透明度
- content.setGState(gs);
-
- Rectangle pageSize = reader.getPageSizeWithRotation(i);
- float pageWidth = pageSize.getWidth();
- float pageHeight = pageSize.getHeight();
-
- // 设置水印间隔
- float xInterval = 200; // X轴间隔
- float yInterval = 50; // Y轴间隔
-
- // 计算水印个数
- int xCount = (int) Math.ceil(pageWidth / xInterval);
- int yCount = (int) Math.ceil(pageHeight / yInterval);
-
- // 平铺水印
- for (int x = 0; x < xCount; x++) {
- for (int y = 0; y < yCount; y++) {
- float xPosition = x * xInterval;
- float yPosition = y * yInterval;
-
- ColumnText.showTextAligned(
- content,
- Element.ALIGN_CENTER,
- new Phrase(watermarkText, new Font(Font.FontFamily.HELVETICA, 40)),
- xPosition,
- yPosition,
- 0
- );
- }
- }
- }
-
- stamper.close();
- reader.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public static void addWatermarkExample(List
files) { - // 在这里编写添加水印的代码逻辑,使用上面提到的添加水印的示例代码
- for (File file : files) {
- addWatermark(file.getPath(), file.getPath(), "Watermark Text");
- }
- }
-
- public static void main(String[] args) {
- String inputFile = "C:\\Users\\admin\\Downloads\\123.pdf";
- String outputFile = "C:\\Users\\admin\\Downloads\\789.pdf";
- String watermarkText = "zhijue.com";
-
- addWatermarkMulti(inputFile, outputFile, watermarkText);
- }
- }