从空白PDF提取走了,怪字解读(Whitespace gone from PDF extractio

2019-06-25 13:38发布

使用下面的代码片段中,我试图从提取文本数据这个 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

在我得到输出 ,但是,缺乏大多数的单词之间的空格。 这使人们难以对文本(我的终极目标,在这里)进行自然语言处理。

此外,在单词“手指”的“科幻”始终解释为别的东西。 这是相当有问题的,因为这论文是关于自然的手指动作...

是否有人知道为什么会发生? 我甚至不知道从哪里开始!

Answer 1:

您的PDF文件不具有可打印的空格字符,它只是定位在那里,他们需要去的话。 你必须做一些额外的工作,以找出空间,也许通过假设多字的游程是的话,并把它们之间的间隔。

如果你可以选择在PDF阅读文本,并有空格显示正常,那么至少你知道有足够的信息来重建文本。

“网络连接”是一个合字,示出为单个字符。 您可能会发现这也与“FL”,“FFI”和“ffl第”的发生。 您可以使用字符串替换来代替“网络连接”,为网络结扎。



Answer 2:

如果不使用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())


Answer 3:

作为替代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)


Answer 4:

PDFBox的是提取使用Java的PDF文件的文本相当不错的工具。 文本提取是它的强项; 如果你想修改/注释或查看PDF文件,另一个工具可以更好地为您服务。 它用于识别文件空间的代码。

它还具有处理连字码,但你需要对classpath中对于工作有一定的国际化库 - ICU4J。

你可以把从Python中PDFBox的文本提取作为一个命令行程序,而无需编写任何Java代码。



文章来源: Whitespace gone from PDF extraction, and strange word interpretation