diff --git a/src/ocrmypdf/pdfinfo.py b/src/ocrmypdf/pdfinfo.py index 80bd8135..cf6ff54c 100644 --- a/src/ocrmypdf/pdfinfo.py +++ b/src/ocrmypdf/pdfinfo.py @@ -582,9 +582,9 @@ def _naive_find_text(*, pdf, page): return False -def _page_has_text(infile, pageno): - "Smarter text detection that ignores text in margins" - +def _page_get_textblocks(infile, pageno): + "Smarter text detection" + doc = fitz.Document(infile) if fitz.version[0] >= '1.13.0': text = doc[pageno].getText('dict') @@ -595,6 +595,13 @@ def _page_has_text(infile, pageno): if not text: return + text['blocks'] = [blk for blk in text['blocks'] if blk['type'] == 0] + return text + + +def _page_has_text(text): + "Smarter text detection that ignores text in margins" + pw, ph = text['width'], text['height'] margin_ratio = 0.125 @@ -605,13 +612,9 @@ def _page_has_text(infile, pageno): has_text = False for block in text['blocks']: - if block['type'] != 0: - continue # Not text bbox = fitz.Rect(block['bbox']) - if bbox & interior_bbox: has_text = True - return has_text @@ -628,7 +631,8 @@ def _pdf_get_pageinfo(pdf, pageno: int, infile): page = pdf.pages[pageno] if fitz: - pageinfo['has_text'] = _page_has_text(str(infile), pageno) + pageinfo['textinfo'] = _page_get_textblocks(str(infile), pageno) + pageinfo['has_text'] = _page_has_text(pageinfo['textinfo']) else: pageinfo['has_text'] = _naive_find_text(pdf=pdf, page=page) @@ -715,12 +719,7 @@ class PageInfo: def get_textareas(self): if not fitz: raise NotImplementedError("no impl without fitz") - doc = fitz.open(self._infile) - page = doc[self._pageno] - text = page.getText('dict') - for block in text['blocks']: - if block['type'] == 0: # 0=text, >0=image or something else - yield block['bbox'] + yield from self._pageinfo['textinfo']['blocks'] @property def xres(self): diff --git a/src/ocrmypdf/pipeline.py b/src/ocrmypdf/pipeline.py index 285ee351..929047b1 100644 --- a/src/ocrmypdf/pipeline.py +++ b/src/ocrmypdf/pipeline.py @@ -596,10 +596,11 @@ def select_ocr_image( white = ImageColor.getcolor('#ffffff', im.mode) draw = ImageDraw.ImageDraw(im) - for bbox in pageinfo.get_textareas(): + for textarea in pageinfo.get_textareas(): # Calculate resolution based on the image size and page dimensions # without regard whatever resolution is in pageinfo (may differ or # be None) + bbox = textarea['bbox'] xres = im.width / pageinfo.width_inches yres = im.height / pageinfo.height_inches log.debug('calculated resolution %r %r', xres, yres)