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.

  3. PyMuPDF PyMuPDF · PyPI

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

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

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

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

python 复制代码
import pdfplumber
from pypdf import PdfReader
import fitz # PyMuPDF

fname = "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)内容如下:

python 复制代码
#!/usr/bin/env python
"""PDF转txt

Usage::
    >>> 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 = None
    if remove_header_footer:
        height = 50  # 假设页眉页脚的高度为50
        rect = page.rect
        clip = 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 document
        text = chr(12).join(get_text(page) for page in doc)
    return text


def main() -> None:
    if not sys.argv[1:]:
        if "PYCHARM_HOSTED" not in os.environ:
            print(__doc__)
            return
        fname = 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 cover
    main()
相关推荐
weixin_397574097 天前
PDF复杂表格的1:1还原引擎:跨页表格自动拼接技术实战
大数据·人工智能·pdf
Metaphor6927 天前
使用 Python 将 PDF 转换为 HTML
python·pdf·html
2601_961845157 天前
粉笔行测5000题电子版|pdf|解析
pdf·新媒体运营·github·个人开发·内容运营·规格说明书·极限编程
Sour7 天前
PDF翻译卡住不动怎么办?扫描件、OCR 和大文件排查清单
前端·pdf·ocr
狂奔solar7 天前
OpenDataLoader-PDF 做 PDF 解析可视化调试器
pdf·rag 预处理
chatexcel7 天前
ChatExcel Max使用教程:图片、PDF、网页与复杂Excel的一站式数据分析
数据分析·pdf·excel
绘梨衣5477 天前
PDF表格解析知识总结
开发语言·python·pdf
qq_546937277 天前
Excel批量转PDF_Word_图片,支持自动合并报表,效率翻倍。
pdf·word·excel
zyplayer-doc8 天前
企业知识库安全与权限管理完全指南:从加密到审计的六层防护
人工智能·安全·pdf·编辑器·创业创新
易鹤鹤.8 天前
pdf标注高亮
pdf