解析文件(支持 TXT、PDF、JPG、PNG、DOCX),并提取体检数据中的数值

php

以下是一个 PHP 方法,用于解析通过上传接口接收到的文件(支持 TXT、PDF、JPG、PNG、DOCX),并提取体检数据中的数值。

整体流程:

  1. 通过接口上传文件。
  2. 根据文件类型,调用相应的解析方法(例如:解析 TXT、PDF、图片文件、DOCX)。
  3. 使用正则表达式提取体检数据中的数值。

代码示例

php 复制代码
<?php
require 'vendor/autoload.php';  // 包含所需的库

use Smalot\PdfParser\Parser;
use PhpOffice\PhpWord\IOFactory;

class FileParser
{
    public function handleFileUpload($file)
    {
        // 获取文件扩展名
        $fileExtension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        $filePath = $file['tmp_name'];

        // 根据文件类型进行处理
        switch ($fileExtension) {
            case 'txt':
                return $this->parseTxt($filePath);
            case 'pdf':
                return $this->parsePdf($filePath);
            case 'jpg':
            case 'jpeg':
            case 'png':
                return $this->parseImage($filePath);
            case 'docx':
                return $this->parseDocx($filePath);
            default:
                return 'Unsupported file format';
        }
    }

    // 解析 TXT 文件
    private function parseTxt($filePath)
    {
        $content = file_get_contents($filePath);
        return $this->extractValues($content);
    }

    // 解析 PDF 文件
    private function parsePdf($filePath)
    {
        $pdfParser = new Parser();
        $pdf = $pdfParser->parseFile($filePath);
        $text = $pdf->getText();
        return $this->extractValues($text);
    }

    // 解析 JPG/PNG 文件(使用 Tesseract OCR)
    private function parseImage($filePath)
    {
        $ocrCommand = "tesseract " . escapeshellarg($filePath) . " stdout";
        $output = shell_exec($ocrCommand);  // 运行 tesseract 解析图片
        return $this->extractValues($output);
    }

    // 解析 DOCX 文件
    private function parseDocx($filePath)
    {
        $phpWord = IOFactory::load($filePath);
        $text = '';
        foreach ($phpWord->getSections() as $section) {
            foreach ($section->getElements() as $element) {
                if (method_exists($element, 'getText')) {
                    $text .= $element->getText();
                }
            }
        }
        return $this->extractValues($text);
    }

    // 提取数值
    private function extractValues($text)
    {
        preg_match_all('/\d+(\.\d+)?/', $text, $matches);
        return $matches[0];  // 返回所有提取的数值
    }
}

// 文件上传接口处理
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['file'])) {
    $parser = new FileParser();
    $result = $parser->handleFileUpload($_FILES['file']);
    echo json_encode($result);
} else {
    echo json_encode(["error" => "No file uploaded."]);
}

说明:

  1. handleFileUpload 方法负责根据文件类型调用相应的解析方法。
  2. parseTxtparsePdfparseImageparseDocx 分别处理不同文件类型,提取其中的文本内容。
  3. extractValues 使用正则表达式从文本内容中提取所有数值。

文件上传接口示例:

可以通过一个 HTML 表单来测试文件上传:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload File</title>
</head>
<body>
    <form action="your_php_script.php" method="POST" enctype="multipart/form-data">
        <input type="file" name="file">
        <button type="submit">Upload</button>
    </form>
</body>
</html>

依赖库:

  1. PDF 解析smalot/pdfparser,可以通过 composer require smalot/pdfparser 安装。
  2. DOCX 解析phpoffice/phpword,可以通过 composer require phpoffice/phpword 安装。
  3. OCR 解析图片 :需要安装 Tesseract OCR,可以使用 shell_exec 命令调用它。

这样,一个通用的文件上传解析接口就完成了,能够解析 TXT、PDF、图片、DOCX 文件并提取体检数据中的数值。

java

下面是一个 Java 代码示例,用于解析上传的文件(TXT、PDF、JPG、PNG、DOCX),并提取体检数据中的数值。

整体流程:

  1. 上传文件并通过 HTTP 接口接收。
  2. 根据文件类型,调用相应的解析方法(例如:解析 TXT、PDF、图片文件、DOCX)。
  3. 使用正则表达式提取体检数据中的数值。

依赖库:

  • PDF 解析Apache PDFBox
  • DOCX 解析Apache POI
  • 图片 OCR 解析Tesseract OCR

这些库需要在 pom.xml 中添加依赖。

Maven 依赖:
xml 复制代码
<dependencies>
    <!-- Apache PDFBox for PDF parsing -->
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.27</version>
    </dependency>

    <!-- Apache POI for DOCX parsing -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>

    <!-- Tesseract OCR for image text extraction -->
    <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>4.5.5</version>
    </dependency>
</dependencies>

Java 代码示例

java 复制代码
import net.sourceforge.tess4j.Tesseract;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileParser {

    // 解析上传的文件并提取体检数据
    public String handleFileUpload(File file) throws Exception {
        String fileName = file.getName();
        String fileExtension = getFileExtension(fileName);

        switch (fileExtension.toLowerCase()) {
            case "txt":
                return parseTxt(file);
            case "pdf":
                return parsePdf(file);
            case "jpg":
            case "jpeg":
            case "png":
                return parseImage(file);
            case "docx":
                return parseDocx(file);
            default:
                return "Unsupported file format";
        }
    }

    // 获取文件扩展名
    private String getFileExtension(String fileName) {
        int lastIndexOfDot = fileName.lastIndexOf('.');
        if (lastIndexOfDot > 0) {
            return fileName.substring(lastIndexOfDot + 1);
        }
        return "";
    }

    // 解析 TXT 文件
    private String parseTxt(File file) throws IOException {
        String content = new String(java.nio.file.Files.readAllBytes(file.toPath()));
        return extractValues(content);
    }

    // 解析 PDF 文件
    private String parsePdf(File file) throws IOException {
        PDDocument document = PDDocument.load(file);
        PDFTextStripper pdfStripper = new PDFTextStripper();
        String text = pdfStripper.getText(document);
        document.close();
        return extractValues(text);
    }

    // 解析 JPG/PNG 文件(使用 Tesseract OCR)
    private String parseImage(File file) {
        Tesseract tesseract = new Tesseract();
        tesseract.setDatapath("tessdata");  // 设置 Tesseract 数据路径
        try {
            String result = tesseract.doOCR(file);
            return extractValues(result);
        } catch (Exception e) {
            e.printStackTrace();
            return "Failed to extract text from image";
        }
    }

    // 解析 DOCX 文件
    private String parseDocx(File file) throws IOException {
        XWPFDocument doc = new XWPFDocument(new FileInputStream(file));
        StringBuilder text = new StringBuilder();
        List<XWPFParagraph> paragraphs = doc.getParagraphs();
        for (XWPFParagraph para : paragraphs) {
            text.append(para.getText());
        }
        doc.close();
        return extractValues(text.toString());
    }

    // 提取数值
    private String extractValues(String text) {
        Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?");
        Matcher matcher = pattern.matcher(text);
        StringBuilder values = new StringBuilder();
        while (matcher.find()) {
            values.append(matcher.group()).append(" ");
        }
        return values.toString().trim();  // 返回提取的数值
    }
}

说明:

  1. handleFileUpload 方法根据文件类型选择合适的解析方法。
  2. parseTxtparsePdfparseImageparseDocx 方法分别处理 TXT、PDF、图片(JPG、PNG)、DOCX 文件,提取文本内容。
  3. extractValues 方法使用正则表达式提取文本中的数值。

文件上传接口示例

可以通过 Spring Boot 创建一个简单的文件上传接口:

java 复制代码
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "No file uploaded";
        }

        try {
            // 将 MultipartFile 转换为 File
            File convFile = new File(System.getProperty("java.io.tmpdir") + "/" + file.getOriginalFilename());
            file.transferTo(convFile);

            // 解析文件
            FileParser parser = new FileParser();
            String result = parser.handleFileUpload(convFile);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return "File processing failed: " + e.getMessage();
        }
    }
}

总结:

  1. 此 Java 代码提供了一种通用的文件上传解析方案,能够处理 TXT、PDF、图片(JPG、PNG)和 DOCX 文件。
  2. 每种文件格式都使用了相应的库:Apache PDFBox、Apache POI、Tesseract OCR。
  3. 通过正则表达式提取数值,适合提取体检报告中的具体数据。
相关推荐
李少兄1 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝1 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖2 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601012 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人2 小时前
java9新特性详解与实践
java·后端·面试
cg50172 小时前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙2 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
anlogic2 小时前
Java基础 4.3
java·开发语言
非ban必选3 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西3 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea