当前位置: 首页 > article >正文

python pdf转txt文本、pdf转json

文章目录

  • 一、前言
  • 二、实现方法
    • 1. 目录结构
    • 2. 代码


一、前言

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


二、实现方法

1. 目录结构

在这里插入图片描述


2. 代码

pdf2txt.py 代码如下

#!/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)



http://www.kler.cn/a/147700.html

相关文章:

  • leetcode hot100【LeetCode 236.二叉树的最近公共祖先】java实现
  • Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
  • 【C++】—— map 与 set 深入浅出:设计原理与应用对比
  • css中的变量使用
  • Ps:OpenColorIO 设置
  • LeetCode 86.分隔链表
  • OWASP TOP 10 2021 对应的CWE缺陷(官方)
  • 接口幂等+防重复提交+失败重试
  • 【01】ES6:ECMAScript 介绍
  • 获取WordPress分类链接
  • 基于springboot+maven的个人理财管理系统
  • 打造企业AI数字人专属IP的重要性
  • Unity播放网络视频
  • 一、TIDB基础
  • 部署Jenkins
  • Spring框架体系及Spring IOC思想
  • Ruoyi报‘com.ruoyi.system.api.RemoteLogService‘ that could not be found.
  • 典型的SAST支持检测标准
  • C语言:写一个函数,实现3*3矩阵的转置(指针)
  • 美团小游戏rpk包对接流程小记
  • 戴上HUAWEI FreeBuds Pro 3, 近离城市喧嚣,尽情享受无损音质在耳边漫游
  • 【Python】itertools模块,补充:可迭代对象、迭代器
  • Linux CentOS7 LVM
  • python通过numpy进行排序
  • 微服务--02--Nacos注册中心
  • Android RGB转YUV的算法