使用 Python 创建可搜索(多页)PDF
Create searchable (multipage) PDF with Python
我在网上找到了一些关于如何使扫描的 PDF 可搜索的指南。但是,我目前正在努力弄清楚如何为多页 PDF 执行此操作。
我的代码采用多页 PDF,将每页转换为 JPG,每页 运行s OCR,然后将其转换为 PDF。但是,只返回最后一页。
import pytesseract
from pdf2image import convert_from_path
pytesseract.pytesseract.tesseract_cmd = 'directory'
TESSDATA_PREFIX = 'directory'
tessdata_dir_config = '--tessdata-dir directory'
# Path of the pdf
PDF_file = r"pdf directory"
def pdf_text():
# Store all the pages of the PDF in a variable
pages = convert_from_path(PDF_file, 500)
image_counter = 1
for page in pages:
# Declare file names
filename = "page_"+str(image_counter)+".jpg"
# Save the image of the page in system
page.save(filename, 'JPEG')
# Increment the counter to update filename
image_counter = image_counter + 1
# Variable to get count of total number of pages
filelimit = image_counter-1
outfile = "out_text.pdf"
# Open the file in append mode so that all contents of all images are added to the same file
f = open(outfile, "a")
# Iterate from 1 to total number of pages
for i in range(1, filelimit + 1):
filename = "page_"+str(i)+".jpg"
# Recognize the text as string in image using pytesseract
result = pytesseract.image_to_pdf_or_hocr(filename, lang="eng", config=tessdata_dir_config)
f = open(outfile, "w+b")
f.write(bytearray(result))
f.close()
pdf_text()
如何对所有页面 运行 并输出一个合并的 PDF?
这里有很多潜在的问题,如果无法调试,很难说出根本原因是什么。
是否已成功创建 JPG,并且是否如预期的那样作为单独的文件?
我怀疑 pages = convert_from_path(PDF_file, 500)
没有按预期返回 - 您是否手动验证它们是否按预期创建?
我不能 运行 但我认为所有问题都是因为你在循环中使用 open(..., 'w+b')
- 这会删除以前的内容,最后你只写最后一页。
您应该使用已经打开的文件 open(outfile, "a")
并在循环后关闭它。
# --- before loop ---
f = open(outfile, "ab")
# --- loop ---
for i in range(1, filelimit+1):
filename = f"page_{i}.jpg"
result = pytesseract.image_to_pdf_or_hocr(filename, lang="eng", config=tessdata_dir_config)
f.write(bytearray(result))
# --- after loop ---
f.close()
顺便说一句:
但还有其他问题 - image_to_pdf_or_hocr
创建完整的 PDF
- 带有特殊的页眉和页脚 - 并且附加两个结果无法创建正确的 PDF
。您将不得不使用特殊模块来合并 pdf。喜欢Merge PDF files
类似于
# --- before loop ---
from PyPDF2 import PdfFileMerger
import io
merger = PdfFileMerger()
# --- loop ---
for i in range(1, filelimit + 1):
filename = "page_"+str(i)+".jpg"
result = pytesseract.image_to_pdf_or_hocr(filename, lang="eng", config=tessdata_dir_config)
pdf_file_in_memory = io.BytesIO(result)
merger.append(pdf_file_in_memory)
# --- after loop ---
merger.write(outfile)
merger.close()
我在网上找到了一些关于如何使扫描的 PDF 可搜索的指南。但是,我目前正在努力弄清楚如何为多页 PDF 执行此操作。
我的代码采用多页 PDF,将每页转换为 JPG,每页 运行s OCR,然后将其转换为 PDF。但是,只返回最后一页。
import pytesseract
from pdf2image import convert_from_path
pytesseract.pytesseract.tesseract_cmd = 'directory'
TESSDATA_PREFIX = 'directory'
tessdata_dir_config = '--tessdata-dir directory'
# Path of the pdf
PDF_file = r"pdf directory"
def pdf_text():
# Store all the pages of the PDF in a variable
pages = convert_from_path(PDF_file, 500)
image_counter = 1
for page in pages:
# Declare file names
filename = "page_"+str(image_counter)+".jpg"
# Save the image of the page in system
page.save(filename, 'JPEG')
# Increment the counter to update filename
image_counter = image_counter + 1
# Variable to get count of total number of pages
filelimit = image_counter-1
outfile = "out_text.pdf"
# Open the file in append mode so that all contents of all images are added to the same file
f = open(outfile, "a")
# Iterate from 1 to total number of pages
for i in range(1, filelimit + 1):
filename = "page_"+str(i)+".jpg"
# Recognize the text as string in image using pytesseract
result = pytesseract.image_to_pdf_or_hocr(filename, lang="eng", config=tessdata_dir_config)
f = open(outfile, "w+b")
f.write(bytearray(result))
f.close()
pdf_text()
如何对所有页面 运行 并输出一个合并的 PDF?
这里有很多潜在的问题,如果无法调试,很难说出根本原因是什么。
是否已成功创建 JPG,并且是否如预期的那样作为单独的文件?
我怀疑 pages = convert_from_path(PDF_file, 500)
没有按预期返回 - 您是否手动验证它们是否按预期创建?
我不能 运行 但我认为所有问题都是因为你在循环中使用 open(..., 'w+b')
- 这会删除以前的内容,最后你只写最后一页。
您应该使用已经打开的文件 open(outfile, "a")
并在循环后关闭它。
# --- before loop ---
f = open(outfile, "ab")
# --- loop ---
for i in range(1, filelimit+1):
filename = f"page_{i}.jpg"
result = pytesseract.image_to_pdf_or_hocr(filename, lang="eng", config=tessdata_dir_config)
f.write(bytearray(result))
# --- after loop ---
f.close()
顺便说一句:
但还有其他问题 - image_to_pdf_or_hocr
创建完整的 PDF
- 带有特殊的页眉和页脚 - 并且附加两个结果无法创建正确的 PDF
。您将不得不使用特殊模块来合并 pdf。喜欢Merge PDF files
类似于
# --- before loop ---
from PyPDF2 import PdfFileMerger
import io
merger = PdfFileMerger()
# --- loop ---
for i in range(1, filelimit + 1):
filename = "page_"+str(i)+".jpg"
result = pytesseract.image_to_pdf_or_hocr(filename, lang="eng", config=tessdata_dir_config)
pdf_file_in_memory = io.BytesIO(result)
merger.append(pdf_file_in_memory)
# --- after loop ---
merger.write(outfile)
merger.close()