php
以下是一个 PHP 方法,用于解析通过上传接口接收到的文件(支持 TXT、PDF、JPG、PNG、DOCX),并提取体检数据中的数值。
整体流程:
- 通过接口上传文件。
- 根据文件类型,调用相应的解析方法(例如:解析 TXT、PDF、图片文件、DOCX)。
- 使用正则表达式提取体检数据中的数值。
代码示例
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."]);
}
说明:
handleFileUpload
方法负责根据文件类型调用相应的解析方法。parseTxt
、parsePdf
、parseImage
、parseDocx
分别处理不同文件类型,提取其中的文本内容。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>
依赖库:
- PDF 解析 :
smalot/pdfparser
,可以通过composer require smalot/pdfparser
安装。 - DOCX 解析 :
phpoffice/phpword
,可以通过composer require phpoffice/phpword
安装。 - OCR 解析图片 :需要安装
Tesseract OCR
,可以使用shell_exec
命令调用它。
这样,一个通用的文件上传解析接口就完成了,能够解析 TXT、PDF、图片、DOCX 文件并提取体检数据中的数值。
java
下面是一个 Java 代码示例,用于解析上传的文件(TXT、PDF、JPG、PNG、DOCX),并提取体检数据中的数值。
整体流程:
- 上传文件并通过 HTTP 接口接收。
- 根据文件类型,调用相应的解析方法(例如:解析 TXT、PDF、图片文件、DOCX)。
- 使用正则表达式提取体检数据中的数值。
依赖库:
- 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(); // 返回提取的数值
}
}
说明:
handleFileUpload
方法根据文件类型选择合适的解析方法。parseTxt
、parsePdf
、parseImage
、parseDocx
方法分别处理 TXT、PDF、图片(JPG、PNG)、DOCX 文件,提取文本内容。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();
}
}
}
总结:
- 此 Java 代码提供了一种通用的文件上传解析方案,能够处理 TXT、PDF、图片(JPG、PNG)和 DOCX 文件。
- 每种文件格式都使用了相应的库:Apache PDFBox、Apache POI、Tesseract OCR。
- 通过正则表达式提取数值,适合提取体检报告中的具体数据。