package cn.cslg.pas.service.patentPDF; import cn.cslg.pas.common.model.dto.PatentDTO; import cn.cslg.pas.common.model.vo.PatentVO; import cn.cslg.pas.common.utils.FileUtils; import cn.cslg.pas.common.utils.StringUtils; import cn.cslg.pas.domain.PatentInstruction; import cn.cslg.pas.mapper.PatentInstructionMapper; import cn.cslg.pas.service.PatentInstructionService; import cn.cslg.pas.service.PatentService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.pdfbox.multipdf.PDFMergerUtility; import org.apache.pdfbox.multipdf.Splitter; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 查询专利的说明书pdf首页 * * @author chenyu * @date 2023/9/6 */ @RequiredArgsConstructor @Slf4j @Service public class PatentPDFService extends ServiceImpl { private final PatentService patentService; private final FileUtils fileUtils; public void queryPatentPdfFirstPages(PatentVO params, HttpServletResponse response) throws IOException { log.info("开始处理【导出多件专利pdf首页】的业务,业务参数为:{}", params); //根据筛选条件,直接调用查询 IPage pageList = patentService.getPageList(params); List patents = pageList.getRecords(); List patentNos = patents.stream().map(PatentDTO::getPatentNo).collect(Collectors.toList()); //根据专利号patentNos查询出所有pdf文档数据 List patentInstructions = this.list(new LambdaQueryWrapper().in(PatentInstruction::getPatentNo, patentNos).groupBy(PatentInstruction::getPatentNo)); ArrayList filePaths = new ArrayList<>(); //存放所有专利说明书首页pdf的文件路径 for (PatentInstruction patentInstruction : patentInstructions) { //遍历,将所有专利说明书pdf的首页取出生成新的Pdf文件存在本地 String filePath = fileUtils.getSystemPath() + patentInstruction.getUrl(); PDDocument doc = PDDocument.load(new File(filePath)); Splitter splitter = new Splitter(); splitter.setStartPage(1); splitter.setEndPage(1); PDDocument needDoc = splitter.split(doc).get(0); String newFilePath = "专利号" + patentInstruction.getPatentNo() + "的说明书pdf首页.pdf"; needDoc.save(newFilePath); filePaths.add(newFilePath); needDoc.close(); doc.close(); } //开始合并上面生成的所有专利说明书首页pdf文件 PDFMergerUtility pdfMerger = new PDFMergerUtility(); for (String filePath : filePaths) { pdfMerger.addSource(filePath); } // 设置合并生成pdf文件名称 String mergedFilePath = StringUtils.getUUID() + ".pdf"; pdfMerger.setDestinationFileName(mergedFilePath); // 合并PDF pdfMerger.mergeDocuments(); //最后要记得删除所有pdf首页临时文件 for (String filePath : filePaths) { new File(filePath).delete(); } InputStream fis = new BufferedInputStream(new FileInputStream(mergedFilePath)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 设置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + new String(mergedFilePath.getBytes())); response.addHeader("Content-Length", "" + new File(mergedFilePath).length()); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); //最后要记得删除合并后的pdf临时文件 new File(mergedFilePath).delete(); } }