diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 9181c971..1624f028 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -212,6 +212,15 @@ advanced.add_argument( '--tesseract-pagesegmode', action='store', type=int, metavar='PSM', choices=range(0, 14), help="set Tesseract page segmentation mode (see tesseract --help)") +advanced.add_argument( + '--tesseract-oem', action='store', type=int, metavar='MODE', + choices=range(0, 4), + help=("set Tesseract 4.0 OCR engine mode: " + "0 - original Tesseract only; " + "1 - neural nets LSTM only; " + "2 - Tesseract + LSTM; " + "3 - default.") + ) advanced.add_argument( '--pdf-renderer', choices=['auto', 'tesseract', 'hocr'], default='auto', help="choose OCR PDF renderer - the default option is to let OCRmyPDF " @@ -316,12 +325,22 @@ def check_options_ocr_behavior(options, log): " ocrmypdf --pdf-renderer tesseract --output-type pdf") +def check_options_advanced(options, log): + if tesseract.v4(): + log.info( + "Tesseract v4.x.alpha found. OCRmyPDF support is experimental.") + if options.tesseract_oem and not tesseract.v4(): + log.warning( + "--tesseract-oem requires Tesseract 4.x -- argument ignored") + + def check_options(options, log): try: check_options_languages(options, log) check_options_output(options, log) check_options_preprocessing(options, log) check_options_ocr_behavior(options, log) + check_options_advanced(options, log) except argparse.ArgumentError as e: log.error(e) sys.exit(ExitCode.bad_args) @@ -462,6 +481,7 @@ def run_pipeline(): _log, _log_mutex = proxy_logger.make_shared_logger_and_proxy( logging_factory, __name__, [None, options.verbose]) _log.debug('ocrmypdf ' + VERSION) + _log.debug('tesseract ' + tesseract.version()) check_options(options, _log) diff --git a/ocrmypdf/exec/tesseract.py b/ocrmypdf/exec/tesseract.py index af30a676..af1768e5 100644 --- a/ocrmypdf/exec/tesseract.py +++ b/ocrmypdf/exec/tesseract.py @@ -93,10 +93,20 @@ def languages(): return set(lang.strip() for lang in langs.splitlines()[1:]) -def get_orientation(input_file, language: list, timeout: float, log): - args_tesseract = [ +def tess_base_args(languages, engine_mode): + args = [ get_program('tesseract'), - '-l', '+'.join(language), + ] + if languages: + args.extend(['-l', '+'.join(languages)]) + if engine_mode is not None and v4(): + args.extend(['--oem', str(engine_mode)]) + return args + + +def get_orientation(input_file, language: list, engine_mode, timeout: float, + log): + args_tesseract = tess_base_args(language, engine_mode) + [ psm(), '0', input_file, 'stdout' @@ -175,15 +185,13 @@ def _generate_null_hocr(output_hocr, image): f.write(HOCR_TEMPLATE.format(w, h)) -def generate_hocr(input_file, output_hocr, language: list, tessconfig: list, - timeout: float, pageinfo_getter, pagesegmode: int, log): +def generate_hocr(input_file, output_hocr, language: list, engine_mode, + tessconfig: list, + timeout: float, pagesegmode: int, log): badxml = os.path.splitext(output_hocr)[0] + '.badxml' - args_tesseract = [ - get_program('tesseract'), - '-l', '+'.join(language) - ] + args_tesseract = tess_base_args(language, engine_mode) if pagesegmode is not None: args_tesseract.extend([psm(), str(pagesegmode)]) @@ -194,6 +202,7 @@ def generate_hocr(input_file, output_hocr, language: list, tessconfig: list, 'hocr' ] + tessconfig) try: + log.debug(args_tesseract) stdout = check_output( args_tesseract, close_fds=True, stderr=STDOUT, universal_newlines=True, timeout=timeout) @@ -235,6 +244,7 @@ def generate_hocr(input_file, output_hocr, language: list, tessconfig: list, def generate_pdf(input_image, skip_pdf, output_pdf, language: list, + engine_mode, tessconfig: list, timeout: float, pagesegmode: int, log): '''Use Tesseract to render a PDF. @@ -246,10 +256,7 @@ def generate_pdf(input_image, skip_pdf, output_pdf, language: list, log -- logger object ''' - args_tesseract = [ - get_program('tesseract'), - '-l', '+'.join(language) - ] + args_tesseract = tess_base_args(language, engine_mode) if pagesegmode is not None: args_tesseract.extend([psm(), str(pagesegmode)]) @@ -261,6 +268,7 @@ def generate_pdf(input_image, skip_pdf, output_pdf, language: list, ] + tessconfig) try: + log.debug(args_tesseract) stdout = check_output( args_tesseract, close_fds=True, stderr=STDOUT, universal_newlines=True, timeout=timeout) diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index ed8c5b59..97e84e5f 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -332,6 +332,7 @@ def orient_page( orient_conf = tesseract.get_orientation( preview, language=options.language, + engine_mode=options.tesseract_oem, timeout=options.tesseract_timeout, log=log) @@ -476,9 +477,9 @@ def ocr_tesseract_hocr( input_file=input_file, output_hocr=output_file, language=options.language, + engine_mode=options.tesseract_oem, tessconfig=options.tesseract_config, timeout=options.tesseract_timeout, - pageinfo_getter=partial(get_pageinfo, input_file, context), pagesegmode=options.tesseract_pagesegmode, log=log ) @@ -669,6 +670,7 @@ def tesseract_ocr_and_render_pdf( skip_pdf=input_pdf, output_pdf=output_file, language=options.language, + engine_mode=options.tesseract_oem, tessconfig=options.tesseract_config, timeout=options.tesseract_timeout, pagesegmode=options.tesseract_pagesegmode,