python解析pdf文件

先安装PyPDF2,据说这是目前最好的解析pdf的包

pip install PyPDF2

 PDF文件分割、拼接

import os
from PyPDF2 import PdfFileWriter, PdfFileReader


def clear_dir(dir_path):
    """清空目录下的文件"""
    names = os.listdir(dir_path)
    for name in names:
        file_path = os.path.join(dir_path, name)
        cmd = 'del %s' % file_path    #这个是windows命令
        #cmd = 'rm -rf %s' % file_path  #这个是Linux的命令
        cmd = cmd.replace('/', '\\')  #为啥要这个?因为windows命令不支持/所以需要替换,Linux命令没有遇见这个问题;
        os.system(cmd)  #可以通过返回值来判断是否执行成功:0成功,其他失败


def split_pdf(pdf, output_dir):
    """pdf按每页拆分"""
    clear_dir(output_path)
    # 获取 PdfFileReader 对象
    reader = PdfFileReader(pdf_file)
    pages_num = reader.getNumPages()
    # writer = PdfFileWriter() 生成一个文件
    for index in range(pages_num):
        #可以通过对index判断分割想要的
        writer = PdfFileWriter()  #按照每页来分割pdf
        pageObj = reader.getPage(index)
        writer.addPage(pageObj)
        # 添加完每页,再一起保存至文件中;如果要输出一个文件,后面这些放置到循环外即可
        file_name = os.path.join(output_path, str(index) + '.pdf')
        with open(file_name, 'wb') as fw:
            writer.write(fw)

PDF文件抽取表格、文本

需要的包:pdfplumber,tabula,camelot

pdfplumber

①每页单独对象,支持文本、表格数据的抽取(亮点);

②文本抽取:保留了文本的格式,比如换行位置有空格,可以通过这个特点将一段的文本整合;

③表格数据抽取:不会被换行数据所干扰;

缺点:

①文本抽取:如果这页有表格数据,抽取到的文本数据中会包含表格数据(也可能是一个优点???)。

②表格数据抽取:对于有合并单元格的表格,无法还原表格结构。

③表格数据抽取:表格数据不能100%保证和原数据一致,可能少那么接个字,可能识别出错等。

④表格数据抽取(缺陷):最主要的还是对无边界的表格,效果很差,会丢失边缘的数据!!!

⑤表格数据抽取:会被流程图、柱状图干扰;

import pdfplumber
pdf = r'../data/text.pdf'
wookroot = pdfplumber.open(pdf)
pages = wookroot.pages
for page in pages:
    text = page.extract_text()
    tables = page.extract_tables()
    print(text)
    print(tables)
    break
wookroot.close()

tablua

专门用于抽取PDF文件中表格数据的包

优点:

①抽取出来表格数据可以反向推导出表格的结构(亮点);

②不会换行数据干扰;

③可以指定页读取

缺点:

①无法保证表格数据100%准确;

②对于无边界表格支持不好,丢失数据;

import tablua


def get_tabula_tables(pdf_path):
    dfs = tabula.read_pdf(pdf_path, pages='all', encoding='gbk')
    tables = []
    for df in dfs:
        df = df.fillna('')
        headers = df.keys().values.tolist()
        lt = []
        for header in headers:
            if header.count('Unnamed'):
                lt.append('')
                continue
            if header[-1].isdigit() and header.count('.'):
                words = header.split('.')
                line = '.'.join(words[:-1])
                if headers.count(line):
                    lt.append(line)
                    continue
            lt.append(header)
        headers = lt
        values = df.values.tolist()
        lt = []
        for words in values:
            rows = []
            for word in words:
                if not isinstance(word, str):
                    word = str(word)
                    if word[-2:] == '.0':
                        word = word[:-2]
                        rows.append(word)
                        continue
                rows.append(word)
            lt.append(rows)
        values = lt
        values.insert(0, headers)
        tables.append(values)
    return tables


pdf_file = 'xxxx.pdf'
tables = get_tabula_tables(pdf_path)

读取表格中的整数,后面会带有“.0“。

PDF文件转docx

pdf提取困难,可以尝试先转换成文档。

pdf2docx

from pdf2docx import Converter
import logging


logging.disable(logging.INFO)
logging.disable(logging.DEBUG)
logging.disable(logging.WARNING)


pdf_file = 'xxx.pdf'
cv = Converter(pdf_file)
docx_file = 'xxx.docx'
cv.convert(docx_file)
cv.close()

相关推荐

  1. python解析pdf文件

    2024-07-21 18:40:03       30 阅读
  2. Python pdfplumber库:轻松解析PDF文件

    2024-07-21 18:40:03       37 阅读
  3. PDF解析--PyMuPDF (python 文档解析提取)

    2024-07-21 18:40:03       49 阅读
  4. 基于pythonPDF文件解析器汇总

    2024-07-21 18:40:03       32 阅读
  5. PDF合并】利用 Python 合并 PDF 文件

    2024-07-21 18:40:03       49 阅读
  6. Python】pptx文件pdf

    2024-07-21 18:40:03       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 18:40:03       171 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 18:40:03       189 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 18:40:03       157 阅读
  4. Python语言-面向对象

    2024-07-21 18:40:03       170 阅读

热门阅读

  1. NOI2024 - 最终的答案

    2024-07-21 18:40:03       28 阅读
  2. hi.开灯

    hi.开灯

    2024-07-21 18:40:03      36 阅读
  3. 前端面试 vue 接口权限控制

    2024-07-21 18:40:03       37 阅读
  4. Leetcode热题100 Day3

    2024-07-21 18:40:03       35 阅读
  5. SQL Server查询计划阅读及分析

    2024-07-21 18:40:03       32 阅读
  6. 【整理了一些关于使用swoole使用的解决方案】

    2024-07-21 18:40:03       27 阅读
  7. Vue中如何封装接口

    2024-07-21 18:40:03       36 阅读