欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java+AI驅(qū)動實現(xiàn)PDF文件數(shù)據(jù)提取與解析

 更新時間:2025年08月19日 08:28:41   作者:AAA專業(yè)寫后端劉哥  
本文將和大家分享一套基于 AI 的體檢報告智能評估方案,詳細介紹從 PDF 上傳、內(nèi)容提取到 AI 分析、數(shù)據(jù)存儲的全流程自動化實現(xiàn)方法,感興趣的可以了解下

體檢結(jié)束后,面對報告中繁多的指標和專業(yè)術語,許多人常會感到困惑:這些數(shù)據(jù)代表什么含義?是否存在健康風險?需要采取哪些應對措施?人工解讀不僅依賴專業(yè)知識,效率也相對低下。本文將分享一套基于 AI 的體檢報告智能評估方案,詳細介紹從 PDF 上傳、內(nèi)容提取到 AI 分析、數(shù)據(jù)存儲的全流程自動化實現(xiàn)方法。

一、核心流程:從上傳到評估的完整鏈路

本系統(tǒng)的核心目標是:用戶上傳體檢報告 PDF 后,系統(tǒng)自動解析內(nèi)容,調(diào)用 AI 生成結(jié)構化評估結(jié)果,最終存儲到數(shù)據(jù)庫供前端展示。整體流程分為兩大步驟:

  • 上傳體檢報告:用戶上傳 PDF 文件 → 存儲至阿里云 OSS → 提取 PDF 文本內(nèi)容 → 臨時緩存到 Redis → 向前端返回上傳結(jié)果。
  • 生成評估結(jié)果:用戶確認解析 → 從 Redis 讀取文本內(nèi)容 → 調(diào)用 AI 大模型生成 JSON 格式評估結(jié)果 → 存儲到數(shù)據(jù)庫 → 完成智能評估。

技術棧選擇:采用 Apache PDFBox 解析 PDF 文本,百度千帆大模型進行智能分析,Redis 用于臨時緩存,MySQL 存儲最終結(jié)果,阿里云 OSS 存儲原始文件。

二、第一步:解析 PDF,提取體檢報告內(nèi)容

PDF 是體檢報告常見的格式,但直接讀取其中的文本存在一定難度。我們選擇 Apache PDFBox 這一成熟的開源 PDF 處理庫來提取文本內(nèi)容。

1. 引入依賴

在項目的 common 模塊中添加 PDFBox 依賴(以 Maven 為例):

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

2. 封裝 PDF 工具類

為方便調(diào)用,封裝PDFUtil工具類,其核心方法pdfToString接收文件輸入流,返回提取的文本:

public class PDFUtil {
    public static String pdfToString(InputStream inputStream) {
        PDDocument document = null;
        try {
            // 加載PDF文檔
            document = PDDocument.load(inputStream);
            // 創(chuàng)建文本提取器
            PDFTextStripper pdfStripper = new PDFTextStripper();
            // 提取文本并返回
            return pdfStripper.getText(document);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 關閉資源
            if (document != null) {
                try {
                    document.close();
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

3. 測試驗證

找一份體檢報告 PDF,編寫簡單的測試類驗證文本提取功能:

public class PDFUtilTest {
    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("C:\tmp\體檢報告-劉愛國-男-69歲.pdf");
        String result = PDFUtil.pdfToString(fileInputStream);
        System.out.println(result); // 打印提取的文本內(nèi)容
    }
}

若控制臺能輸出 PDF 中的文字,則表明解析成功。

三、第二步:集成百度千帆大模型,讓 AI 做專業(yè)解讀

提取文本后,需借助 AI 基于內(nèi)容生成結(jié)構化評估。我們選擇百度千帆大模型(ERNIE-4.0-8K-Preview),它在醫(yī)療領域的理解能力較強,且支持 JSON 格式輸出,便于后續(xù)解析。

1. 準備工作:注冊與認證

注冊百度智能云賬號,完成個人實名認證(需在手機端 APP 操作)。

創(chuàng)建 AccessKey:在控制臺的 “安全認證” 中生成,用于 API 調(diào)用時的身份驗證。

注意:新用戶有 20 元代金券,足夠測試使用;調(diào)用前需確保已開通目標模型的付費權限。

2. 引入 SDK 依賴

在 common 模塊中添加百度千帆 SDK:

<dependency>
    <groupId>com.baidubce</groupId>
    <artifactId>qianfan</artifactId>
    <version>0.1.6</version>
</dependency>

3. 封裝 AI 調(diào)用工具

為便于復用,封裝AIModelInvoker類,統(tǒng)一處理大模型調(diào)用邏輯:

@Component
@Slf4j
public class AIModelInvoker {
    @Autowired
    private BaiduAIProperties baiduAIProperties; // 配置類,讀取accessKey等參數(shù)
    public String qianfanInvoker(String prompt) {
        // 初始化千帆客戶端
        Qianfan qianfan = new Qianfan(baiduAIProperties.getAccessKey(), baiduAIProperties.getSecretKey());
        // 調(diào)用模型
        ChatResponse response = qianfan.chatCompletion()
                .model(baiduAIProperties.getQianfanModel()) // 模型名稱,如ERNIE-4.0-8K-Preview
                .addMessage("user", prompt) // 傳入提示詞
                .temperature(0.7) // 控制輸出隨機性(0-1之間,值越小越穩(wěn)定)
                .maxOutputTokens(2000) // 最大輸出長度
                .responseFormat("json_object") // 指定返回JSON格式
                .execute();
        return response.getResult(); // 返回AI生成的結(jié)果
    }
}

其中BaiduAIProperties用于讀取配置文件中的參數(shù)(accessKey、secretKey、模型名等),避免硬編碼:

@Data
@Configuration
@ConfigurationProperties(prefix = "baidu")
public class BaiduAIProperties {
    private String accessKey;
    private String secretKey;
    private String qianfanModel;
}

在application.yml中配置參數(shù):

baidu:
  accessKey: 你的accessKey
  secretKey: 你的secretKey
  qianfanModel: ERNIE-4.0-8K-Preview

4. 關鍵:設計提示詞(Prompt)

要讓 AI 生成符合要求的結(jié)構化結(jié)果,提示詞的設計至關重要。一個優(yōu)質(zhì)的提示詞需明確:AI 的角色、任務要求、輸入內(nèi)容、輸出格式。

針對體檢報告解析,設計的提示詞如下(核心部分):

請以專業(yè)醫(yī)生的視角分析以下體檢報告,完成以下任務:
1. 提取總檢日期;
2. 給出風險等級(健康/提示/風險/危險/嚴重危險)和健康指數(shù)(0-100分);
3. 計算各風險等級的占比(保留兩位小數(shù));
4. 列出異常數(shù)據(jù)(結(jié)論、項目名、結(jié)果、參考值、單位、解讀、建議);
5. 給8大系統(tǒng)(呼吸、消化等)打分(0-100分);
6. 總結(jié)報告核心結(jié)論。

輸出要求:僅返回JSON,格式如下:

{
  "totalCheckDate": "YYYY-MM-DD",
  "healthAssessment": {
    "riskLevel": "healthy/caution/risk/danger/severeDanger",
    "healthIndex": XX.XX
  },
  "riskDistribution": { ... },
  "abnormalData": [ ... ],
  "systemScore": { ... },
  "summarize": "總結(jié)內(nèi)容"
}

提示詞中明確了 AI 的 “醫(yī)生” 角色,列出了具體任務,并嚴格規(guī)定了 JSON 格式,確保后續(xù)能直接解析。

四、API 接口開發(fā):從上傳到存儲的完整實現(xiàn)

具備 PDF 解析和 AI 調(diào)用的基礎后,開發(fā)實際的業(yè)務接口,實現(xiàn) “上傳報告→AI 評估→存儲結(jié)果” 的全流程。

1. 數(shù)據(jù)庫設計

首先創(chuàng)建health_assessment表,存儲評估結(jié)果,核心字段包括:

老人基本信息(姓名、身份證號、年齡、性別等);

體檢信息(體檢機構、報告 URL、總檢日期等);

AI 評估結(jié)果(健康指數(shù)、風險等級、異常數(shù)據(jù)、系統(tǒng)評分等,以 JSON 格式存儲)。

2. 上傳體檢報告接口

用戶上傳 PDF 時,需將文件存儲到阿里云 OSS,并提取文本緩存到 Redis(供后續(xù) AI 調(diào)用)。

核心代碼(Controller 層):

@ApiOperation("健康文檔上傳")
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file, String idCardNo) throws Exception {
    try {
        // 上傳到OSS,獲取文件URL
        String url = aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename());
        // 提取PDF文本
        String content = PDFUtil.pdfToString(file.getInputStream());
        // 緩存到Redis(key:idCardNo,便于后續(xù)關聯(lián))
        redisTemplate.opsForHash().put("healthReport", idCardNo, content);
        // 返回上傳結(jié)果
        return AjaxResult.success().put("url", url).put("originalFilename", file.getOriginalFilename());
    } catch (Exception e) {
        return AjaxResult.error(e.getMessage());
    }
}

3. 生成評估結(jié)果接口

用戶確認后,從 Redis 讀取文本,調(diào)用 AI 生成結(jié)果,解析后存儲到數(shù)據(jù)庫。

核心代碼(Service 層):

@Override
public Long insertHealthAssessment(HealthAssessmentDto dto) {
    // 1. 從Redis獲取PDF文本
    String content = (String) redisTemplate.opsForHash().get("healthReport", dto.getIdCard());
    if (StringUtils.isEmpty(content)) {
        throw new BaseException("請先上傳體檢報告");
    }
    // 2. 組裝提示詞(結(jié)合dto信息和PDF文本)
    String prompt = buildPrompt(content, dto);
    // 3. 調(diào)用AI生成評估結(jié)果
    String aiResult = aIModelInvoker.qianfanInvoker(prompt);
    if (StringUtils.isEmpty(aiResult)) {
        throw new BaseException("AI分析失敗");
    }
    // 4. 解析AI返回的JSON
    HealthReportVo reportVo = JSONUtil.toBean(aiResult, HealthReportVo.class);
    // 5. 保存到數(shù)據(jù)庫
    HealthAssessment assessment = convertToEntity(reportVo, dto);
    save(assessment);
    return assessment.getId();
}

其中convertToEntity方法將 AI 生成的HealthReportVo轉(zhuǎn)換為數(shù)據(jù)庫實體HealthAssessment,并補充用戶基本信息(如通過身份證號解析年齡、性別等)。

五、總結(jié)與優(yōu)化

通過上述步驟,我們實現(xiàn)了從 PDF 體檢報告上傳到 AI 智能評估、結(jié)果存儲的完整系統(tǒng)。其核心亮點包括:

利用 PDFBox 高效提取文本,解決 PDF 解析難題;

借助百度千帆大模型,將非結(jié)構化文本轉(zhuǎn)化為結(jié)構化 JSON;

采用 Redis 臨時緩存、OSS 存儲文件,保證流程流暢。

后續(xù)可優(yōu)化的方向:

增加 PDF 表格識別功能(部分報告用表格展示指標,需特殊處理);

優(yōu)化提示詞,提高 AI 對罕見指標的解讀準確性;

增加異步處理機制(AI 調(diào)用可能耗時,用異步任務避免前端超時)。

以上就是Java+AI驅(qū)動實現(xiàn)PDF文件數(shù)據(jù)提取與解析的詳細內(nèi)容,更多關于Java PDF數(shù)據(jù)提取的資料請關注腳本之家其它相關文章!

相關文章

  • java實現(xiàn)在SSM下使用支付寶掃碼支付功能

    java實現(xiàn)在SSM下使用支付寶掃碼支付功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)在SSM下使用支付寶掃碼支付功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Springcloud服務注冊consul客戶端過程解析

    Springcloud服務注冊consul客戶端過程解析

    這篇文章主要介紹了Springcloud服務注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 處理Log4j2不能打印行號的問題(AsyncLogger)

    處理Log4j2不能打印行號的問題(AsyncLogger)

    這篇文章主要介紹了處理Log4j2不能打印行號的問題(AsyncLogger),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring?@Autowired注解超詳細示例

    Spring?@Autowired注解超詳細示例

    @Autowired注解可以用在類屬性,構造函數(shù),setter方法和函數(shù)參數(shù)上,該注解可以準確地控制bean在何處如何自動裝配的過程。在默認情況下,該注解是類型驅(qū)動的注入
    2022-08-08
  • springboot與dubbo的版本匹配問題

    springboot與dubbo的版本匹配問題

    這篇文章主要介紹了springboot與dubbo的版本匹配問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 如何實現(xiàn)廣告彈窗觸達頻率的控制?

    如何實現(xiàn)廣告彈窗觸達頻率的控制?

    這篇文章主要介紹了如何實現(xiàn)廣告彈窗觸達頻率的控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java中的回調(diào)機制使用方式

    Java中的回調(diào)機制使用方式

    回調(diào)機制是一種編程模式,允許對象在特定事件觸發(fā)時反向調(diào)用調(diào)用方,Java中通過接口、抽象類或Lambda實現(xiàn),支持同步與異步操作,廣泛用于事件處理、異步編程等場景,具有解耦優(yōu)勢但也存在回調(diào)地獄等維護難題
    2025-08-08
  • Java數(shù)組的動態(tài)初始化和常見問題解析

    Java數(shù)組的動態(tài)初始化和常見問題解析

    本文介紹了數(shù)組動態(tài)初始化的概念,即在初始化時僅指定數(shù)組長度,系統(tǒng)會為數(shù)組分配初始值,而靜態(tài)初始化則手動指定數(shù)組元素,系統(tǒng)根據(jù)元素個數(shù)計算數(shù)組長度,這兩種初始化方式應用場景不同,另外,還講述了數(shù)組默認初始化值的規(guī)律及數(shù)組常見問題,如越界問題等
    2024-10-10
  • springboot中使用ElasticSearch的詳細教程

    springboot中使用ElasticSearch的詳細教程

    這篇文章主要介紹了ElasticSearch在springboot中使用的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • springboot使用jasypt加密庫實現(xiàn)數(shù)據(jù)庫加解密示例代碼

    springboot使用jasypt加密庫實現(xiàn)數(shù)據(jù)庫加解密示例代碼

    這篇文章主要給大家介紹了關于springboot使用jasypt加密庫實現(xiàn)數(shù)據(jù)庫加解密的相關資料,Jasypt是一個用于配置文件加密的Java庫,它可以用來加密和解密配置文件中的敏感信息,如數(shù)據(jù)庫密碼、API?密鑰等,需要的朋友可以參考下
    2024-04-04

最新評論