123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- 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<PatentInstructionMapper, PatentInstruction> {
- private final PatentService patentService;
- private final FileUtils fileUtils;
- public void queryPatentPdfFirstPages(PatentVO params, HttpServletResponse response) throws IOException {
- log.info("开始处理【导出多件专利pdf首页】的业务,业务参数为:{}", params);
- //根据筛选条件,直接调用查询
- IPage<PatentDTO> pageList = patentService.getPageList(params);
- List<PatentDTO> patents = pageList.getRecords();
- List<String> patentNos = patents.stream().map(PatentDTO::getPatentNo).collect(Collectors.toList());
- //根据专利号patentNos查询出所有pdf文档数据
- List<PatentInstruction> patentInstructions = this.list(new LambdaQueryWrapper<PatentInstruction>().in(PatentInstruction::getPatentNo, patentNos).groupBy(PatentInstruction::getPatentNo));
- ArrayList<String> 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();
- }
- }
|