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

2024-10-02 18:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

pdfFileObj = open('test.pdf', 'rb') 
pdfReader = PyPDF2.PdfFileReader(pdfFileObj) 
pageObj = pdfReader.getPage(0) 
print(pageObj.extractText()) 

特别是当我运行上面的代码时,没有输出。PDF的提供者试图销售PDF格式的数据,所以他们不希望数据被轻易地刮走是有道理的。只是想知道什么是最好的解决办法,因为我没有10万左右。你知道吗

如果有帮助的话,看起来PDF是用pdfsharp.net文件. 当我在googlecolab中上传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

Tags: objnetpdftypefilterlengthx00xcd
2条回答

这段代码可能对您有用,我在以前的一个项目中使用了它,在这个项目中,我从pdf中提取了数据。我不确定你是否试过使用pytesseract。您可以修改for page in pages循环以提取特定页面。这段代码将把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之类的工具,但是使用其他工具,例如see here直接获取图像

相关问题 更多 >