Agwave / PDF-Resume-Information-Extraction

天池比赛作品整理。实现从pdf中提取出姓名、出生年月、性别、电话、最高学历、籍贯、落户市县、政治面貌、毕业院校、工作单位、工作内容、职务、项目名称、项目责任、学位、毕业时间、工作时间、项目时间共18个字段。
107 stars 28 forks source link

博主能分享一下训练测试数据集吗,学习使用,谢谢 1043164770@qq.com #11

Open 17673640425 opened 10 months ago

17673640425 commented 10 months ago

博主能分享一下训练测试数据集吗,学习使用,谢谢 1043164770@qq.com

17673640425 commented 10 months ago

要使用 Element UI 的 el-upload 组件上传一个 ZIP 文件并将其中的内容一个一个发送到后端,你需要使用 before-upload 事件来获取上传的 ZIP 文件并使用 JSZip 来解压文件,然后将解压后的内容发送到后端。以下是一个示例,演示如何实现这一功能:

<template>
  <div>
    <el-upload
      ref="upload"
      action="your-upload-api-endpoint"
      :before-upload="handleBeforeUpload"
    >
      <el-button size="small" type="primary" @click="uploadFiles">点击上传</el-button>
    </el-upload>
  </div>
</template>

<script>
import JSZip from 'jszip';

export default {
  data() {
    return {
      zipData: null,
      filesToUpload: [],
    };
  },
  methods: {
    handleBeforeUpload(file) {
      // 确保上传的文件类型是ZIP
      if (file.type !== 'application/zip') {
        this.$message.error('请选择ZIP文件');
        return false;
      }

      const reader = new FileReader();

      reader.onload = () => {
        this.zipData = reader.result;
      };

      reader.readAsArrayBuffer(file);
    },
    async processZIP() {
      if (this.zipData) {
        const jszip = new JSZip();
        const zip = await jszip.loadAsync(this.zipData);

        zip.forEach(async (relativePath, file) => {
          const content = await file.async('blob');
          const formData = new FormData();
          formData.append('file', content, file.name);

          this.filesToUpload.push(formData);
        });
      }
    },
    async uploadFiles() {
      await this.processZIP();

      if (this.filesToUpload.length > 0) {
        // 逐个发送解压后的文件到后端
        for (const formData of this.filesToUpload) {
          fetch('your-backend-endpoint', {
            method: 'POST',
            body: formData,
          })
            .then((response) => {
              if (response.ok) {
                console.log('成功发送文件');
              } else {
                console.error('发送文件时出错');
              }
            })
            .catch((error) => {
              console.error('发送文件时出错', error);
            });
        }
      }
    },
  },
};
</script>

在上面的示例中,我们使用 el-upload 组件来上传 ZIP 文件,使用 before-upload 事件来确保上传的文件类型是 ZIP。然后,我们使用 JSZip 来解压 ZIP 文件,并将解压后的文件一个一个地发送到后端。

handleBeforeUpload 方法中,我们使用 FileReader 来读取 ZIP 文件。在 processZIP 方法中,我们使用 JSZip 解压 ZIP 文件,并将解压后的文件存储在 this.filesToUpload 数组中,每个文件都以 FormData 的形式存储,以便上传到后端。

最后,在 uploadFiles 方法中,我们逐个发送解压后的文件到后端。

请确保将 'your-upload-api-endpoint' 替换为你的后端API端点,并根据你的需要传递ZIP文件的数据。同样,你需要确保后端能够正确处理这些文件。

17673640425 commented 10 months ago

要处理上传的ZIP文件,您可以在现有的函数中添加解压缩步骤。然后,按照您原来的方式逐步处理解压后的每个PDF文件,并将处理结果整合成一个数组,最后将该数组发送给前端。以下是一个可能的修改:

import zipfile
import io

@app.post('/qes/')
async def qes(Authorization: str = Header(...), file: UploadFile = File(...)):
    mp = {}
    if utils.verify_jwt(Authorization, app.secret_key):
        file_type = mimetypes.guess_type(file.filename)[0]
        sentences = []
        if file_type == 'application/zip':
            # 解压缩上传的ZIP文件
            try:
                with zipfile.ZipFile(io.BytesIO(await file.read()), 'r') as zipf:
                    for zip_info in zipf.infolist():
                        with zipf.open(zip_info) as pdf_file:
                            pdf_sentences = await get_content['application/pdf']['func'](pdf_file)
                            sentences.extend(pdf_sentences)
            except Exception as e:
                print(e)
                mp = R(None, 400, '解压缩ZIP文件出错')
        elif file_type in get_content:
            try:
                sentences = await get_content[file_type]['func'](file)
            except Exception as e:
                print(e)
                mp = R(None, 400, get_content[file_type]['err_msg'])
        else:
            mp = R(None, 400, 'Oops 请检查文件类型')
        try:
            res = await analysis(sentences)
            mp = R(res, 200, '简历解析成功')
        except Exception as e:
            print(e)
            mp = R(None, 400, '解析出错')
    else:
        mp = R(None, 402, 'token 验证失败')
    return mp

上述代码中,首先检查上传的文件类型是否为ZIP,如果是ZIP文件,它会解压缩文件并处理每个PDF文件。如果文件类型不是ZIP,它将按照原来的方式处理单个文件。然后,将所有处理结果整合到一个数组中并发送给前端。请注意,这里没有处理ZIP文件内部的目录结构,假定ZIP文件中只包含PDF文件。如果ZIP文件包含文件夹结构,您可能需要进一步处理以维护相应的结构。

17673640425 commented 10 months ago

要将一个 PDF 文件转换为 io.BytesIO 格式,你可以使用 Python 中的 PyPDF2 库来读取 PDF 文件的内容,然后将其写入 io.BytesIO 缓冲区。以下是一个示例:

import PyPDF2
import io

# 打开 PDF 文件
with open('your_pdf_file.pdf', 'rb') as pdf_file:
    pdf_reader = PyPDF2.PdfFileReader(pdf_file)

    # 选择要提取的页面(例如,第一页)
    page = pdf_reader.getPage(0)

    # 创建一个 BytesIO 对象
    output = io.BytesIO()

    # 创建一个新的 PDF 写入器
    pdf_writer = PyPDF2.PdfFileWriter()
    pdf_writer.addPage(page)

    # 将 PDF 页面写入 BytesIO 对象
    pdf_writer.write(output)

# 现在,output 包含了 PDF 页面的二进制数据,可以将其用于进一步的处理或输出

这个示例代码会打开一个 PDF 文件,提取第一页的内容,将其写入 io.BytesIO 缓冲区。然后,你可以使用 output.getvalue() 来获取 io.BytesIO 缓冲区中的 PDF 数据。这个数据可以进一步处理或输出,例如,你可以将其发送到前端或保存为文件。

17673640425 commented 10 months ago

前端上传ZIP文件以Blob格式,然后Python后端接收并解压文件,可以使用以下步骤完成:

前端:

  1. 在前端,使用HTML <input type="file"> 元素允许用户选择ZIP文件并将其上传。
  2. 使用JavaScript将选择的ZIP文件转换为Blob,并通过HTTP POST请求将Blob数据发送到后端。

示例前端代码(HTML和JavaScript):

<input type="file" id="zipFileInput">
<button id="uploadButton">Upload</button>

<script>
  document.getElementById('uploadButton').addEventListener('click', async () => {
    const zipFileInput = document.getElementById('zipFileInput');
    const zipFile = zipFileInput.files[0];

    if (zipFile) {
      const formData = new FormData();
      formData.append('zipFile', zipFile);

      const response = await fetch('/upload', {
        method: 'POST',
        body: formData,
      });

      if (response.ok) {
        alert('ZIP file uploaded and processed successfully.');
      } else {
        alert('Failed to upload ZIP file.');
      }
    }
  });
</script>

后端:

  1. 在Python后端,使用一个路由(例如,'/upload')来接收前端发送的ZIP文件。
  2. 使用Python的zipfile库来解压ZIP文件,然后将其内容保存到指定目录。

示例后端代码(使用FastAPI框架):

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import zipfile
import os

app = FastAPI()

@app.post('/upload')
async def upload_zip_file(zip_file: UploadFile = File(...)):
    try:
        # 指定保存目录
        target_directory = 'your_target_directory/'
        os.makedirs(target_directory, exist_ok=True)

        # 将上传的ZIP文件保存到指定目录
        with open(os.path.join(target_directory, zip_file.filename), 'wb') as f:
            f.write(zip_file.file.read())

        # 解压ZIP文件到指定目录
        with zipfile.ZipFile(os.path.join(target_directory, zip_file.filename), 'r') as zip_ref:
            zip_ref.extractall(target_directory)

        return JSONResponse(content={"message": "ZIP file uploaded and processed successfully"})
    except Exception as e:
        return JSONResponse(content={"message": f"Failed to upload and process ZIP file: {str(e)}"}, status_code=400)

这是一个基本示例,您可以根据实际需求进行扩展和改进。请确保替换 'your_target_directory/' 为您想要保存ZIP文件和解压内容的本地目标目录。还要根据您的Web框架和后端库来处理文件上传。前端上传ZIP文件以Blob格式,然后Python后端接收并解压文件,可以使用以下步骤完成:

前端:

  1. 在前端,使用HTML <input type="file"> 元素允许用户选择ZIP文件并将其上传。
  2. 使用JavaScript将选择的ZIP文件转换为Blob,并通过HTTP POST请求将Blob数据发送到后端。

示例前端代码(HTML和JavaScript):

<input type="file" id="zipFileInput">
<button id="uploadButton">Upload</button>

<script>
  document.getElementById('uploadButton').addEventListener('click', async () => {
    const zipFileInput = document.getElementById('zipFileInput');
    const zipFile = zipFileInput.files[0];

    if (zipFile) {
      const formData = new FormData();
      formData.append('zipFile', zipFile);

      const response = await fetch('/upload', {
        method: 'POST',
        body: formData,
      });

      if (response.ok) {
        alert('ZIP file uploaded and processed successfully.');
      } else {
        alert('Failed to upload ZIP file.');
      }
    }
  });
</script>

后端:

  1. 在Python后端,使用一个路由(例如,'/upload')来接收前端发送的ZIP文件。
  2. 使用Python的zipfile库来解压ZIP文件,然后将其内容保存到指定目录。

示例后端代码(使用FastAPI框架):

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import zipfile
import os

app = FastAPI()

@app.post('/upload')
async def upload_zip_file(zip_file: UploadFile = File(...)):
    try:
        # 指定保存目录
        target_directory = 'your_target_directory/'
        os.makedirs(target_directory, exist_ok=True)

        # 将上传的ZIP文件保存到指定目录
        with open(os.path.join(target_directory, zip_file.filename), 'wb') as f:
            f.write(zip_file.file.read())

        # 解压ZIP文件到指定目录
        with zipfile.ZipFile(os.path.join(target_directory, zip_file.filename), 'r') as zip_ref:
            zip_ref.extractall(target_directory)

        return JSONResponse(content={"message": "ZIP file uploaded and processed successfully"})
    except Exception as e:
        return JSONResponse(content={"message": f"Failed to upload and process ZIP file: {str(e)}"}, status_code=400)

这是一个基本示例,您可以根据实际需求进行扩展和改进。请确保替换 'your_target_directory/' 为您想要保存ZIP文件和解压内容的本地目标目录。还要根据您的Web框架和后端库来处理文件上传。

17673640425 commented 10 months ago

要前端上传ZIP文件(包含中文名称和中文内容的文件)以Blob格式,然后在Python后端接收并将其解压到指定路径,您可以使用以下步骤:

前端:

  1. 使用HTML <input type="file"> 元素允许用户选择ZIP文件并将其上传。确保使用enctype="multipart/form-data"来设置表单类型为multipart/form-data,以便支持文件上传。

  2. 使用JavaScript将选择的ZIP文件转换为Blob,并通过HTTP POST请求将Blob数据发送到后端。

示例前端代码(HTML和JavaScript):

<form id="uploadForm" enctype="multipart/form-data">
  <input type="file" id="zipFileInput" name="zipFile">
  <button type="submit">Upload</button>
</form>

<script>
  document.getElementById('uploadForm').addEventListener('submit', async (event) => {
    event.preventDefault();

    const zipFileInput = document.getElementById('zipFileInput');
    const zipFile = zipFileInput.files[0];

    if (zipFile) {
      const formData = new FormData();
      formData.append('zipFile', zipFile);

      const response = await fetch('/upload', {
        method: 'POST',
        body: formData,
      });

      if (response.ok) {
        alert('ZIP file uploaded and processed successfully.');
      } else {
        alert('Failed to upload ZIP file.');
      }
    }
  });
</script>

后端:

  1. 在Python后端,使用一个路由(例如,'/upload')来接收前端发送的ZIP文件。

  2. 使用Python的zipfile库来解压ZIP文件,确保使用适当的编码解压中文文件名和中文内容。

示例后端代码(使用FastAPI框架):

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import zipfile
import os
import shutil

app = FastAPI()

@app.post('/upload')
async def upload_zip_file(zip_file: UploadFile = File(...)):
    try:
        # 指定保存目录
        target_directory = 'your_target_directory/'
        os.makedirs(target_directory, exist_ok=True)

        # 将上传的ZIP文件保存到指定目录
        with open(os.path.join(target_directory, zip_file.filename), 'wb') as f:
            f.write(zip_file.file.read())

        # 解压ZIP文件到指定目录
        with zipfile.ZipFile(os.path.join(target_directory, zip_file.filename), 'r') as zip_ref:
            for file_info in zip_ref.infolist():
                file_name = file_info.filename.encode('cp437').decode('utf-8')
                with open(os.path.join(target_directory, file_name), 'wb') as dest_file:
                    shutil.copyfileobj(zip_ref.open(file_info), dest_file)

        return JSONResponse(content={"message": "ZIP file uploaded and processed successfully"})
    except Exception as e:
        return JSONResponse(content={"message": f"Failed to upload and process ZIP file: {str(e)}"}, status_code=400)

这是一个基本示例,涵盖了如何上传包含中文文件名和中文内容的ZIP文件,并在后端解压这些文件。请确保替换 'your_target_directory/' 为您想要保存ZIP文件和解压内容的本地目标目录。注意,在处理ZIP文件时,文件名可能使用不同的编码,因此需要根据需要进行编码转换,以确保正确解压和保存文件。根据您的具体情况,您可能需要调整代码以处理不同的编码和文件名。

17673640425 commented 10 months ago

要获取一个路径下所有的PDF文件的名称,您可以使用Python的os模块和列表推导式。以下是一个示例代码:

import os

# 指定要搜索PDF文件的目录
directory = '/your/directory/path'  # 替换成实际的目录路径

# 使用列表推导式获取目录下所有PDF文件的名称
pdf_files = [file for file in os.listdir(directory) if file.endswith('.pdf')]

# 打印PDF文件名称
for pdf_file in pdf_files:
    print(pdf_file)

在上述代码中,首先指定要搜索PDF文件的目录路径,并使用os.listdir()来获取该目录下的所有文件和子目录。然后,使用列表推导式筛选出所有以.pdf为扩展名的文件,并将它们保存在pdf_files列表中。最后,您可以遍历pdf_files列表以获取PDF文件的名称。

请确保将'/your/directory/path'替换为实际的目录路径,以便正确搜索目标目录下的PDF文件。