使用下面的代码片段中,我试图从提取文本数据这个 PDF文件。
import pyPdf
def get_text(path):
# Load PDF into pyPDF
pdf = pyPdf.PdfFileReader(file(path, "rb"))
# Iterate pages
content = ""
for i in range(0, pdf.getNumPages()):
content += pdf.getPage(i).extractText() + "\n" # Extract text from page and add to content
# Collapse whitespace
content = " ".join(content.replace(u"\xa0", " ").strip().split())
return content
在我得到输出 ,但是,缺乏大多数的单词之间的空格。 这使人们难以对文本(我的终极目标,在这里)进行自然语言处理。
此外,在单词“手指”的“科幻”始终解释为别的东西。 这是相当有问题的,因为这论文是关于自然的手指动作...
是否有人知道为什么会发生? 我甚至不知道从哪里开始!
您的PDF文件不具有可打印的空格字符,它只是定位在那里,他们需要去的话。 你必须做一些额外的工作,以找出空间,也许通过假设多字的游程是的话,并把它们之间的间隔。
如果你可以选择在PDF阅读文本,并有空格显示正常,那么至少你知道有足够的信息来重建文本。
“网络连接”是一个合字,示出为单个字符。 您可能会发现这也与“FL”,“FFI”和“ffl第”的发生。 您可以使用字符串替换来代替“网络连接”,为网络结扎。
如果不使用PyPdf2使用Pdfminer库包具有相同的功能,如波纹管。 我从码本和,因为我想我编辑它,这个代码给了我这有字间空白的文本文件。 我有蟒蛇和Python 3.6的工作。 对于安装PdfMiner为Python 3.6,你可以使用这个链接 。
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
class PdfConverter:
def __init__(self, file_path):
self.file_path = file_path
# convert pdf file to a string which has space among words
def convert_pdf_to_txt(self):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8' # 'utf16','utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(self.file_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)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
return str
# convert pdf file text to string and save as a text_pdf.txt file
def save_convert_pdf_to_txt(self):
content = self.convert_pdf_to_txt()
txt_pdf = open('text_pdf.txt', 'wb')
txt_pdf.write(content.encode('utf-8'))
txt_pdf.close()
if __name__ == '__main__':
pdfConverter = PdfConverter(file_path='sample.pdf')
print(pdfConverter.convert_pdf_to_txt())
作为替代PyPDF2,我建议pdftotext
:
#!/usr/bin/env python
"""Use pdftotext to extract text from PDFs."""
import pdftotext
with open("foobar.pdf") as f:
pdf = pdftotext.PDF(f)
# Iterate over all the pages
for page in pdf:
print(page)
PDFBox的是提取使用Java的PDF文件的文本相当不错的工具。 文本提取是它的强项; 如果你想修改/注释或查看PDF文件,另一个工具可以更好地为您服务。 它用于识别文件空间的代码。
它还具有处理连字码,但你需要对classpath中对于工作有一定的国际化库 - ICU4J。
你可以把从Python中PDFBox的文本提取作为一个命令行程序,而无需编写任何Java代码。