From 32da85daabbb0e574f12bc7f1e0af6ff5b0cee6a Mon Sep 17 00:00:00 2001
From: zhouweiyi
Date: 星期二, 13 五月 2025 10:55:39 +0800
Subject: [PATCH] 提取PDF中的图片并调用大模型,识别图片内容并返回

---
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java |  219 ++++++++++++++++++++++++++++++------------------------
 1 files changed, 121 insertions(+), 98 deletions(-)

diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java
index e573c82..d8066e7 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java
@@ -1,9 +1,12 @@
 package org.ruoyi.chat.controller.knowledge;
 
 import cn.dev33.satoken.stp.StpUtil;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
+import java.io.IOException;
 import lombok.RequiredArgsConstructor;
 import org.ruoyi.common.core.domain.R;
 import org.ruoyi.common.core.validate.AddGroup;
@@ -14,6 +17,7 @@
 import org.ruoyi.common.web.core.BaseController;
 import org.ruoyi.core.page.PageQuery;
 import org.ruoyi.core.page.TableDataInfo;
+import org.ruoyi.domain.PdfFileContentResult;
 import org.ruoyi.domain.bo.KnowledgeAttachBo;
 import org.ruoyi.domain.bo.KnowledgeFragmentBo;
 import org.ruoyi.domain.bo.KnowledgeInfoBo;
@@ -24,6 +28,7 @@
 import org.ruoyi.service.IKnowledgeAttachService;
 import org.ruoyi.service.IKnowledgeFragmentService;
 import org.ruoyi.service.IKnowledgeInfoService;
+import org.ruoyi.service.PdfImageExtractService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -41,117 +46,135 @@
 @RequestMapping("/knowledge")
 public class KnowledgeController extends BaseController {
 
-    private final IKnowledgeInfoService knowledgeInfoService;
+  private final IKnowledgeInfoService knowledgeInfoService;
 
-    private final IKnowledgeAttachService attachService;
+  private final IKnowledgeAttachService attachService;
 
-    private final IKnowledgeFragmentService fragmentService;
+  private final IKnowledgeFragmentService fragmentService;
 
-    /**
-     * 鏍规嵁鐢ㄦ埛淇℃伅鏌ヨ鏈湴鐭ヨ瘑搴�
-     */
-    @GetMapping("/list")
-    public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
-        if (!StpUtil.isLogin()) {
-            throw new SecurityException("璇峰厛鍘荤櫥褰�!");
-        }
-        bo.setUid(LoginHelper.getUserId());
-        return knowledgeInfoService.queryPageList(bo, pageQuery);
+  private final PdfImageExtractService pdfImageExtractService;
+
+  /**
+   * 鏍规嵁鐢ㄦ埛淇℃伅鏌ヨ鏈湴鐭ヨ瘑搴�
+   */
+  @GetMapping("/list")
+  public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
+    if (!StpUtil.isLogin()) {
+      throw new SecurityException("璇峰厛鍘荤櫥褰�!");
     }
+    bo.setUid(LoginHelper.getUserId());
+    return knowledgeInfoService.queryPageList(bo, pageQuery);
+  }
 
-    /**
-     * 鏂板鐭ヨ瘑搴�
-     */
-    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.INSERT)
-    @PostMapping("/save")
-    public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
-        knowledgeInfoService.saveOne(bo);
-        return R.ok();
-    }
+  /**
+   * 鏂板鐭ヨ瘑搴�
+   */
+  @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.INSERT)
+  @PostMapping("/save")
+  public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
+    knowledgeInfoService.saveOne(bo);
+    return R.ok();
+  }
 
-    /**
-     * 鍒犻櫎鐭ヨ瘑搴�
-     */
-    @PostMapping("/remove/{id}")
-    public R<String> remove(@PathVariable String id) {
-        knowledgeInfoService.removeKnowledge(id);
-        return R.ok("鍒犻櫎鐭ヨ瘑搴撴垚鍔�!");
-    }
+  /**
+   * 鍒犻櫎鐭ヨ瘑搴�
+   */
+  @PostMapping("/remove/{id}")
+  public R<String> remove(@PathVariable String id) {
+    knowledgeInfoService.removeKnowledge(id);
+    return R.ok("鍒犻櫎鐭ヨ瘑搴撴垚鍔�!");
+  }
 
-    /**
-     * 淇敼鐭ヨ瘑搴�
-     */
-    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.UPDATE)
-    @PostMapping("/edit")
-    public R<Void> edit(@RequestBody KnowledgeInfoBo bo) {
-        return toAjax(knowledgeInfoService.updateByBo(bo));
-    }
+  /**
+   * 淇敼鐭ヨ瘑搴�
+   */
+  @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.UPDATE)
+  @PostMapping("/edit")
+  public R<Void> edit(@RequestBody KnowledgeInfoBo bo) {
+    return toAjax(knowledgeInfoService.updateByBo(bo));
+  }
 
-    /**
-     * 瀵煎嚭鐭ヨ瘑搴撳垪琛�
-     */
-    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
-        List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
-        ExcelUtil.exportExcel(list, "鐭ヨ瘑搴�", KnowledgeInfoVo.class, response);
-    }
+  /**
+   * 瀵煎嚭鐭ヨ瘑搴撳垪琛�
+   */
+  @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.EXPORT)
+  @PostMapping("/export")
+  public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
+    List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
+    ExcelUtil.exportExcel(list, "鐭ヨ瘑搴�", KnowledgeInfoVo.class, response);
+  }
 
-    /**
-     * 鏌ヨ鐭ヨ瘑闄勪欢淇℃伅
-     */
-    @GetMapping("/detail/{kid}")
-    public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery, @PathVariable String kid) {
-        bo.setKid(kid);
-        return attachService.queryPageList(bo, pageQuery);
-    }
+  /**
+   * 鏌ヨ鐭ヨ瘑闄勪欢淇℃伅
+   */
+  @GetMapping("/detail/{kid}")
+  public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,
+      @PathVariable String kid) {
+    bo.setKid(kid);
+    return attachService.queryPageList(bo, pageQuery);
+  }
 
-    /**
-     * 涓婁紶鐭ヨ瘑搴撻檮浠�
-     */
-    @PostMapping(value = "/attach/upload")
-    public R<String> upload(KnowledgeInfoUploadBo bo) {
-        knowledgeInfoService.upload(bo);
-        return R.ok("涓婁紶鐭ヨ瘑搴撻檮浠舵垚鍔�!");
-    }
+  /**
+   * 涓婁紶鐭ヨ瘑搴撻檮浠�
+   */
+  @PostMapping(value = "/attach/upload")
+  public R<String> upload(KnowledgeInfoUploadBo bo) {
+    knowledgeInfoService.upload(bo);
+    return R.ok("涓婁紶鐭ヨ瘑搴撻檮浠舵垚鍔�!");
+  }
 
-    /**
-     * 鑾峰彇鐭ヨ瘑搴撻檮浠惰缁嗕俊鎭�
-     *
-     * @param id 涓婚敭
-     */
-    @GetMapping("attach/info/{id}")
-    public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
-                                              @PathVariable Long id) {
-        return R.ok(attachService.queryById(id));
-    }
+  /**
+   * 鑾峰彇鐭ヨ瘑搴撻檮浠惰缁嗕俊鎭�
+   *
+   * @param id 涓婚敭
+   */
+  @GetMapping("attach/info/{id}")
+  public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+  @PathVariable Long id) {
+    return R.ok(attachService.queryById(id));
+  }
 
-    /**
-     * 鍒犻櫎鐭ヨ瘑搴撻檮浠�
-     */
-    @PostMapping("attach/remove/{kid}")
-    public R<Void> removeAttach(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
-                                @PathVariable String kid) {
-        attachService.removeKnowledgeAttach(kid);
-        return R.ok();
-    }
+  /**
+   * 鍒犻櫎鐭ヨ瘑搴撻檮浠�
+   */
+  @PostMapping("attach/remove/{kid}")
+  public R<Void> removeAttach(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+  @PathVariable String kid) {
+    attachService.removeKnowledgeAttach(kid);
+    return R.ok();
+  }
 
 
-    /**
-     * 鏌ヨ鐭ヨ瘑鐗囨
-     */
-    @GetMapping("/fragment/list/{docId}")
-    public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo, PageQuery pageQuery, @PathVariable String docId) {
-        bo.setDocId(docId);
-        return fragmentService.queryPageList(bo, pageQuery);
-    }
+  /**
+   * 鏌ヨ鐭ヨ瘑鐗囨
+   */
+  @GetMapping("/fragment/list/{docId}")
+  public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo,
+      PageQuery pageQuery, @PathVariable String docId) {
+    bo.setDocId(docId);
+    return fragmentService.queryPageList(bo, pageQuery);
+  }
 
-    /**
-     * 涓婁紶鏂囦欢缈昏瘧
-     */
-    @PostMapping("/translationByFile")
-    @ResponseBody
-    public String translationByFile(@RequestParam("file") MultipartFile file, String targetLanguage) {
-        return attachService.translationByFile(file, targetLanguage);
-    }
+  /**
+   * 涓婁紶鏂囦欢缈昏瘧
+   */
+  @PostMapping("/translationByFile")
+  @ResponseBody
+  public String translationByFile(@RequestParam("file") MultipartFile file, String targetLanguage) {
+    return attachService.translationByFile(file, targetLanguage);
+  }
+
+  /**
+   * 鎻愬彇PDF涓殑鍥剧墖骞惰皟鐢╣pt-4o-mini,璇嗗埆鍥剧墖鍐呭骞惰繑鍥�
+   *
+   * @param file PDF鏂囦欢
+   * @return 淇濆瓨鐨勬枃浠惰矾寰勪俊鎭�
+   */
+  @PostMapping("/extract-images")
+  @Operation(summary = "鎻愬彇PDF涓殑鍥剧墖骞惰皟鐢ㄥぇ妯″瀷,璇嗗埆鍥剧墖鍐呭骞惰繑鍥�", description = "鎻愬彇PDF涓殑鍥剧墖骞惰皟鐢╣pt-4o-mini,璇嗗埆鍥剧墖鍐呭骞惰繑鍥�")
+  public R<List<PdfFileContentResult>> extractImages(
+      @RequestPart("file") MultipartFile file
+  ) throws IOException {
+    return R.ok(pdfImageExtractService.extractImages(file));
+  }
 }

--
Gitblit v1.9.3