From a596ccf84469c81c6d19ab0eb59f53a5df0bc3c7 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Thu, 9 Nov 2023 22:33:22 -0800 Subject: [PATCH] Raise exception if resulting PDF might appear blank in a known in some PDF viewers Fixes #1187 --- .reuse/dep5 | 1 + src/ocrmypdf/_exec/ghostscript.py | 18 ++++++++++++------ src/ocrmypdf/exceptions.py | 13 +++++++++++++ tests/resources/jbig2_baddevicen.pdf | Bin 0 -> 43281 bytes tests/test_ghostscript.py | 12 +++++++++++- 5 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 tests/resources/jbig2_baddevicen.pdf diff --git a/.reuse/dep5 b/.reuse/dep5 index 865db41d..d1031d67 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -70,6 +70,7 @@ Files: tests/resources/linn.png tests/resources/ccitt.pdf tests/resources/cardinal.pdf tests/resources/jbig2.pdf + tests/resources/jbig2_baddevicen.pdf tests/resources/skew.pdf tests/resources/rotated_skew.pdf tests/resources/poster.pdf diff --git a/src/ocrmypdf/_exec/ghostscript.py b/src/ocrmypdf/_exec/ghostscript.py index 7f14940f..78b5434d 100644 --- a/src/ocrmypdf/_exec/ghostscript.py +++ b/src/ocrmypdf/_exec/ghostscript.py @@ -17,7 +17,7 @@ from subprocess import PIPE, CalledProcessError from packaging.version import Version from PIL import Image, UnidentifiedImageError -from ocrmypdf.exceptions import SubprocessOutputError +from ocrmypdf.exceptions import ColorConversionNeededError, SubprocessOutputError from ocrmypdf.helpers import Resolution from ocrmypdf.subprocess import get_version, run, run_polling_stderr @@ -64,10 +64,6 @@ class DuplicateFilter(logging.Filter): log.addFilter(DuplicateFilter(log)) -# Ghostscript executable - gswin32c is not supported -GS = 'gswin64c' if os.name == 'nt' else 'gs' - - def version() -> Version: return Version(get_version(GS)) @@ -77,6 +73,15 @@ def _gs_error_reported(stream) -> bool: return bool(match) +def _gs_devicen_reported(stream) -> bool: + match = re.search( + r'DeviceN.*inappropriate alternate', + stream, + flags=re.IGNORECASE | re.MULTILINE, + ) + return bool(match) + + def rasterize_pdf( input_file: os.PathLike, output_file: os.PathLike, @@ -250,7 +255,6 @@ def generate_pdfa( ] ) args_gs.extend(fspath(s) for s in pdf_pages) # Stringify Path objs - try: with Path(output_file).open('wb') as output: p = run_polling_stderr( @@ -279,3 +283,5 @@ def generate_pdfa( # the **** pattern to split the stderr into parts. for part in stderr.split('****'): log.error(part) + if _gs_devicen_reported(stderr): + raise ColorConversionNeededError() diff --git a/src/ocrmypdf/exceptions.py b/src/ocrmypdf/exceptions.py index 6f549286..fd221e87 100644 --- a/src/ocrmypdf/exceptions.py +++ b/src/ocrmypdf/exceptions.py @@ -137,3 +137,16 @@ class TaggedPDFError(InputFileError): override this error. """ ) + + +class ColorConversionNeededError(BadArgsError): + """PDF needs color conversion.""" + + message = dedent( + """\ + The input PDF has an unusual color space. Use + --color-conversion-strategy to convert to a common color space + such as RGB, or use --output-type pdf to skip PDF/A conversion + and retain the original color space. + """ + ) diff --git a/tests/resources/jbig2_baddevicen.pdf b/tests/resources/jbig2_baddevicen.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8653426d8e7163e81374d2196269ebefc5e94ef8 GIT binary patch literal 43281 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�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 RCp#Y(8v+%Tq_Pyke*sHx>n{KR literal 0 HcmV?d00001 diff --git a/tests/test_ghostscript.py b/tests/test_ghostscript.py index 281c80ac..990192c5 100644 --- a/tests/test_ghostscript.py +++ b/tests/test_ghostscript.py @@ -13,7 +13,7 @@ import pytest from PIL import Image, UnidentifiedImageError from ocrmypdf._exec.ghostscript import DuplicateFilter, rasterize_pdf -from ocrmypdf.exceptions import ExitCode +from ocrmypdf.exceptions import ColorConversionNeededError, ExitCode from ocrmypdf.helpers import Resolution from .conftest import check_ocrmypdf, run_ocrmypdf_api @@ -126,6 +126,16 @@ def test_ghostscript_feature_elision(resources, outpdf): ) +def test_ghostscript_mandatory_color_conversion(resources, outpdf): + with pytest.raises(ColorConversionNeededError): + check_ocrmypdf( + resources / 'jbig2_baddevicen.pdf', + outpdf, + '--plugin', + 'tests/plugins/tesseract_noop.py', + ) + + def test_rasterize_pdf_errors(resources, no_outpdf, caplog): with patch('ocrmypdf._exec.ghostscript.run') as mock: # ghostscript can produce