使用Python从将文本编码为图像的PDF中提取文本

使用Python从将文本编码为图像的PDF中提取文本,python,pypdf2,pypdf,Python,Pypdf2,Pypdf,我的代码如下。我在其他PDF上试过,它能够准确地提取文本 pdfFileObj = open('test.pdf', 'rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj) pageObj = pdfReader.getPage(0) print(pageObj.extractText()) 特别是当我运行上面的代码时,没有输出。PDF提供商试图出售PDF格式的数据,因此他们不希望数据被轻易刮取是有道理的。我只是想知道最好的解决办法是什么,

我的代码如下。我在其他PDF上试过,它能够准确地提取文本

pdfFileObj = open('test.pdf', 'rb') 
pdfReader = PyPDF2.PdfFileReader(pdfFileObj) 
pageObj = pdfReader.getPage(0) 
print(pageObj.extractText()) 
特别是当我运行上面的代码时,没有输出。PDF提供商试图出售PDF格式的数据,因此他们不希望数据被轻易刮取是有道理的。我只是想知道最好的解决办法是什么,因为我手头没有10万美元

如果有帮助的话,看起来PDF是用pdfsharp.net生成的。当我在Google Colab中上传PDF并将其分配给变量时,打印该变量的部分结果如下

{'test.pdf': b'%PDF-1.4\n%\xd3\xf4\xcc\xe1\n1 0 
obj\n<<\n/CreationDate(D:20190310110705-04\'00\')\n/Title(Efficiency Summary  
Player Name)\n/Creator(PDFsharp 1.32.2608-w \\(www.pdfsharp.net\\))\n/Producer(PDFsharp 1.32.2608-w \\(www.pdfsharp.net\\))\n>>\nendobj\n2 0 obj\n<<\n/Type/Catalog\n/Pages 3 0 R\n>>\nendobj\n3 0 obj\n<<\n/Type/Pages\n/Count 1\n/Kids[4 0 R]\n>>\nendobj\n4 0 obj\n<<\n/Type/Page\n/MediaBox[0 0 612 792]\n/Parent 3 0 R\n/Contents 5 0 R\n/Resources\n<<\n/ProcSet [/PDF/Text/ImageB/ImageC/ImageI]\n/XObject\n<<\n/I0 8 0 R\n>>\n>>\n/Group\n<<\n/CS/DeviceRGB\n/S/Transparency\n/I false\n/K false\n>>\n>>\nendobj\n5 0 obj\n<<\n/Length 62\n/Filter/FlateDecode\n>>\nstream\nx\x9c+\xe42T0\x00B]\x10eni\xa4\x90\x9c\x0bd\x1b\x18(\x84Tq\x15r\x15*\x98\x9a\x1aA\xe4\xcd\xcd\xcc\x14\x8c\x8d\x14\xcc\xcd\xcd@J\xf4=\r\x14\\\xf2\x15\x02\xb9@\x10\x00\xd8\xf3\r\xe0\nendstream\nendobj\n6 0 obj\n<<\n/Type/XObject\n/Subtype/Image\n/Length 159\n/Filter/FlateDecode\n/Width 900\n/Height 1250\n/BitsPerComponent 1\n/ImageMask true\n>>\nstream\nx\x9c\xed\xc11\x01\x00\x00\x00\xc2 \xfb\xa76\xc6\x1e`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\xe8\'\xe0\x00\x01\nendstream\nendobj\n7 0 obj\n<<\n/Type/XObject\n/Subtype/Image\n/Length 6413\n/Filter/FlateDecode\n/Width 900\n/Height 1250\n/BitsPerComponent 8\n/ColorSpace/DeviceGray\n>>\nstream\nx\x9c\xed\xdd\x81z\xa2\xbc\x16\x05\xd0\xf7\x7f\xe9\xe4\xde\xbf\x85\xe4\x9c$X\xdb\xb1\x15t\xado\xa6U\x0c!\x02\xdb@\xb4R\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

这段代码可能对您有用,我在以前的一个项目中使用了它,在该项目中,我从pdf中提取了数据。我不确定你是否尝试过使用pytesseract。您可以修改页面中的for页面循环以提取特定页面。此代码将PDF转换为图像,然后使用OCR处理并返回一个包含找到的文本的文本文件

from pdf2image import convert_from_path
from PIL import Image
import pytesseract
import os

def OCR(pdf):
    pdfName = pdf.split('.pdf')[0]
    pages = convert_from_path(pdf, 500)
    image_counter = 1
    for page in pages:
        filename = "page_"+str(image_counter)+".jpg"
        page.save(pdfName+filename, 'JPEG')
        image_counter = image_counter + 1
    filelimit = image_counter-1
    f= open(pdfName+".txt","wb")
    text = ''
    for i in range(1, filelimit + 1):
        filename = pdfName+"page_"+str(i)+".jpg"
        text += str(((pytesseract.image_to_string(Image.open(filename)))))
        text = text.replace('-\n', '')
        text = text.replace('\n',' \n')
        os.remove(pdfName+"page_"+str(i)+".jpg")
    f.write(text.encode('utf-8','replace'))
    f.close()
    return text

你看到的只是PDF文件的原始字节,事实上他们将Info dict放在了文件的顶部,因此看到了\Creator之类的字符串,这并不能保证,因为它是一个线性化的文件

按照Daniel的建议去做是一条路,但是他的实现可能会引入额外的工件。tesseract是OCR软件,它试图将光栅化文本转换回字符。直接处理PDF文件中的图像可能比将整个页面光栅化为图像更好。此外,JPEG编码似乎有些笨拙,使用PNG等无损格式可能会稍微好一点


一般来说,我建议使用类似pytesseract的东西,但也可以使用其他东西,例如直接获取图像

运行此代码的环境是什么?现在我只使用一个Jupyter笔记本。想知道将pdf作为变量输入OCR函数的过程是什么吗?很抱歉,我正在Atom的Windows上运行这个。给OCR函数的PDF变量是PDF的文件路径,一个字符串。您使用git bash还是Windows power shell运行?声明说,PDF提供商试图出售PDF格式的数据,所以他们不希望数据被轻易刮取是有道理的。我想说清楚,你是在请求帮助编写代码来窃取知识产权?!我已回滚您的编辑。一旦你在这里发布,内容就属于这个网站,你不能用噪音代替文字来破坏它。请花些时间阅读,特别是本网站的使用条款。