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)
相关推荐
用户7783366132115 小时前
用 React Hook 封装搜索数据:useSerp 的防抖、缓存与错误处理
python·api
65岁退休Coder9 小时前
LangGraph v1.2.9 节点容错策略 & 流式输出 & 持久化记忆管理
后端·python·langchain
SelectDB10 小时前
StarRocks 适合做日志分析吗?
数据分析·json·自动化运维
SelectDB10 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ikun_文11 小时前
Django框架路由Router的使用
python·pycharm·django
IvanCodes11 小时前
Python 基础语法(二):字符串与常用操作
python
昭昭日月明11 小时前
LangChain 生态:从链到代理,开发者需要掌握的三大核心
python·langchain·agent
Csvn12 小时前
🐍 Day 8:面向对象编程
后端·python
程序员天天困12 小时前
向量检索不准怎么办:混合检索与 Rerank 重排序召回优化实战
后端·python·ai编程
alphaTao13 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode