Java+AI驱动实现PDF文件数据提取与解析

2025-08-19 10:50

本文主要是介绍Java+AI驱动实现PDF文件数据提取与解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下...

体检结束后,面对报告中繁多的指标和专业术语,许多人常会感到困惑:这些数据代表什么含义?是否存在健康风险?需要采取哪些应对措施?人工解读不仅依赖专业知识,效率也相对低下。本文将分享一套基于 AI 的体检报告智能评估方案,详细介绍从 PDF 上传、内容提取到 AI 分析、数据存储的全流程自动化实现方法。

Java+AI驱动实现PDF文件数据提取与解析

一、核心流程:从上传到评估的完整链路

系统的核心目标是:用户上传体检报告 PDF 后,系统自动解析内容,调用 AI 生成结构化评估结果,最终存储到数据库供前端展示。整体流程分为两大步骤:

  • 上传体检报告:用户上传 PDF 文件 → 存储至阿里云 OSS → 提取 PDF 文本内容 → 临时缓存到 Redis → 向前端返回上传结果。
  • 生成评估结果:用户确认解析 → 从 Redis 读取文本内容 → 调用 AI 大模型生成 jsON 格式评估结果 → 存储到数据库 → 完成智能评估。

技术栈选择:采用 Apache PDFBox 解析 PDF 文本,百度千帆大模型进行智能分析,Redis 用于临时缓存,mysql 存储最终结果,阿里云 OSS 存储原始文件。

Java+AI驱动实现PDF文件数据提取与解析

二、第一步:解析 PDF,提取体检报告内容

PDF 是体检报告常见的格式,但直接读取其中的文本存在一定难度。我们选择 Apache PDFBox 这一成熟的开源 PDF 处理库来提取文本内容。

1. 引入依赖

在项目的 common 模块中添加 PDFBox 依赖(以 Maven 为例):

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

2. 封装 PDF 工具类

为方便调用,封装PDFUtil工具类,其核心方法pdfToString接收文件输入流,返回提取的文本:

public class PDFUtil {
    public static String pdfToString(InputStream inputStream) {
        PDDocument document = null;
        try {
            // 加载PDF文档
            document = PDDocument.load(inputStream);
            // 创建文本提取器
            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); // 打印提取的文本内容
    }
}

若控制台能输出 PDF 中的文字,则表明解析成功。

三、第二步:集成百度千帆大模型,让 AI 做专业解读

提取文本后,需借助 AI 基于内容生成结构化评估。我们选择百度千帆大模型(ERNIE-4.0-8K-Preview),它在医疗领域的理解能力较强,且支持 JSON 格式输出,便于后续解析。

1. 准备工作:注册与认证

注册百度智能云账号,完成个人实名认证(需在手机端 APP 操作)。

创建 AccessKey:在控制台的 “安全认证” 中生成,用于 API 调用时的身份验证。

注意:新用户有 20 元代金券,足够测试使用;调用前需确保已开通目标模型的付费权限。

2. 引入 SDK 依赖

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

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

3. 封装 AI 调用工具

为便于复用,封装AIModelInvoker类,统一处理大模型调用逻辑:

@Component
@Slf4j
public class AIModelInvoker {
    @Autowired
    private BaiduAIProperties baiduAIProperties; // 配置类,读取accessKey等参数
    public String qianfanInvoker(String prompt) {
        // 初始化千帆客户端
        Qianfan qianfan = new Qianfan(baiduAIProperties.getAccessKey(), baiduAIProperties.getSecretKey());
        // 调用模型
        ChatResponse response = qianfan.chatCompletion()
                .model(baiduAIProperties.getQianfanModel()) // 模型名称,如ERNIE-4.0-8K-Preview
                .addMessage("user", prompt) // 传入提示词
                .temperature(0.7) // 控制输出随机性(0-1之间,值越小越稳定)
                .maxOutputTokens(2000) // 最大输出长度
                .responseFormat("json_object") // 指定返回JSON格式
                .execute();
        return response.getResult(); // 返回AI生成的结果
    }
}

其中BaiduAIProperties用于读取配置文件中的参数(accessKey、secretKey、模型名等),避免硬编码:

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

在application.yml中配置参数:

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

4. 关键:设计提示词(Prompt)

要让 AI 生成符合要求的结构化结果,提示词的设计至关重要。一个优质的提示词需明确:AI 的角色、任务要求、输入内容、输出格式。

针对体检报告解析,设计的提示词如下(核心部分):

请以专业医生的视角分析以下体检报告,完成以下任务:
1. 提取总检日期;
2. 给出风险等级(健康/提示/风险/危险/严重危险)和健康指数(0-100分);
3. 计算各风险等级的占比(保留两位小数);
4. 列出异常数据(结论、项目名、结果、参考值、单位、解读、建议);
5. 给8大系统(呼吸、消化等)打分(0-100分);
6. 总结报告核心结论。

输出要求:仅返回JSON,格式如下:

{
  "totalCheckDate": "YYYY-MM-DD",
  "healthAssessment": {
    "riskLevel": "healthy/caution/risk/danger/severeDanger",
    "healthIndex": XX.XX
  },
  "riskDistribution": { ... },
  "abnormalDataandroid": [ ... ],
  "systemScore": { ... },
  "summarize": "总结内容"
}

提示词中明确了 AI 的 “医生” 角色,列出了具体任务,并严格规定了 JSON 格式,确保后续能直接解析。

四、API 接口开发:从上传到存储的完整实现

具备 PDF 解析和 AI 调用的基础后,开发实际的业务接口,实现 “上传报告→AI 评估→存储结果” 的全流程。

1. 数据库设计

首先创建health_assessment表,存储评估结果,核心字段包括:

老人基本信息(姓名、身份证号、年龄、性别等);

体检信息(体检机构、报告 URL、总检日期等);

AI 评估结果(健康指数、风险等级、异常数据、系统评分等,以 JSON 格式存储)。

2. 上传体检报告接口

用户上传 PDF 时,需将文件存储到阿里云 OSS,并提取文本缓存到 Redis(供后续 AI 调用)。

核心代码(Controller 层):

@ApiOperation("健康文档上传")
@PostMapping("/upload")
pwww.chinasem.cnublic 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,便于后续关联)
        redisTemplate.opsForHash().put("healthReport", idCardNo, content);
        // 返回上传结果
        return AjaxResult.success().put("url", url).put("originalFilenjavascriptame", file.getOriginalFilename());
    } catch (Exception e) {
        return AjaxResult.error(e.getMessage());
    }
}

3. 生成评估结果接口

用户确认后,从 Redis 读取文本,调用 AI 生成结果,解析后存储到数据库。

核心代码(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. 组装提示词(结合dto信息和PDF文本)
    String prompt = buildPrompt(content, dto);
    // 3. 调用AI生成评估结果
    String aiResult = China编程aIModelInvoker.qianfanInvoker(prompt);
    if (StringUtils.isEmpty(aiResult)) {
        throw new BaseException("AI分析失败");
    }
    // 4. 解析AI返回的JSON
    HealthReportVo reportVo = JSONUtil.toBean(aiResult, HealthReportVo.class);
    // 5. 保存到数据库
    HealthAssessment assessment = convertToEntity(reportVo, dto);
    save(assessment);
    return assessment.getId();
}

其中convertToEntity方法将 AI 生成的HealthReportVo转换为数据库实体HealthAssessmentandroid,并补充用户基本信息(如通过身份证号解析年龄、性别等)。

五、总结与优化

通过上述步骤,我们实现了从 PDF 体检报告上传到 AI 智能评估、结果存储的完整系统。其核心亮点包括:

利用 PDFBox 高效提取文本,解决 PDF 解析难题;

借助百度千帆大模型,将非结构化文本转化为结构化 JSON;

采用 Redis 临时缓存、OSS 存储文件,保证流程流畅。

后续可优化的方向:

增加 PDF 表格识别功能(部分报告用表格展示指标,需特殊处理);

优化提示词,提高 AI 对罕见指标的解读准确性;

增加异步处理机制(AI 调用可能耗时,用异步任务避免前端超时)。

以上就是Java+AI驱动实现PDF文件数据提取与解析的详细内容,更多关于Java PDF数据提取的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于Java+AI驱动实现PDF文件数据提取与解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155811

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三