From ceb954b540c8c55912a586abc7667a44e79fee91 Mon Sep 17 00:00:00 2001 From: zhouc Date: Sat, 1 Mar 2025 17:50:58 +0800 Subject: [PATCH] =?UTF-8?q?zhouc=20=20PDF=E6=8B=86=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wmyun-module-system-biz/pom.xml | 13 +++- .../controller/admin/pdf/PDFController.java | 74 ++++++++++++++++++ .../controller/admin/pdf/vo/PdfResultVO.java | 18 +++++ .../system/service/pdf/PdfSplitService.java | 17 +++++ .../service/pdf/PdfSplitServiceImpl.java | 76 +++++++++++++++++++ 5 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/PDFController.java create mode 100644 wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/vo/PdfResultVO.java create mode 100644 wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitService.java create mode 100644 wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitServiceImpl.java diff --git a/wmyun-module-system/wmyun-module-system-biz/pom.xml b/wmyun-module-system/wmyun-module-system-biz/pom.xml index 9fbe7e1..018b1a0 100644 --- a/wmyun-module-system/wmyun-module-system-biz/pom.xml +++ b/wmyun-module-system/wmyun-module-system-biz/pom.xml @@ -35,7 +35,12 @@ wmyun-module-infra-api ${revision} - + + + org.apache.pdfbox + pdfbox + 2.0.29 + com.wmyun @@ -151,6 +156,12 @@ org.dromara.hutool hutool-extra + + com.google.protobuf + protobuf-java + 3.25.2 + compile + diff --git a/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/PDFController.java b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/PDFController.java new file mode 100644 index 0000000..6ef9719 --- /dev/null +++ b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/PDFController.java @@ -0,0 +1,74 @@ +package com.wmyun.module.system.controller.admin.pdf; + +import com.wmyun.module.system.controller.admin.pdf.vo.PdfResultVO; +import com.wmyun.module.system.service.pdf.PdfSplitService; +import jakarta.annotation.Resource; +import lombok.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * @author zhouc + * @date 2025/3/1 14:33 + * @className PDFController + * @description + */ +@Tag(name = "管理后台 - PDF处理") +@RestController +@RequestMapping("/system/pdf") +@Validated +@Transactional +public class PDFController { + + @Resource + private PdfSplitService pdfSplitService; + + private String uploadDir; // 配置文件设置存储路径 + + @PostMapping("/split_result") + public ResponseEntity splitPdfresult(@RequestParam("file") MultipartFile file) { + try { + // 保存临时文件 + File tempFile = File.createTempFile("split-", ".pdf"); + file.transferTo(tempFile); + + // 执行拆分 + List resultList = pdfSplitService.splitPdf( + tempFile, + uploadDir + ); + + // 返回结果 + return ResponseEntity.ok(resultList); + + } catch (IOException e) { + return ResponseEntity.status(500) + .body(Map.of("error", "处理失败: " + e.getMessage())); + } + } + + @PostMapping("/split") + public ResponseEntity splitPdf( + @RequestParam("file") MultipartFile file, + @RequestParam(defaultValue = "1") int startPage, + @RequestParam(defaultValue = "1") int endPage) { + try { + File tempFile = File.createTempFile("temp", ".pdf"); + file.transferTo(tempFile); + String outputPath = "/output/"; + pdfSplitService.splitPdfByPages(tempFile, outputPath, startPage, endPage); + return ResponseEntity.ok(" 拆分成功"); + } catch (IOException e) { + return ResponseEntity.status(500).body(" 处理失败: " + e.getMessage()); + } + } +} diff --git a/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/vo/PdfResultVO.java b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/vo/PdfResultVO.java new file mode 100644 index 0000000..94944b8 --- /dev/null +++ b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/controller/admin/pdf/vo/PdfResultVO.java @@ -0,0 +1,18 @@ +package com.wmyun.module.system.controller.admin.pdf.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author zhouc + * @date 2025/3/1 15:21 + * @className PdfResultVO + * @description + */ +@Data +@AllArgsConstructor +public class PdfResultVO { + private String fileName; // 拆分后的文件名 + private String filePath; // 服务器存储路径 + private Long fileSize; // 文件大小(字节) +} diff --git a/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitService.java b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitService.java new file mode 100644 index 0000000..b29d611 --- /dev/null +++ b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitService.java @@ -0,0 +1,17 @@ +package com.wmyun.module.system.service.pdf; + +import com.wmyun.module.system.controller.admin.pdf.vo.PdfResultVO; +import org.apache.pdfbox.pdmodel.PDDocument; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public interface PdfSplitService { + List splitPdf(File sourceFile, String outputDir); + + void splitPdfByPages(File sourceFile, String outputDir, int startPage, int endPage); + + void splitAllPages(File sourceFile, String outputDir); +} diff --git a/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitServiceImpl.java b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitServiceImpl.java new file mode 100644 index 0000000..8803d14 --- /dev/null +++ b/wmyun-module-system/wmyun-module-system-biz/src/main/java/com/wmyun/module/system/service/pdf/PdfSplitServiceImpl.java @@ -0,0 +1,76 @@ +package com.wmyun.module.system.service.pdf; + +import com.wmyun.module.system.controller.admin.pdf.vo.PdfResultVO; +import org.apache.pdfbox.pdmodel.PDDocument; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhouc + * @date 2025/3/1 15:42 + * @className PdfSplitServiceImpl + * @description + */ +public class PdfSplitServiceImpl { + public List splitPdf(File sourceFile, String outputDir) throws IOException { + List results = new ArrayList<>(); + try (PDDocument document = PDDocument.load(sourceFile)) { + int totalPages = document.getNumberOfPages(); + + for (int i = 0; i < totalPages; i++) { + // 创建单页文档 + PDDocument singlePageDoc = new PDDocument(); + singlePageDoc.addPage(document.getPage(i)); + + // 生成文件名和路径 + String fileName = "page_" + (i + 1) + ".pdf"; + File outputFile = new File(outputDir, fileName); + singlePageDoc.save(outputFile); + + // 构建返回VO + results.add(new PdfResultVO( + fileName, + outputFile.getAbsolutePath(), + outputFile.length() + )); + singlePageDoc.close(); + } + } + return results; + } + + public void splitPdfByPages(File sourceFile, String outputDir, int startPage, int endPage) throws IOException { + try (PDDocument document = PDDocument.load(sourceFile)) { + int totalPages = document.getNumberOfPages(); + // 校验页码范围 + if (startPage < 1 || endPage > totalPages) { + throw new IllegalArgumentException("页码超出范围"); + } + + PDDocument newDoc = new PDDocument(); + for (int i = startPage - 1; i < endPage; i++) { + newDoc.addPage(document.getPage(i)); + } + + String fileName = sourceFile.getName().replace(".pdf", + "_split_" + startPage + "-" + endPage + ".pdf"); + newDoc.save(new File(outputDir, fileName)); + newDoc.close(); + } + } + + public void splitAllPages(File sourceFile, String outputDir) throws IOException { + try (PDDocument document = PDDocument.load(sourceFile)) { + int totalPages = document.getNumberOfPages(); + for (int i = 0; i < totalPages; i++) { + PDDocument singlePageDoc = new PDDocument(); + singlePageDoc.addPage(document.getPage(i)); + singlePageDoc.save(new File(outputDir, "page_" + (i + 1) + ".pdf")); + singlePageDoc.close(); + } + } + } +}