Python PyMuPDF searchFor метод не работает - PullRequest
0 голосов
/ 21 декабря 2018

Я использую библиотеку PyMuPDF в python для поиска определенного текста в документе PDF, а затем выделив его.

pdf_document = fitz.open(pdf_path) for i in range(len(page_num)):<br> page=pdf_document[page_num[i]]<br> for item in search_terms: search_instances = page.searchFor(item) for inst in search_instances: page.addHighlightAnnot(inst)

Изображение документа PDF показано ниже: enter image description here

Я могу выделить все термины в документе PDF, кроме поискового термина «Валовая прибыль».searchFor () возвращает пустой список вместо координат.Это как-то связано с некачественным PDF?. Если это так, он не должен работать и для других поисковых терминов. Он работает для таких терминов, как «Оборот» и «Себестоимость продаж» и т. Д.идеи пожалуйста?

1 Ответ

0 голосов
/ 15 мая 2019

Похоже, что это не текстовый PDF.

Вы должны использовать OCR, такой как pytesseract, для преобразования его в текстовый pdf, а затем использовать fitz для его выделения.

что-то подобное должноработа:

from pdf2image import convert_from_path, convert_from_bytes 
from fpdf import FPDF

pytesseract.pytesseract.tesseract_cmd = /pathto/Tesseract-OCR/tesseract.exe'

def string_stream(s, separators="\n"):
    start = 0
    for end in range(len(s)):
        if s[end] in separators:
            yield s[start:end]
            start = end + 1
    if start < end:
        yield s[start:end+1]


def multipage_simple(whole_text):
    pdf = FPDF(format='letter') #pdf format
    pdf.add_page() #create new page
    pdf.set_font("Arial", size=12) # font and textsize
    cnt = 1
    stream = string_stream(normalize(whole_text))
    for s in stream:
        pdf.cell(200, 10, txt=s, ln=cnt, align="L")
        cnt += 1
    pdf.output("multipage_simple.pdf", "F")

def get_text_from_pdf_with_ocr(file_name_to_image_pdf):
    res = []
    seq_of_images = convert_from_path(file_name)
    for img in seq_of_images:
        text = re.sub(REMOVAL_SPECIAL_CHARACTER_PATTERN, " ", string=pytesseract.image_to_string(img))
        res += [text]
    return res

затем выполните:

doc = fitz.open("multipage_simple.pdf")

Вы можете получить весь текст, выполнив:

text_ = get_text_from_pdf_with_ocr(pdf_id)
whole_text = reduce(lambda x, y: x + y, text_)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...