diff --git a/src/ocrmypdf/_pipeline.py b/src/ocrmypdf/_pipeline.py index 2ff54ca3..3eb20d28 100644 --- a/src/ocrmypdf/_pipeline.py +++ b/src/ocrmypdf/_pipeline.py @@ -251,9 +251,18 @@ def is_ocr_required(pageinfo, log, options): log.info(msg.format(page, "rasterizing text and running OCR anyway")) ocr_required = True - elif options.redo_ocr and pageinfo.only_ocr_text: - log.info(msg.format(page, - "redoing OCR")) + elif options.redo_ocr: + if pageinfo.only_ocr_text: + log.info(msg.format(page, + "redoing OCR")) + else: + log.error( + ("%4d: page has both printable and hidden text, so " + "--redo-ocr is not currently possible for this file. " + "Try --force-ocr."), + page + ) + raise PriorOcrFoundError() ocr_required = True elif options.skip_text: log.info(msg.format(page, @@ -590,7 +599,7 @@ def select_ocr_image( Decimal(bbox[1]) / Decimal(72) * yres, Decimal(bbox[2]) / Decimal(72) * xres, Decimal(bbox[3]) / Decimal(72) * yres] - pixcoords = [int(c) for c in pixcoords] + pixcoords = [int(round(c)) for c in pixcoords] log.debug('blanking %r', pixcoords) draw.rectangle(pixcoords, fill=white) #draw.rectangle(pixcoords, outline=pink) diff --git a/src/ocrmypdf/_weave.py b/src/ocrmypdf/_weave.py index 7d97a6af..5256c47a 100644 --- a/src/ocrmypdf/_weave.py +++ b/src/ocrmypdf/_weave.py @@ -43,20 +43,29 @@ def _update_page_resources(*, page, font, font_key, procset): resources['/ProcSet'] = procset -def _strip_old_text(pdf, page): +def _strip_old_invisible_text(pdf, page, log): stream = [] in_text_obj = False + render_mode = 0 + text_objects = [] page.page_contents_coalesce() for operands, operator in pikepdf.parse_content_stream(page, ''): if not in_text_obj: if operator == pikepdf.Operator('BT'): in_text_obj = True + render_mode = 0 else: stream.append((operands, operator)) else: + if operator == pikepdf.Operator('Tr'): + render_mode = operands[0] + text_objects.append((operands, operator)) if operator == pikepdf.Operator('ET'): in_text_obj = False + if render_mode != 3: + stream.extend(text_objects) + text_objects.clear() def convert(op): try: @@ -141,7 +150,7 @@ def _weave_layers_graft( new_text_layer = pikepdf.Stream(pdf_base, pdf_text_contents) if strip_old_text: - _strip_old_text(pdf_base, base_page) + _strip_old_invisible_text(pdf_base, base_page, log) base_page.page_contents_add(new_text_layer, prepend=True) @@ -370,6 +379,7 @@ def weave_layers( if text and font: # Graft the text layer onto this page, whether new or old +# strip_old = context.get_options().redo_ocr strip_old = (context.get_options().redo_ocr and pdfinfo[page_num - 1].only_ocr_text) _weave_layers_graft(