| | |
| | | dir.mkdirs(); |
| | | } |
| | | |
| | | String pdfFileName = "agreement_" + user.getId() + ".pdf"; |
| | | String pdfFileName = "contract_" + user.getId() + ".pdf"; |
| | | File pdfFile = new File(dir, pdfFileName); |
| | | |
| | | // 构建完整的PDF访问URL |
| | | // String pdfUrl = PropertiesUtil.getProperty("pdf.server.http.prefix") + "/agreement_" + user.getId() + ".pdf"; |
| | | |
| | | // 如果PDF已存在,删除后重新生成,确保数据是最新的 |
| | | if (pdfFile.exists()) { |
| | |
| | | */ |
| | | private void generatePdfFromTemplate(File templatePdf, File outputPdf, User user) throws Exception { |
| | | log.info("开始生成PDF,模板路径: {}, 输出路径: {}, 用户: {}", |
| | | templatePdf.getAbsolutePath(), outputPdf.getAbsolutePath(), user.getId()); |
| | | templatePdf.getAbsolutePath(), outputPdf.getAbsolutePath(), user.getId()); |
| | | |
| | | PdfReader reader = null; |
| | | PdfStamper stamper = null; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void viewAgreementPdf(HttpServletRequest request, HttpServletResponse response) { |
| | | public ServerResponse viewAgreementPdf(HttpServletRequest request) { |
| | | try { |
| | | User user = iUserService.getCurrentUser(request); |
| | | if (user == null) { |
| | | response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "用户未登录"); |
| | | return; |
| | | return ServerResponse.createByErrorMsg("用户未登录"); |
| | | } |
| | | |
| | | String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir"); |
| | | String pdfFileName = "agreement_" + user.getId() + ".pdf"; |
| | | File pdfFile = new File(pdfDir, pdfFileName); |
| | | |
| | | if (!pdfFile.exists()) { |
| | | response.sendError(HttpServletResponse.SC_NOT_FOUND, "协议文件不存在,请先生成协议"); |
| | | return; |
| | | // 从数据库查询已签名的图片 |
| | | List<ContractImage> contractImages = contractImageMapper.selectByUserIdAndType(user.getId(), "contract"); |
| | | List<String> imageUrls = new ArrayList<>(); |
| | | |
| | | if (contractImages != null && !contractImages.isEmpty()) { |
| | | for (ContractImage image : contractImages) { |
| | | imageUrls.add(image.getAddress()); |
| | | } |
| | | log.info("从数据库查询到用户{}的{}张已签名合同图片", user.getId(), imageUrls.size()); |
| | | } |
| | | |
| | | List<String> imageUrls = convertPdfToImages(pdfFile, "contract", user.getId()); |
| | | |
| | | response.setContentType("application/json;charset=UTF-8"); |
| | | response.getWriter().write(JSON.toJSONString(ServerResponse.createBySuccess(imageUrls))); |
| | | response.getWriter().flush(); |
| | | return ServerResponse.createBySuccess(imageUrls); |
| | | } catch (Exception e) { |
| | | log.error("查看用户协议PDF失败", e); |
| | | try { |
| | | if (!response.isCommitted()) { |
| | | response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "查看PDF失败: " + e.getMessage()); |
| | | } |
| | | } catch (IOException ex) { |
| | | log.error("发送错误响应失败", ex); |
| | | } |
| | | return ServerResponse.createByErrorMsg("查看PDF失败: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | |
| | | log.info("用户{}的签名图片已保存: {}", user.getId(), signatureFileLocal.getAbsolutePath()); |
| | | |
| | | String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir"); |
| | | String pdfFileName = "agreement_" + user.getId() + ".pdf"; |
| | | String pdfFileName = "contract_" + user.getId() + ".pdf"; |
| | | File pdfFile = new File(pdfDir, pdfFileName); |
| | | |
| | | //删之前的图片 |
| | | deleteFilesWithPattern(pdfDir,"contract_" + user.getId()); |
| | | if (pdfFile.exists()) { |
| | | addSignatureToPdf(pdfFile, signatureFileLocal, user); |
| | | |
| | | List<String> imageUrls = convertPdfToImages(pdfFile, "contract", user.getId()); |
| | | |
| | | String imagePrefix = PropertiesUtil.getProperty("pdf.server.http.prefix"); |
| | | long timestamp = System.currentTimeMillis(); |
| | | |
| | | for (int i = 0; i < imageUrls.size(); i++) { |
| | | String imageName; |
| | | if (i == 0) { |
| | | imageName = "contract_" + timestamp + ".png"; |
| | | } else { |
| | | imageName = "contract_" + timestamp + "_" + (i + 1) + ".png"; |
| | | } |
| | | String imagePath = imagePrefix + "/" + imageName; |
| | | |
| | | for(String imageUrl : imageUrls) { |
| | | ContractImage contractImage = new ContractImage(); |
| | | contractImage.setUserId(user.getId()); |
| | | contractImage.setContractType("contract"); |
| | | contractImage.setAddress(imagePath); |
| | | contractImage.setAddress(imageUrl); |
| | | contractImage.setAddTime(new Date()); |
| | | contractImageMapper.insert(contractImage); |
| | | } |
| | | |
| | | iUserService.updateSignedContract(user.getId(), "Y"); |
| | | } |
| | | return ServerResponse.createBySuccessMsg("签名保存成功"); |
| | |
| | | return ServerResponse.createByErrorMsg("用户未登录"); |
| | | } |
| | | |
| | | if (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()) || StringUtils.isBlank(user.getRegAddress())) { |
| | | if (user.getIsActive()!=2 || StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()) || StringUtils.isBlank(user.getRegAddress())) { |
| | | return ServerResponse.createByErrorMsg("用户信息不完整,请先完成实名认证"); |
| | | } |
| | | |
| | |
| | | dir.mkdirs(); |
| | | } |
| | | |
| | | String pdfFileName = "contract_" + user.getId() + ".pdf"; |
| | | String pdfFileName = "agreement_" + user.getId() + ".pdf"; |
| | | File pdfFile = new File(dir, pdfFileName); |
| | | |
| | | String pdfUrl = PropertiesUtil.getProperty("pdf.server.http.prefix") + "/contract_" + user.getId() + ".pdf"; |
| | | |
| | | if (pdfFile.exists()) { |
| | | boolean deleted = pdfFile.delete(); |
| | |
| | | return; |
| | | } |
| | | |
| | | String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir"); |
| | | String pdfFileName = "contract_" + user.getId() + ".pdf"; |
| | | File pdfFile = new File(pdfDir, pdfFileName); |
| | | |
| | | if (!pdfFile.exists()) { |
| | | response.sendError(HttpServletResponse.SC_NOT_FOUND, "合同文件不存在,请先生成合同"); |
| | | return; |
| | | // 从数据库查询已签名的图片 |
| | | List<ContractImage> contractImages = contractImageMapper.selectByUserIdAndType(user.getId(), "agreement"); |
| | | List<String> imageUrls = new ArrayList<>(); |
| | | |
| | | if (contractImages != null && !contractImages.isEmpty()) { |
| | | for (ContractImage image : contractImages) { |
| | | imageUrls.add(image.getAddress()); |
| | | } |
| | | log.info("从数据库查询到用户{}的{}张已签名保密协议图片", user.getId(), imageUrls.size()); |
| | | } |
| | | |
| | | List<String> imageUrls = convertPdfToImages(pdfFile, "agreement", user.getId()); |
| | | |
| | | response.setContentType("application/json;charset=UTF-8"); |
| | | response.getWriter().write(JSON.toJSONString(ServerResponse.createBySuccess(imageUrls))); |
| | |
| | | dir.mkdirs(); |
| | | } |
| | | |
| | | String signatureFileName = "contract_signature_" + user.getId() + ".png"; |
| | | String signatureFileName = "agreement_signature_" + user.getId() + ".png"; |
| | | File signatureFileLocal = new File(dir, signatureFileName); |
| | | |
| | | signatureFile.transferTo(signatureFileLocal); |
| | |
| | | log.info("用户{}的合同签名图片已保存: {}", user.getId(), signatureFileLocal.getAbsolutePath()); |
| | | |
| | | String pdfDir = PropertiesUtil.getProperty("loca.pdf.dir"); |
| | | String pdfFileName = "contract_" + user.getId() + ".pdf"; |
| | | String pdfFileName = "agreement_" + user.getId() + ".pdf"; |
| | | File pdfFile = new File(pdfDir, pdfFileName); |
| | | |
| | | //删之前的图片 |
| | | deleteFilesWithPattern(pdfDir,"agreement_" + user.getId()); |
| | | if (pdfFile.exists()) { |
| | | addSignatureToContractPdf(pdfFile, signatureFileLocal, user); |
| | | |
| | | List<String> imageUrls = convertPdfToImages(pdfFile, "agreement", user.getId()); |
| | | |
| | | String imagePrefix = PropertiesUtil.getProperty("pdf.server.http.prefix"); |
| | | long timestamp = System.currentTimeMillis(); |
| | | |
| | | for (int i = 0; i < imageUrls.size(); i++) { |
| | | String imageName; |
| | | if (i == 0) { |
| | | imageName = "agreement_" + timestamp + ".png"; |
| | | } else { |
| | | imageName = "agreement_" + timestamp + "_" + (i + 1) + ".png"; |
| | | } |
| | | String imagePath = imagePrefix + "/" + imageName; |
| | | |
| | | for (String imageUrl : imageUrls) { |
| | | ContractImage contractImage = new ContractImage(); |
| | | contractImage.setUserId(user.getId()); |
| | | contractImage.setContractType("agreement"); |
| | | contractImage.setAddress(imagePath); |
| | | contractImage.setAddress(imageUrl); |
| | | contractImage.setAddTime(new Date()); |
| | | contractImageMapper.insert(contractImage); |
| | | } |
| | | |
| | | iUserService.updateSignedAgreement(user.getId(), "Y"); |
| | | } |
| | | |
| | |
| | | |
| | | private void replacePlaceholdersInContractPdf(PdfContentByte canvas, Rectangle pageSize, String currentDate, Font font, int pageNum) throws Exception { |
| | | float margin = 50; |
| | | float startY = pageSize.getHeight() - 364; |
| | | float startY = pageSize.getHeight() - 374; |
| | | if(pageNum == 2){ |
| | | // 生成透明背景的日期图片并插入 |
| | | File dateImage = createTextImage(currentDate, font); |
| | |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | try { |
| | | String pdfDir = "D:/work/A-stock/agreement_pdf"; |
| | | String pdfFileName = "agreement_" + 19998 + ".pdf"; |
| | | File pdfFile = new File(pdfDir, pdfFileName); |
| | | convertPdfToImages1(pdfFile,"agreement"); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | /** |
| | | * 将PDF转换为图片 |
| | | */ |
| | | public static void convertPdfToImages1(File pdfFile, String contractType) throws Exception { |
| | | List<String> imageUrls = new ArrayList<>(); |
| | | String imagePrefix = "http://localhost:8099"; |
| | | String pdfDir = "D:/work/A-stock/agreement_pdf"; |
| | | |
| | | long timestamp = System.currentTimeMillis(); |
| | | PDDocument document = null; |
| | | try { |
| | | document = PDDocument.load(pdfFile); |
| | | |
| | | // 创建PDFRenderer,使用高质量渲染 |
| | | PDFRenderer pdfRenderer = new PDFRenderer(document); |
| | | |
| | | int pageCount = document.getNumberOfPages(); |
| | | log.info("PDF总页数: {}", pageCount); |
| | | |
| | | for (int page = 0; page < pageCount; page++) { |
| | | // 使用RGB模式渲染,DPI设置为300确保文字清晰 |
| | | // ImageType.RGB可以更好地处理中文字体 |
| | | BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); |
| | | |
| | | // 对图片进行优化处理,确保文字清晰 |
| | | BufferedImage optimizedImage = optimizeImage1(image); |
| | | |
| | | String imageFileName = contractType + "_" + timestamp + ".png"; |
| | | if (page > 0) { |
| | | imageFileName = contractType + "_" + timestamp + "_" + (page + 1) + ".png"; |
| | | } |
| | | File imageFile = new File(pdfDir, imageFileName); |
| | | |
| | | ImageIO.write(optimizedImage, "png", imageFile); |
| | | |
| | | String imageUrl = imagePrefix + "/imgs/" + imageFileName; |
| | | imageUrls.add(imageUrl); |
| | | |
| | | log.info("PDF第{}页已转换为图片: {}", page + 1, imageUrl); |
| | | } |
| | | } finally { |
| | | if (document != null) { |
| | | document.close(); |
| | | } |
| | | } |
| | | |
| | | // return imageUrls; |
| | | } |
| | | |
| | | public static BufferedImage optimizeImage1(BufferedImage originalImage) { |
| | | int width = originalImage.getWidth(); |
| | | int height = originalImage.getHeight(); |
| | | |
| | | BufferedImage optimizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); |
| | | Graphics2D g2d = optimizedImage.createGraphics(); |
| | | |
| | | // 设置高质量渲染 |
| | | g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); |
| | | g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); |
| | | g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
| | | g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); |
| | | g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); |
| | | |
| | | g2d.drawImage(originalImage, 0, 0, null); |
| | | g2d.dispose(); |
| | | |
| | | return optimizedImage; |
| | | } |
| | | /** |
| | | * 将PDF转换为图片 |
| | | */ |
| | |
| | | // 对图片进行优化处理,确保文字清晰 |
| | | BufferedImage optimizedImage = optimizeImage(image); |
| | | |
| | | String imageFileName = contractType + "_" + timestamp + ".png"; |
| | | String imageFileName = contractType + "_" +userId +"_" + timestamp + ".png"; |
| | | if (page > 0) { |
| | | imageFileName = contractType + "_" + timestamp + "_" + (page + 1) + ".png"; |
| | | imageFileName = contractType+ "_" + userId + "_" + timestamp + "_" + (page + 1) + ".png"; |
| | | } |
| | | File imageFile = new File(pdfDir, imageFileName); |
| | | |
| | | ImageIO.write(optimizedImage, "png", imageFile); |
| | | |
| | | String imageUrl = imagePrefix + "/imgs/" + imageFileName; |
| | | String imageUrl = imagePrefix + "/" + imageFileName; |
| | | imageUrls.add(imageUrl); |
| | | |
| | | log.info("PDF第{}页已转换为图片: {}", page + 1, imageUrl); |
| | |
| | | return ServerResponse.createByErrorMsg("查询失败:" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | public void deleteFilesWithPattern(String dirPath, String userId) { |
| | | File directory = new File(dirPath); |
| | | if (!directory.exists() || !directory.isDirectory()) { |
| | | System.out.println("目录不存在或路径错误: " + dirPath); |
| | | return; |
| | | } |
| | | |
| | | File[] files = directory.listFiles((dir, name) -> name.contains(userId + "_")); |
| | | if (files != null) { |
| | | for (File file : files) { |
| | | if (file.delete()) { |
| | | System.out.println("已删除文件: " + file.getName()); |
| | | } else { |
| | | System.out.println("删除失败: " + file.getName()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |