Python PDF提取中的空白和奇怪的单词解释

Python PDF提取中的空白和奇怪的单词解释,python,pdf,unicode,pypdf,Python,Pdf,Unicode,Pypdf,使用下面的代码片段,我试图从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).ex

使用下面的代码片段,我试图从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
然而,大多数单词之间没有空格。这使得在文本上执行自然语言处理变得困难,我的最终目标是,在这里

此外,“finger”一词中的“fi”一直被解释为其他词。这是相当有问题的,因为这篇文章是关于自发的手指运动


有人知道为什么会这样吗?我甚至不知道从哪里开始

您的PDF文件没有可打印的空格字符,它只是将单词放置在需要的位置。您必须做额外的工作来计算空格,可能是假设多字符的运行是单词,并在它们之间放置空格

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


fi是一种排版连字,显示为单个字符。您可能会发现,fl、ffi和ffl也存在这种情况。您可以使用字符串替换来替换fi连字。

PDFBox是使用Java从PDF文件中提取文本的非常好的工具。文本抽取是其优势所在;如果您想修改/注释或查看PDF文件,另一个工具可能会更好地为您服务。它有识别文件中空格的代码

它也有处理连字的代码,但是您需要在类路径上有一个特定的国际化库才能工作——Icu4j


您可以将PDFBox文本提取器作为命令行程序从Python中调用,而无需编写任何Java代码。

作为PyPDF2的替代方案,我建议使用pdftotext:


在不使用PyPdf2的情况下,使用具有以下相同功能的Pdfminer库包。我从中获得了代码,并根据我的需要对其进行了编辑,该代码为我提供了一个文本文件,其中的单词之间有空格。我使用anaconda和python 3.6。要安装PdfMiner for python 3.6,可以使用以下命令


PyPDF不读取换行符

所以使用PyPDF4

使用

pip install PyPDF4
并以这段代码为例

import PyPDF4
import re
import io

pdfFileObj = open(r'3134.pdf', 'rb')
pdfReader = PyPDF4.PdfFileReader(pdfFileObj)
pageObj = pdfReader.getPage(1)
pages_text = pageObj.extractText()

for line in pages_text.split('\n'):
    #if re.match(r"^PDF", line):
    print(line)

我使用R解决了这个问题:

library(pdftools)
pdf_file <- "xxx/untitled.pdf"
text <- pdf_text(pdf_file)
cat(text[1])

我试着在这里给出答案,但对我不起作用。在我的情况下,以下方法有效:

from pdf2image import convert_from_path
import pytesseract

images = convert_from_path("sample.pdf")
for i,image in enumerate(images,start=1):
    image.save(f"./images/page_{i}.jpg","JPEG")

print(pytesseract.image_to_string("./images/page_1.jpg"))
这里的想法是首先将PDF转换为图像,然后从中读取文本。这种方法保留了空格

从属关系:

conda安装-c conda forge tesseract conda安装pdf2image 康达安装pytesseract
“fi”是一个,它回答了你问题的一部分。空格和fi在从文本到PDF的翻译过程中丢失了,它们不会回来了。@Ned Batchelder,谢谢你的回复!你能澄清一下,假设多字符运行是单词是什么意思吗?其次,考虑到“fi”是一个排版连字,我如何才能识别PDF中的这种特殊字符,并将它们翻译成两个或多个单独的字符?换句话说,你能建议一种自动处理此类案件的方法吗?@biz yes这个问题需要回答。我自己也遇到了同样的问题,在我看来,这应该是最受欢迎的答案。我也希望这是进行在线搜索时的第一个条目。@BFurtado确保安装了依赖项sudo apt get update,然后sudo apt get install build essential libpoppler cpp dev pkg config python devf对于任何使用Anaconda外部的用户,您需要安装tesseract ocr和poppler库。Windows用户应该在路径中具有这些安装的“可执行文件”位置。然后通过pip安装PyteSeract和pdf2image。
library(pdftools)
pdf_file <- "xxx/untitled.pdf"
text <- pdf_text(pdf_file)
cat(text[1])
from pdf2image import convert_from_path
import pytesseract

images = convert_from_path("sample.pdf")
for i,image in enumerate(images,start=1):
    image.save(f"./images/page_{i}.jpg","JPEG")

print(pytesseract.image_to_string("./images/page_1.jpg"))