解析文件(支持 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. 通过正则表达式提取数值,适合提取体检报告中的具体数据。
相关推荐
转世成为计算机大神8 分钟前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
黑客Ash10 分钟前
【D01】网络安全概论
网络·安全·web安全·php
->yjy11 分钟前
计算机网络(第一章)
网络·计算机网络·php
qq_3273427330 分钟前
Java实现离线身份证号码OCR识别
java·开发语言
阿龟在奔跑2 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
飞滕人生TYF2 小时前
m个数 生成n个数的所有组合 详解
java·递归
阳光帅气男孩2 小时前
PhpSpreadsheet导出图片
php
代码小鑫2 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖2 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶2 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka