如何使用 PyPDF2 从 PDF 中以正确的顺序提取文本?
How do I extract text in the right order from PDF using PyPDF2?
我目前正在做一个提取 PDF 内容的项目。代码运行流畅,我能够提取文本,但提取的文本顺序不正确。该代码以一种奇怪的方式提取文本。文本的顺序无处不在。它没有从上到下,真的很混乱。
我在网上查了一下,但对如何订购文本提取的帮助很少。大多数教程都得出了相同的结果。作为参考,这是我目前正在测试的 PDF(第 5 页):https://www.pidm.gov.my/PIDM/files/13/134b5c79-5319-4199-ac68-99f62aca6047.pdf
import PyPDF2
with open('pdftest2.pdf', 'rb') as pdfTest:
reader = PyPDF2.PdfFileReader(pdfTest)
page5 = reader.getPage(4)
text = page5.extractText()
print(text)
提取的文本总是从页面的页脚开始,然后从下到上。我注意到在下一页中它会从上到下开始,但只针对几个特定的句子。然后它会从页面的不同位置提取文本,而不是从它停止的地方继续。
确实提取了所有文本,但提取的顺序各不相同。这个问题有解决办法吗?
我不得不处理一个类似的问题,结果发现模块 pdfplumber
比 PyPDF
工作得更好。我想这取决于文件本身,你应该试试。
否则,您的问题的另一个答案是使用 pdf2image
模块将 PDF 视为图像并使用 pytesseract
提取其中的文本。然而,它可能不是完美的方法,因为 pdf2image 方法 convert_from_path
可能需要很长时间才能 运行.
如果你有兴趣,我会把一些代码放在这里。
首先确保安装所有必要的依赖项以及 Tesseract 和 ImageMagik。您可以在网站上找到有关安装的任何信息。如果您正在使用 windows,那么有一篇很好的 Medium 文章 here。
要使用 pdf2image 将 PDF 转换为图像:
如果您正在处理 windows,请不要忘记添加您的 poppler 路径。它应该看起来像这样 r'C:\<your_path>\poppler-21.02.0\Library\bin'
def pdftoimg(fic,output_folder, poppler_path):
# Store all the pages of the PDF in a variable
pages = convert_from_path(fic, dpi=500,output_folder=output_folder,thread_count=9, poppler_path=poppler_path)
image_counter = 0
# Iterate through all the pages stored above
for page in pages:
filename = "page_"+str(image_counter)+".jpg"
page.save(output_folder+filename, 'JPEG')
image_counter = image_counter + 1
for i in os.listdir(output_folder):
if i.endswith('.ppm'):
os.remove(output_folder+i)
从图片中提取文字:
你的 tesseract 路径将是这样的:r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def imgtotext(img, tesseract_path):
# Recognize the text as string in image using pytesserct
pytesseract.pytesseract.tesseract_cmd = tesseract_path
text = str(((pytesseract.image_to_string(Image.open(img)))))
text = text.replace('-\n', '')
return text
我目前正在做一个提取 PDF 内容的项目。代码运行流畅,我能够提取文本,但提取的文本顺序不正确。该代码以一种奇怪的方式提取文本。文本的顺序无处不在。它没有从上到下,真的很混乱。
我在网上查了一下,但对如何订购文本提取的帮助很少。大多数教程都得出了相同的结果。作为参考,这是我目前正在测试的 PDF(第 5 页):https://www.pidm.gov.my/PIDM/files/13/134b5c79-5319-4199-ac68-99f62aca6047.pdf
import PyPDF2
with open('pdftest2.pdf', 'rb') as pdfTest:
reader = PyPDF2.PdfFileReader(pdfTest)
page5 = reader.getPage(4)
text = page5.extractText()
print(text)
提取的文本总是从页面的页脚开始,然后从下到上。我注意到在下一页中它会从上到下开始,但只针对几个特定的句子。然后它会从页面的不同位置提取文本,而不是从它停止的地方继续。
确实提取了所有文本,但提取的顺序各不相同。这个问题有解决办法吗?
我不得不处理一个类似的问题,结果发现模块 pdfplumber
比 PyPDF
工作得更好。我想这取决于文件本身,你应该试试。
否则,您的问题的另一个答案是使用 pdf2image
模块将 PDF 视为图像并使用 pytesseract
提取其中的文本。然而,它可能不是完美的方法,因为 pdf2image 方法 convert_from_path
可能需要很长时间才能 运行.
如果你有兴趣,我会把一些代码放在这里。
首先确保安装所有必要的依赖项以及 Tesseract 和 ImageMagik。您可以在网站上找到有关安装的任何信息。如果您正在使用 windows,那么有一篇很好的 Medium 文章 here。
要使用 pdf2image 将 PDF 转换为图像:
如果您正在处理 windows,请不要忘记添加您的 poppler 路径。它应该看起来像这样 r'C:\<your_path>\poppler-21.02.0\Library\bin'
def pdftoimg(fic,output_folder, poppler_path):
# Store all the pages of the PDF in a variable
pages = convert_from_path(fic, dpi=500,output_folder=output_folder,thread_count=9, poppler_path=poppler_path)
image_counter = 0
# Iterate through all the pages stored above
for page in pages:
filename = "page_"+str(image_counter)+".jpg"
page.save(output_folder+filename, 'JPEG')
image_counter = image_counter + 1
for i in os.listdir(output_folder):
if i.endswith('.ppm'):
os.remove(output_folder+i)
从图片中提取文字:
你的 tesseract 路径将是这样的:r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def imgtotext(img, tesseract_path):
# Recognize the text as string in image using pytesserct
pytesseract.pytesseract.tesseract_cmd = tesseract_path
text = str(((pytesseract.image_to_string(Image.open(img)))))
text = text.replace('-\n', '')
return text