Python读取PDF文字转txt,解决分栏识别问题,能读两栏

2024-04-01 15:52

本文主要是介绍Python读取PDF文字转txt,解决分栏识别问题,能读两栏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

搜索了一下,大致有这些库能将PDF转txt

1. PyPDF/PyPDF2(截止2024.03.28这两个已经合并成了一个)pypdf · PyPI

2. pdfplumber GitHub - jsvine/pdfplumber: Plumb a PDF for detailed information about each char, rectangle, line, et cetera — and easily extract text and tables.

2. PyMuPDF PyMuPDF · PyPI

3. PDFMiner  (有5年没更新了,不建议使用)GitHub - euske/pdfminer: Python PDF Parser (Not actively maintained). Check out pdfminer.six.

4. pdftotext (Mac系统没安装成功,故未试用) GitHub - jalan/pdftotext: Simple PDF text extraction

 要转txt的PDF有一页内容如下:

其中PyPDF和pdfplumber的代码很相似都用extract_text, PyMuPDF则用get_text:

import pdfplumber
from pypdf import PdfReader
import fitz # PyMuPDFfname = "26.pdf"with pdfplumber.open(fname) as pdf:print(len(pdf.pages))for page in pdf.pages:text = page.extract_text()#提取文本print(text)with open('1.txt', 'w') as f:f.write(text)pdf = PdfReader(fname)
print(len(pdf.pages))
for page in pdf.pages:text = page.extract_text()print(text)with open('2.txt', 'w') as f:f.write(text)with fitz.open(fname) as pdf:text = chr(12).join([page.get_text() for page in pdf])with open('3.txt', 'w') as f:f.write(text)

执行结果如下(从左到右分别是pdfplumber/PyPDF/PyMuPDF) 

对比发现:

1. pdfplumber未能正确处理分栏

2. PyPDF 未能正确识别换行

综上,选择PyMuPDF用来提取PDF中的文字,做成脚本(pdf2txt.py)内容如下:

#!/usr/bin/env python
"""PDF转txtUsage::>>> python pdf2txt.py <pdf>
"""
import os
import sys
from functools import partial
from pathlib import Path# pip install PyMuPDF
import fitz  # type:ignore[import-untyped]def _get_text(page, remove_header_footer):clip = Noneif remove_header_footer:height = 50  # 假设页眉页脚的高度为50rect = page.rectclip = fitz.Rect(0, height, rect.width, rect.height - height)return page.get_text(clip=clip)def pdf2text(fname: str, remove_header_footer=True) -> str:"""提取PDF文本内容:param fname: 文件路径:param remove_header_footer: 是否去除页眉页脚"""if "~" in fname:fname = os.path.expanduser(fname)get_text = partial(_get_text, remove_header_footer=remove_header_footer)with fitz.open(fname) as doc:  # open documenttext = chr(12).join(get_text(page) for page in doc)return textdef main() -> None:if not sys.argv[1:]:if "PYCHARM_HOSTED" not in os.environ:print(__doc__)returnfname = input("请输入PDF文件路径:")else:fname = sys.argv[1]text = pdf2text(fname)new_name = Path(fname).stem + ".txt"size = Path(new_name).write_bytes(text.encode())print(f"Save to {new_name} with {size=}")if __name__ == "__main__":  # pragma: no covermain()

这篇关于Python读取PDF文字转txt,解决分栏识别问题,能读两栏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867559

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu