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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 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