python pdf转txt文本、pdf转json

文章目录


一、前言

此方法只能转文本格式的pdf,如果是图片格式的pdf需要用到ocr包,以后如果有这方面需求再加这个方法


二、实现方法

1. 目录结构


2. 代码

pdf2txt.py 代码如下

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import os

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams


def batch_process(src_dir, tgt_dir):
    '''
    批处理
    :return:
    '''
    for pdf_name in os.listdir(src_dir):
        pdf_path = os.path.join(src_dir, pdf_name)
        text_path = os.path.join(tgt_dir, f'{os.path.splitext(pdf_name)[0]}.txt')
        json_path = os.path.join(tgt_dir, f'{os.path.splitext(pdf_name)[0]}.json')

        pdf_utils = PDFUtils()
        pdf_list = pdf_utils.pdf2list(pdf_path)

        # pdf2txt
        with open(text_path, mode='w', encoding='utf-8') as f:
            f.write(''.join([''.join(page) for page in pdf_list]))

        # pdf2json
        with open(json_path, mode='w', encoding='utf-8') as f:
            f.write(json.dumps(pdf_list, ensure_ascii=False))


class PDFUtils():

    def __init__(self):
        pass

    def pdf2list(self, path):

        pdf_list = []   # 二维数组,一维放页,二维放行
        with open(path, 'rb') as f:
            praser = PDFParser(f)

            doc = PDFDocument(praser)

            if not doc.is_extractable:
                raise PDFTextExtractionNotAllowed

            pdfrm = PDFResourceManager()

            laparams = LAParams()

            device = PDFPageAggregator(pdfrm, laparams=laparams)

            interpreter = PDFPageInterpreter(pdfrm, device)

            for page_idx, page in enumerate(PDFPage.create_pages(doc)):

                line_list = []   # 保存每行数据
                # print(page_idx)
                interpreter.process_page(page)
                layout = device.get_result()
                for line_idx, line in enumerate(layout):
                    # print(line_idx)
                    if hasattr(line, "get_text"):
                        content = line.get_text()
                        # print(content)
                        # output = StringIO()
                        # output.write(content)
                        # content = output.getvalue()
                        # output.close()
                        # print(content)
                        if content and content.replace(' ', '') != '\n':
                            line_list.append(content)
                            # print(content)


                pdf_list.append(line_list)

        # output.close()
        return pdf_list


if __name__ == '__main__':
	
	# pdf目录
    src_dir = './pdf'
    # 生成的txt和json文件的保存目录
    tgt_dir = './text_and_json'
    
    # 批量转换
    batch_process(src_dir, tgt_dir)
相关推荐
谷粒.15 分钟前
Cypress vs Playwright vs Selenium:现代Web自动化测试框架深度评测
java·前端·网络·人工智能·python·selenium·测试工具
小糖学代码7 小时前
LLM系列:1.python入门:3.布尔型对象
linux·开发语言·python
Data_agent7 小时前
1688获得1688店铺详情API,python请求示例
开发语言·爬虫·python
周杰伦fans8 小时前
pycharm之gitignore设置
开发语言·python·pycharm
weixin_462446239 小时前
【原创实践】python 获取节假日列表 并保存为excel
数据库·python·excel
计算机毕设匠心工作室9 小时前
【python大数据毕设实战】全球大学排名数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
别叫我->学废了->lol在线等9 小时前
演示 hasattr 和 ** 解包操作符
开发语言·前端·python
free-elcmacom9 小时前
机器学习入门<6>BP神经网络揭秘:从自行车摔跤到吃一堑长一智的AI智慧
人工智能·python·深度学习·神经网络·机器学习
Hi202402179 小时前
如何录制浏览器播放的音频?虚拟音频线与Python采集步骤
python·音视频
programer_3310 小时前
本地手动创建一个MCP(windows环境)
windows·python·ai·mcp·cherry studio