From 63de7e1677819b187923dcce7628ae5209cd6e4a Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 30 Dec 2019 16:14:52 -0800 Subject: [PATCH] Improve error message for unreadable input files --- src/ocrmypdf/_pipeline.py | 8 +++++--- src/ocrmypdf/_sync.py | 8 ++++++-- src/ocrmypdf/_validation.py | 4 ++-- tests/test_main.py | 9 +++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/ocrmypdf/_pipeline.py b/src/ocrmypdf/_pipeline.py index 2705b2ab..cad9d74b 100644 --- a/src/ocrmypdf/_pipeline.py +++ b/src/ocrmypdf/_pipeline.py @@ -19,6 +19,7 @@ import os import re import sys from datetime import datetime, timezone +from pathlib import Path from shutil import copyfileobj import img2pdf @@ -123,7 +124,7 @@ def _pdf_guess_version(input_file, search_window=1024): return '' -def triage(input_file, output_file, options, log): +def triage(original_filename, input_file, output_file, options, log): try: if _pdf_guess_version(input_file): if options.image_dpi: @@ -135,8 +136,9 @@ def triage(input_file, output_file, options, log): safe_symlink(input_file, output_file) return output_file except EnvironmentError as e: - log.error(e) - raise InputFileError() from e + log.debug(f"Temporary file was at: {input_file}") + msg = str(e).replace(input_file, original_filename) + raise InputFileError(msg) from e triage_image_file(input_file, output_file, options, log) return output_file diff --git a/src/ocrmypdf/_sync.py b/src/ocrmypdf/_sync.py index 5b27a8f0..87546049 100644 --- a/src/ocrmypdf/_sync.py +++ b/src/ocrmypdf/_sync.py @@ -332,11 +332,15 @@ def run_pipeline(options, api=False): work_folder = mkdtemp(prefix="com.github.ocrmypdf.") try: check_requested_output_file(options) - start_input_file = create_input_file(options, work_folder) + start_input_file, original_filename = create_input_file(options, work_folder) # Triage image or pdf origin_pdf = triage( - start_input_file, os.path.join(work_folder, 'origin.pdf'), options, log + original_filename, + start_input_file, + os.path.join(work_folder, 'origin.pdf'), + options, + log, ) # Gather pdfinfo and create context diff --git a/src/ocrmypdf/_validation.py b/src/ocrmypdf/_validation.py index b53f0fc4..1ebd422c 100644 --- a/src/ocrmypdf/_validation.py +++ b/src/ocrmypdf/_validation.py @@ -380,12 +380,12 @@ def create_input_file(options, work_folder): target = os.path.join(work_folder, 'stdin') with open(target, 'wb') as stream_buffer: copyfileobj(sys.stdin.buffer, stream_buffer) - return target + return target, "" else: try: target = os.path.join(work_folder, 'origin') safe_symlink(options.input_file, target) - return target + return target, os.fspath(options.input_file) except FileNotFoundError: raise InputFileError(f"File not found - {options.input_file}") diff --git a/tests/test_main.py b/tests/test_main.py index 0380508b..0e336d80 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -270,6 +270,15 @@ def test_input_file_not_found(caplog, no_outpdf): assert input_file in caplog.text +def test_input_file_not_readable(caplog, resources, outdir, no_outpdf): + input_file = outdir / 'trivial.pdf' + shutil.copy(resources / 'trivial.pdf', input_file) + input_file.chmod(0o000) + result = run_ocrmypdf_api(input_file, no_outpdf) + assert result == ExitCode.input_file + assert input_file in caplog.text + + def test_input_file_not_a_pdf(caplog, no_outpdf): input_file = __file__ # Try to OCR this file result = run_ocrmypdf_api(input_file, no_outpdf)