我正在尝试使用提取此 PDF文件中包含的文本Python
.
我正在使用PyPDF2模块,并具有以下脚本:
import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我得到以下输出,该输出与PDF文档中包含的输出不同:
!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%
Run Code Online (Sandbox Code Playgroud)
如何在PDF文档中提取文本?
DJK*_*DJK 132
正在寻找一个用于python 3.x和windows的简单解决方案.似乎没有textract的支持,这是不幸的,但如果你正在寻找一个简单的解决方案,用于windows/python 3 checkout tika包,真的很直接阅读pdf
from tika import parser
raw = parser.from_file('sample.pdf')
print(raw['content'])
Run Code Online (Sandbox Code Playgroud)
Jak*_*ski 47
使用textract.
它支持许多类型的文件,包括PDF
import textract
text = textract.process("path/to/file.extension")
Run Code Online (Sandbox Code Playgroud)
Qui*_*inn 43
看看这段代码:
import PyPDF2
pdf_file = open('sample.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
输出是:
!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%
Run Code Online (Sandbox Code Playgroud)
使用相同的代码从201308FCR.pdf读取pdf .输出正常.
其文档解释了原因:
def extractText(self):
"""
Locate all text drawing commands, in the order they are provided in the
content stream, and extract the text. This works well for some PDF
files, but poorly for others, depending on the generator used. This will
be refined in the future. Do not rely on the order of text coming out of
this function, as it will change if this function is made more
sophisticated.
:return: a unicode string object.
"""
Run Code Online (Sandbox Code Playgroud)
Mar*_*oma 43
我建议使用pymupdf或pdfminer.six
.
这些包不被维护:
pdfminer
(没有 .6)有不同的选项会产生不同的结果,但最基本的一个是:
import fitz # this is pymupdf
with fitz.open("my.pdf") as doc:
text = ""
for page in doc:
text += page.getText()
print(text)
Run Code Online (Sandbox Code Playgroud)
han*_*ast 22
在尝试textract(似乎有太多的依赖项)和pypdf2(它无法从我测试的pdfs中提取文本)和tika(这太慢了)之后我最终使用pdftotext
了xpdf(正如另一个答案中已经建议的那样)和直接从python中调用二进制文件(您可能需要调整pdftotext的路径):
import os, subprocess
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
args = ["/usr/local/bin/pdftotext",
'-enc',
'UTF-8',
"{}/my-pdf.pdf".format(SCRIPT_DIR),
'-']
res = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = res.stdout.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
有pdftotext基本相同,但这假定在/ usr/local/bin中使用pdftotext,而我在AWS lambda中使用它并希望在当前目录中使用它.
顺便说一下:要在lambda上使用它,你需要将二进制和依赖项libstdc++.so
放入lambda函数中.我个人需要编译xpdf.由于这方面的说明会破坏这个答案,我把它们放在我的个人博客上.
Eug*_*ene 11
您可能希望使用时间证明的xPDF和派生工具来提取文本,因为pyPDF2似乎仍然存在文本提取的各种问题.
长期的答案是,文本在PDF中编码的方式有很多变化,可能需要解码PDF字符串本身,然后可能需要用CMAP进行映射,然后可能需要分析单词和字母之间的距离等.
如果PDF损坏(即显示正确的文本但复制时会产生垃圾)并且您确实需要提取文本,那么您可能需要考虑将PDF转换为图像(使用ImageMagik),然后使用Tesseract从图像中获取文本使用OCR.
Tho*_*Tho 11
我在这里找到了解决方案PDFLayoutTextStripper
这很好,因为它可以保留原始 PDF 的布局。
它是用 Java 编写的,但我添加了一个网关来支持 Python。
示例代码:
from py4j.java_gateway import JavaGateway
gw = JavaGateway()
result = gw.entry_point.strip('samples/bus.pdf')
# result is a dict of {
# 'success': 'true' or 'false',
# 'payload': pdf file content if 'success' is 'true'
# 'error': error message if 'success' is 'false'
# }
print result['payload']
Run Code Online (Sandbox Code Playgroud)
PDFLayoutTextStripper的示例输出:
您可以在此处查看更多详细信息Stripper with Python
在 2020 年,上述解决方案不适用于我正在使用的特定 pdf。以下是诀窍。我使用的是 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'))
Run Code Online (Sandbox Code Playgroud)
pdfplumber是从 pdf 中读取和提取数据的更好的库之一。它还提供了读取表数据的方法,在与许多此类库进行了斗争之后,pdfplumber 最适合我。
请注意,它最适合机器编写的 pdf 而不是扫描的 pdf。
import pdfplumber
with pdfplumber.open(r'D:\examplepdf.pdf') as pdf:
first_page = pdf.pages[0]
print(first_page.extract_text())
Run Code Online (Sandbox Code Playgroud)
以下代码是Python 3中问题的解决方案。在运行代码之前,请确保已PyPDF2
在您的环境中安装了库。如果未安装,请打开命令提示符并运行以下命令:
pip3 install PyPDF2
Run Code Online (Sandbox Code Playgroud)
解决方案代码:
import PyPDF2
pdfFileObject = open('sample.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
page = pdfReader.getPage(i)
print(page.extractText())
Run Code Online (Sandbox Code Playgroud)
小智 6
多页 pdf 可以一次性提取为文本,而不是使用以下代码将单个页码作为参数
import PyPDF2
import collections
pdf_file = open('samples.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
c = collections.Counter(range(number_of_pages))
for i in c:
page = read_pdf.getPage(i)
page_content = page.extractText()
print page_content.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
我尝试了许多Python PDF转换器,Tika最好。
Tika-Python是与Apache Tika™REST服务结合的Python,允许在Python社区中本地调用Tika。
from tika import parser
raw = parser.from_file("///Users/Documents/Textos/Texto1.pdf")
raw = str(raw)
safe_text = raw.encode('utf-8', errors='ignore')
safe_text = str(safe_text).replace("\n", "").replace("\\", "")
print('--- safe text ---' )
print( safe_text )
Run Code Online (Sandbox Code Playgroud)
小智 5
我有一个比 OCR 更好的解决方法,可以在从 PDF 中提取文本时保持页面对齐。应该有帮助:
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(path, 'rb')
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)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
text= convert_pdf_to_txt('test.pdf')
print(text)
Run Code Online (Sandbox Code Playgroud)
截至2021年,我想推荐pdfreader
,因为PyPDF2/3
现在看起来很麻烦,而且tika
实际上是用java编写的,后台需要一个jre。pdfreader
是 pythonic,目前维护良好,并且这里有大量文档。
像往常一样安装:pip install pdfreader
简短的用法示例:
from pdfreader import PDFDocument, SimplePDFViewer
# get raw document
fd = open(file_name, "rb")
doc = PDFDocument(fd)
# there is an iterator for pages
page_one = next(doc.pages())
all_pages = [p for p in doc.pages()]
# and even a viewer
fd = open(file_name, "rb")
viewer = SimplePDFViewer(fd)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
241574 次 |
最近记录: |