cuneiform из командной строки нормально распознаёт и сохраняет. А так - tesseract и pyocr. PDF напрямую не умеет, но растеризовать его в PNG - делов-то...
Как-нибудь так:
from wand.image import Image as Img
from wand.color import Color
from PIL import Image
import pyocr
import pyocr.builders
import os
from timeit import default_timer as timer
pdf_name = '1.pdf'
pdf_path = os.path.join(os.getcwd(), pdf_name)
img_name = 'pdf_1'
image = f'{img_name}.png'
with Img(filename=pdf_path, resolution=300) as img:
img.format = 'png'
img.background_color = Color('white')
img.alpha_channel = 'remove'
img.save(filename=image)
tools = pyocr.get_available_tools()[1]
lang = tools.get_available_languages()
builder = pyocr.builders.TextBuilder()
start = timer()
text = tools.image_to_string(Image.open(image), lang='rus',
builder=builder)
end = timer()
print(f"{end - start} \n\n")
print(text)
PyOCR - там нормальная документация