PatentPDFService.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package cn.cslg.pas.service.patentPDF;
  2. import cn.cslg.pas.common.model.dto.PatentDTO;
  3. import cn.cslg.pas.common.model.vo.PatentVO;
  4. import cn.cslg.pas.common.utils.FileUtils;
  5. import cn.cslg.pas.common.utils.StringUtils;
  6. import cn.cslg.pas.domain.PatentInstruction;
  7. import cn.cslg.pas.mapper.PatentInstructionMapper;
  8. import cn.cslg.pas.service.PatentInstructionService;
  9. import cn.cslg.pas.service.PatentService;
  10. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  11. import com.baomidou.mybatisplus.core.metadata.IPage;
  12. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  13. import lombok.RequiredArgsConstructor;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.apache.pdfbox.multipdf.PDFMergerUtility;
  16. import org.apache.pdfbox.multipdf.Splitter;
  17. import org.apache.pdfbox.pdmodel.PDDocument;
  18. import org.apache.pdfbox.rendering.ImageType;
  19. import org.apache.pdfbox.rendering.PDFRenderer;
  20. import org.springframework.stereotype.Service;
  21. import javax.servlet.http.HttpServletResponse;
  22. import java.awt.image.BufferedImage;
  23. import java.io.*;
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. import java.util.stream.Collectors;
  27. /**
  28. * 查询专利的说明书pdf首页
  29. *
  30. * @author chenyu
  31. * @date 2023/9/6
  32. */
  33. @RequiredArgsConstructor
  34. @Slf4j
  35. @Service
  36. public class PatentPDFService extends ServiceImpl<PatentInstructionMapper, PatentInstruction> {
  37. private final PatentService patentService;
  38. private final FileUtils fileUtils;
  39. public void queryPatentPdfFirstPages(PatentVO params, HttpServletResponse response) throws IOException {
  40. log.info("开始处理【导出多件专利pdf首页】的业务,业务参数为:{}", params);
  41. //根据筛选条件,直接调用查询
  42. IPage<PatentDTO> pageList = patentService.getPageList(params);
  43. List<PatentDTO> patents = pageList.getRecords();
  44. List<String> patentNos = patents.stream().map(PatentDTO::getPatentNo).collect(Collectors.toList());
  45. //根据专利号patentNos查询出所有pdf文档数据
  46. List<PatentInstruction> patentInstructions = this.list(new LambdaQueryWrapper<PatentInstruction>().in(PatentInstruction::getPatentNo, patentNos).groupBy(PatentInstruction::getPatentNo));
  47. ArrayList<String> filePaths = new ArrayList<>(); //存放所有专利说明书首页pdf的文件路径
  48. for (PatentInstruction patentInstruction : patentInstructions) { //遍历,将所有专利说明书pdf的首页取出生成新的Pdf文件存在本地
  49. String filePath = fileUtils.getSystemPath() + patentInstruction.getUrl();
  50. PDDocument doc = PDDocument.load(new File(filePath));
  51. Splitter splitter = new Splitter();
  52. splitter.setStartPage(1);
  53. splitter.setEndPage(1);
  54. PDDocument needDoc = splitter.split(doc).get(0);
  55. String newFilePath = "专利号" + patentInstruction.getPatentNo() + "的说明书pdf首页.pdf";
  56. needDoc.save(newFilePath);
  57. filePaths.add(newFilePath);
  58. needDoc.close();
  59. doc.close();
  60. }
  61. //开始合并上面生成的所有专利说明书首页pdf文件
  62. PDFMergerUtility pdfMerger = new PDFMergerUtility();
  63. for (String filePath : filePaths) {
  64. pdfMerger.addSource(filePath);
  65. }
  66. // 设置合并生成pdf文件名称
  67. String mergedFilePath = StringUtils.getUUID() + ".pdf";
  68. pdfMerger.setDestinationFileName(mergedFilePath);
  69. // 合并PDF
  70. pdfMerger.mergeDocuments();
  71. //最后要记得删除所有pdf首页临时文件
  72. for (String filePath : filePaths) {
  73. new File(filePath).delete();
  74. }
  75. InputStream fis = new BufferedInputStream(new FileInputStream(mergedFilePath));
  76. byte[] buffer = new byte[fis.available()];
  77. fis.read(buffer);
  78. fis.close();
  79. // 清空response
  80. response.reset();
  81. // 设置response的Header
  82. response.addHeader("Content-Disposition", "attachment;filename=" + new String(mergedFilePath.getBytes()));
  83. response.addHeader("Content-Length", "" + new File(mergedFilePath).length());
  84. OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
  85. response.setContentType("application/octet-stream");
  86. toClient.write(buffer);
  87. toClient.flush();
  88. toClient.close();
  89. //最后要记得删除合并后的pdf临时文件
  90. new File(mergedFilePath).delete();
  91. }
  92. }