diff --git a/src/ocrmypdf/_pipeline.py b/src/ocrmypdf/_pipeline.py index bf3e979f..cba5de41 100644 --- a/src/ocrmypdf/_pipeline.py +++ b/src/ocrmypdf/_pipeline.py @@ -160,6 +160,12 @@ def validate_pdfinfo_options(context): pdfinfo = context.pdfinfo options = context.options + if options.plugin_validation: + validate = load_plugin(options.plugin_validation) + result = validate(context) + if result is not None: + return result + if pdfinfo.needs_rendering: log.error( "This PDF contains dynamic XFA forms created by Adobe LiveCycle " diff --git a/src/ocrmypdf/api.py b/src/ocrmypdf/api.py index 8e5c1e1b..3bddf47c 100644 --- a/src/ocrmypdf/api.py +++ b/src/ocrmypdf/api.py @@ -119,7 +119,9 @@ def create_options(*, input_file, output_file, **kwargs): for arg, val in kwargs.items(): if val is None: continue - if arg.startswith('filter') and (callable(val) or isinstance(val, str)): + if (arg.startswith('plugin') or arg.startswith('filter')) and ( + callable(val) or isinstance(val, str) + ): deferred.append((arg, val)) continue elif arg == 'tesseract_env': @@ -199,6 +201,7 @@ def ocrmypdf( # pylint: disable=unused-argument keep_temporary_files=None, progress_bar=None, filter_ocr_image=None, + plugin_validation=None, tesseract_env=None, ): """Run OCRmyPDF on one PDF or image. diff --git a/src/ocrmypdf/cli.py b/src/ocrmypdf/cli.py index ac2f2713..cca69960 100644 --- a/src/ocrmypdf/cli.py +++ b/src/ocrmypdf/cli.py @@ -468,10 +468,13 @@ advanced.add_argument( help="Specify the location of the Tesseract user patterns file.", ) -filters = parser.add_argument_group("Filters", argparse.SUPPRESS) -filters.add_argument( +plugins = parser.add_argument_group("Filters and Plugins", argparse.SUPPRESS) +plugins.add_argument( '--filter-ocr-image', help=argparse.SUPPRESS, type=check_plugin_loadable ) +plugins.add_argument( + '--plugin-validation', help=argparse.SUPPRESS, type=check_plugin_loadable +) debugging = parser.add_argument_group( "Debugging", "Arguments to help with troubleshooting and debugging" diff --git a/src/ocrmypdf/pdfinfo/layout.py b/src/ocrmypdf/pdfinfo/layout.py index 89caa938..9bb7f3a5 100644 --- a/src/ocrmypdf/pdfinfo/layout.py +++ b/src/ocrmypdf/pdfinfo/layout.py @@ -185,7 +185,7 @@ class LTStateAwareChar(LTChar): def get_text(self): if isinstance(self._text, tuple): - return '�' + return '\ufffd' # standard 'Unknown symbol' return self._text def __repr__(self):