From 9f9da3a0dc20a0ee1247718632e891c91e31d1ed Mon Sep 17 00:00:00 2001 From: 18792927508 <1322446236@qq.com> Date: Tue, 28 Nov 2023 16:33:13 +0800 Subject: [PATCH] =?UTF-8?q?html=E8=BD=ACpdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wisdomarbitrate/VideoController.java | 14 ++ ruoyi-common/pom.xml | 11 ++ .../com/ruoyi/common/config/RuoYiConfig.java | 4 + .../java/com/ruoyi/common/utils/PdfUtils.java | 148 ++++++++++++++++++ .../domain/vo/ReservedConferenceVO.java | 15 +- .../wisdomarbitrate/service/VideoService.java | 8 + .../service/impl/VideoServiceImpl.java | 38 ++++- 7 files changed, 234 insertions(+), 4 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/PdfUtils.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/VideoController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/VideoController.java index 7e8590a..c5958ad 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/VideoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/VideoController.java @@ -118,6 +118,20 @@ public class VideoController extends BaseController { return videoService.secretaryRoleByUserId(userId); } + /** + * 根据html字符串转pdf并和案件关联 + * @param reservedConferenceVO + * @return + */ + @Anonymous + @PostMapping("htmlToPDF") + public AjaxResult secretaryRoleByUserId( @RequestBody ReservedConferenceVO reservedConferenceVO) { + if( reservedConferenceVO.getCaseId()==null || StrUtil.isEmpty(reservedConferenceVO.getHtmlContent())){ + return success(); + } + + return videoService.htmlToPDF(reservedConferenceVO); + } } diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index c5d7008..d664b74 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -181,6 +181,17 @@ + + com.itextpdf + itextpdf + 5.5.13 + + + com.itextpdf.tool + xmlworker + 5.5.13 + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java index c5891c0..26e9f2f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java @@ -140,5 +140,9 @@ public class RuoYiConfig { return getProfile() + "/video"; } + public static String getHtml2PDFPath() + { + return getProfile() + "/upload/html2PDF/"; + } // https://1304001529.vod-qcloud.com/b78823bbvodcq1304001529/3ce565bf3270835011486046286/f0.mp4 } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PdfUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PdfUtils.java new file mode 100644 index 0000000..9ebfa39 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PdfUtils.java @@ -0,0 +1,148 @@ +package com.ruoyi.common.utils; + +import com.documents4j.api.DocumentType; +import com.documents4j.api.IConverter; +import com.documents4j.job.LocalConverter; +import com.itextpdf.text.Document; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.pdf.PdfWriter; +import com.itextpdf.tool.xml.XMLWorkerHelper; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.file.Files; + +/** + * @author wangqiong + * @description pdf转换工具类 + * @date 2023-11-28 15:20 + */ +public class PdfUtils { + /** + * 将html字符串转为pdf + * @param pdfFilePath 保存的路径 + * @param htmlcontent:必须是完整的html格式,比如123 + */ + public static boolean htmlStringConvertToPDF(String pdfFilePath, String htmlcontent) { + Document document = new Document(); + PdfWriter writer = null; + try { + if(!new File(pdfFilePath).exists()){ + new File(pdfFilePath).createNewFile(); + } + writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath)); + // 设置底部距离60,解决重叠问题 + document.setPageSize(PageSize.A4); + document.setMargins(50, 45, 50, 60); + document.setMarginMirroring(false); + document.open(); + XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(htmlcontent.getBytes("UTF-8")), null, Charset.forName("UTF-8")); + } catch (Exception e) { + return false; + } finally { + if (null != document) { + document.close(); + } + if (null != writer) { + writer.close(); + } + } + return true; + } + /** + * 根据html文件生成pdf + * @param pdfFilePath pdf文件生成路径 + * @param htmlFilePath html文件路径 + */ + public static boolean htmlFileConvertToPDF(String pdfFilePath, String htmlFilePath) { + Document document = new Document(); + PdfWriter writer = null; + FileOutputStream fileOutputStream = null; + FileInputStream fileInputStream = null; + try { + fileOutputStream = new FileOutputStream(pdfFilePath); + writer = PdfWriter.getInstance(document, fileOutputStream); + // 设置底部距离60,解决重叠问题 + document.setPageSize(PageSize.A4); + document.setMargins(50, 45, 50, 60); + document.setMarginMirroring(false); + document.open(); + StringBuffer sb = new StringBuffer(); + fileInputStream = new FileInputStream(htmlFilePath); + BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8")); + String readStr = ""; + while ((readStr = br.readLine()) != null) { + sb.append(readStr); + } + XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(sb.toString().getBytes("Utf-8")), null, Charset.forName("UTF-8")); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != document) { + document.close(); + } + if (null != writer) { + writer.close(); + } + if (null != fileInputStream) { + try { + fileInputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != fileOutputStream) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return true; + } + + /** + * docx转pdf + * @param pdfSaveDirectory:文件保存目录,例:D:\\pdf\\ + * @param fileName:保存的文件名称,例:test.pdf + * @param docxFile:需要转换的docx文件 + * @return + */ + private static boolean docxConvertToPDF(String pdfSaveDirectory,String fileName,File docxFile) { + // 不存在则新建 + File directory = new File(pdfSaveDirectory); + if (!directory.exists()) { + directory.mkdirs(); + } + String pdfFilePath = pdfSaveDirectory + fileName; + File outputFile = new File(pdfFilePath); + try { + InputStream docxInputStream = Files.newInputStream(docxFile.toPath()); + OutputStream outputStream = Files.newOutputStream(outputFile.toPath()); + IConverter converter = LocalConverter.builder().build(); + converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute(); + docxInputStream.close(); + outputStream.close(); + + } catch (Exception e) { + return false; + } + return true; + } + + public static void main(String[] args) { + try { + + String pdfFile = "D:\\test2.pdf"; + String htmlContent1 = "

夫士大夫士大夫发

会见韩国机构行家

地方鬼地方鬼地方三个广泛的

"; + String htmlContent = "" + "

夫士大夫士大夫发

会见韩国机构行家

地方鬼地方鬼地方三个广泛的

"; + String htmlContent2 = "" + "

夫士大夫士大夫发

会见韩国机构行家

地方鬼地方鬼地方三个广泛的

"; + + htmlStringConvertToPDF(pdfFile,htmlContent); +// parseHtml2PdfByFilePath(pdfFile,htmlFile); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/vo/ReservedConferenceVO.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/vo/ReservedConferenceVO.java index 19cbf26..75851a9 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/vo/ReservedConferenceVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/vo/ReservedConferenceVO.java @@ -23,12 +23,25 @@ public class ReservedConferenceVO { * 房间号id */ private Long roomId; + /** + * 会议开始时间 + */ @NotNull(message = "会议开始时间不能为空") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date scheduleStartTime; - + /** + * 会议结束时间 + */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date scheduleEndTime; + /** + * 案件id + */ @NotNull(message = "案件id不能为空") private Long caseId; + /** + * html内容 + */ + private String htmlContent; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/VideoService.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/VideoService.java index 253c9ea..76e76af 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/VideoService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/VideoService.java @@ -2,6 +2,7 @@ package com.ruoyi.wisdomarbitrate.service; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication; +import com.ruoyi.wisdomarbitrate.domain.vo.ReservedConferenceVO; import com.ruoyi.wisdomarbitrate.domain.vo.WeChatUserVO; import javax.servlet.http.HttpServletRequest; @@ -39,4 +40,11 @@ public interface VideoService { * @return */ AjaxResult secretaryRoleByUserId(Long userId); + + /** + * 根据html字符串转pdf并和案件关联 + * @param reservedConferenceVO + * @return + */ + AjaxResult htmlToPDF(ReservedConferenceVO reservedConferenceVO); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/VideoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/VideoServiceImpl.java index 7a4cc07..ec0531f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/VideoServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/VideoServiceImpl.java @@ -13,9 +13,11 @@ import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.PdfUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SmsUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysUserMapper; @@ -23,6 +25,7 @@ import com.ruoyi.system.mapper.SysUserRoleMapper; import com.ruoyi.wisdomarbitrate.domain.CaseApplication; import com.ruoyi.wisdomarbitrate.domain.CaseAttach; import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication; +import com.ruoyi.wisdomarbitrate.domain.vo.ReservedConferenceVO; import com.ruoyi.wisdomarbitrate.domain.vo.WeChatUserVO; import com.ruoyi.wisdomarbitrate.mapper.CaseApplicationMapper; import com.ruoyi.wisdomarbitrate.mapper.CaseAttachMapper; @@ -312,6 +315,38 @@ public class VideoServiceImpl implements VideoService { return success(jsonObject); } + /** + * 根据html字符串转pdf并和案件关联 + * @param reservedConferenceVO + * @return + */ + @Override + public AjaxResult htmlToPDF(ReservedConferenceVO reservedConferenceVO) { + String currentFileName = System.currentTimeMillis() + ".pdf"; + String fileName = null; + try { + fileName = getPathFileName(RuoYiConfig.getHtml2PDFPath(), currentFileName); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // html转pdf并上传到服务器 + boolean convertFlag = PdfUtils.htmlStringConvertToPDF(RuoYiConfig.getHtml2PDFPath() + currentFileName, reservedConferenceVO.getHtmlContent()); + + // 绑定案件 + if(convertFlag){ + CaseAttach caseAttach = CaseAttach.builder().caseAppliId(reservedConferenceVO.getCaseId()) + .annexName(fileName) + .annexPath(RuoYiConfig.getHtml2PDFPath()) + .annexType(11) + .build(); + caseAttachMapper.save(caseAttach); + return AjaxResult.success(); + }else { + return AjaxResult.error("pdf转换失败"); + } + } + /** * 查询出音视频集合,并下载,在将云点播上面的音视频删除 @@ -388,9 +423,7 @@ public class VideoServiceImpl implements VideoService { staticAndMksDir = Paths.get(absPath).toFile().toString(); long downloadFile = HttpUtil.downloadFile(fileUrl, staticAndMksDir); if(downloadFile>0) { - log.info("下载成功roomId"+roomId); Long caseId = caseApplicationMapper.selectCaseIdByRoomId(roomId); - log.info("下载成功caseId"+caseId); String annexName = getPathFileName(RuoYiConfig.getVideoUploadPath(), fileName); // 存入数据库 CaseAttach caseAttach = CaseAttach.builder().caseAppliId(caseId) @@ -399,7 +432,6 @@ public class VideoServiceImpl implements VideoService { .annexType(9) .build(); caseAttachMapper.save(caseAttach); - log.info("保存附件号成功"); return annexName; } }