20

我正在尝试使用 Python 从 PDF 文件中提取文本。我的主要目标是尝试创建一个程序来读取银行对账单并提取其文本以更新 excel 文件以轻松记录每月支出。现在我只专注于从 pdf 文件中提取文本,但我不知道该怎么做。

目前将 PDF 文件中的文本提取为字符串的最佳和最简单的方法是什么?今天最好使用哪个库,我该怎么做?

我曾尝试使用 PyPDF2,但每次尝试使用 extractText() 从任何页面提取文本时,它都会返回空字符串。我尝试安装 textract 但我收到错误,因为我认为我需要更多库。

import PyPDF2

pdfFileObj = open("January2019.pdf", 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

pageObj = pdfReader.getPage(0)
print(pageObj.extractText())

当它应该打印页面的内容时,它会打印空字符串

4

11 回答 11

45

我尝试了很多方法但都失败了,包括 PyPDF2 和 Tika。我终于找到了适合我的模块pdfplumber,你也可以试试。

希望这对您有所帮助。

import pdfplumber
pdf = pdfplumber.open('pdffile.pdf')
page = pdf.pages[0]
text = page.extract_text()
print(text)
pdf.close()
于 2019-12-18T01:51:49.187 回答
18

使用 tika 对我有用!

from tika import parser

rawText = parser.from_file('January2019.pdf')

rawList = rawText['content'].splitlines()

这使得将银行对账单中的每一行单独提取到一个列表中变得非常容易。

于 2019-04-19T20:56:35.360 回答
6

如果您正在寻找一个维护的、更大的项目,请查看PyMuPDF。安装它pip install pymupdf并像这样使用它:

import fitz

def get_text(filepath: str) -> str:
    with fitz.open(filepath) as doc:
        text = ""
        for page in doc:
            text += page.getText().strip()
        return text
于 2020-08-19T12:30:52.973 回答
3

PyPDF2 从 pdf 中提取文本非常不可靠。正如这里所指出的。它说 :

虽然 PyPDF2 有 .extractText(),可以在它的页面对象上使用(在这个例子中没有显示),但它不能很好地工作。有些 PDF 会返回文本,有些会返回空字符串。当您想从 PDF 中提取文本时,您应该查看 PDFMiner 项目。PDFMiner 更加强大,专为从 PDF 中提取文本而设计。

  1. 您可以改为安装和使用pdfminer使用

    pip install pdfminer

  2. 或者您可以使用另一个名为xpdfreaderpdftotext的开源实用程序。页面上给出了使用该实用程序的说明。

您可以从此处下载命令行工具, 并可以使用 pdftotext.exe 实用程序使用。此处subprocess给出了使用子进程的详细说明

于 2020-05-14T18:31:33.013 回答
1

PyPDF2 无法正确读取整个 pdf。您必须使用此代码。

    import pdftotext

    pdfFileObj = open("January2019.pdf", 'rb')


    pdf = pdftotext.PDF(pdfFileObj)

    # Iterate over all the pages
    for page in pdf:
        print(page)
于 2019-04-19T20:44:31.563 回答
1

这是 Windows 10 Python 3.8 中的替代解决方案

示例测试 pdf:https ://drive.google.com/file/d/1aUfQAlvq5hA9kz2c9CyJADiY3KpY3-Vn/view?usp=sharing

#pip install pdfminer.six
import io

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage


def convert_pdf_to_txt(path):
    '''Convert pdf content from a file path to text

    :path the file path
    '''
    rsrcmgr = PDFResourceManager()
    codec = 'utf-8'
    laparams = LAParams()

    with io.StringIO() as retstr:
        with TextConverter(rsrcmgr, retstr, codec=codec,
                           laparams=laparams) as device:
            with open(path, 'rb') as fp:
                interpreter = PDFPageInterpreter(rsrcmgr, device)
                password = ""
                maxpages = 0
                caching = True
                pagenos = set()

                for page in PDFPage.get_pages(fp,
                                              pagenos,
                                              maxpages=maxpages,
                                              password=password,
                                              caching=caching,
                                              check_extractable=True):
                    interpreter.process_page(page)

                return retstr.getvalue()


if __name__ == "__main__":
    print(convert_pdf_to_txt('C:\\Path\\To\\Test_PDF.pdf'))
于 2020-07-31T11:21:56.817 回答
0
import PyPDF2
pdf-file = open('January2019.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdf-file)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    print(page.extractText())
于 2019-04-19T20:46:21.973 回答
0
import pdftables_api
import os

c = pdftables_api.Client('MY-API-KEY')

file_path = "C:\\Users\\MyName\\Documents\\PDFTablesCode\\"

for file in os.listdir(file_path):
    if file.endswith(".pdf"):
        c.xlsx(os.path.join(file_path,file), file+'.xlsx')

转到https://pdftables.com以获取 API 密钥。

CSV,格式=csv

XML,格式=xml

HTML,格式=html

XLSX,格式=xlsx-single,格式=xlsx-multiple

于 2019-04-25T13:53:58.380 回答
0

试试pdfreader。您可以提取包含“pdf markdown”的纯文本或解码文本:

from pdfreader import SimplePDFViewer, PageDoesNotExist

fd = open(you_pdf_file_name, "rb")
viewer = SimplePDFViewer(fd)

plain_text = ""
pdf_markdown = ""

try:
    while True:
        viewer.render()
        pdf_markdown += viewer.canvas.text_content
        plain_text += "".join(viewer.canvas.strings)
        viewer.next()
except PageDoesNotExist:
    pass

于 2019-12-19T18:56:34.070 回答
0

试试这个:

在终端执行命令:pip install PyPDF2

import PyPDF2
pdfFileObject = open('mypdf.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    print(page.extractText())
于 2020-08-01T13:44:47.600 回答
0

我认为这段代码正是你要找的:

import requests, time, datetime, os, threading, sys, configparser
import glob
import pdfplumber

for filename in glob.glob("*.pdf"):
    pdf = pdfplumber.open(filename)
    OutputFile = filename.replace('.pdf','.txt')
    fx2=open(OutputFile, "a+")
    for i in range(0,10000,1):
        try:
            page = pdf.pages[i]
            text = page.extract_text()
            print(text)
            fx2.write(text)
        except Exception as e: 
            print(e)
    fx2.close()
    pdf.close()
于 2021-02-28T15:16:47.783 回答