From 93fda0dd009cf8d999059ec3c6e4812b53bb0751 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Thu, 12 Oct 2023 01:03:09 -0700 Subject: [PATCH] Detect and warn about Tagged PDFs --- src/ocrmypdf/_pipeline.py | 11 +++++++++++ src/ocrmypdf/exceptions.py | 24 ++++++++++++++++++------ src/ocrmypdf/pdfinfo/info.py | 14 +++++++++++++- tests/resources/tagged.odt | Bin 0 -> 12767 bytes tests/resources/tagged.pdf | Bin 0 -> 48462 bytes tests/test_tagged.py | 26 ++++++++++++++++++++++++++ 6 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 tests/resources/tagged.odt create mode 100644 tests/resources/tagged.pdf create mode 100644 tests/test_tagged.py diff --git a/src/ocrmypdf/_pipeline.py b/src/ocrmypdf/_pipeline.py index 43031e73..44bd88c9 100644 --- a/src/ocrmypdf/_pipeline.py +++ b/src/ocrmypdf/_pipeline.py @@ -33,6 +33,7 @@ from ocrmypdf.exceptions import ( EncryptedPdfError, InputFileError, PriorOcrFoundError, + TaggedPDFError, UnsupportedImageFormatError, ) from ocrmypdf.helpers import IMG2PDF_KWARGS, Resolution, safe_symlink @@ -218,6 +219,16 @@ def validate_pdfinfo_options(context: PdfContext) -> None: "form and all filled form fields. The output PDF will be " "'flattened' and will no longer be fillable." ) + if pdfinfo.is_tagged: + if options.force_ocr or options.skip_text or options.redo_ocr: + log.warning( + "This PDF is marked as a Tagged PDF. This often indicates " + "that the PDF was generated from an office document and does " + "not need OCR. PDF pages processed by OCRmyPDF may not be " + "tagged correctly." + ) + else: + raise TaggedPDFError() context.plugin_manager.hook.validate(pdfinfo=pdfinfo, options=options) diff --git a/src/ocrmypdf/exceptions.py b/src/ocrmypdf/exceptions.py index 7c1a6414..6f549286 100644 --- a/src/ocrmypdf/exceptions.py +++ b/src/ocrmypdf/exceptions.py @@ -108,10 +108,16 @@ class EncryptedPdfError(ExitCodeException): ) -class DigitalSignatureError(ExitCodeException): +class TesseractConfigError(ExitCodeException): + """Tesseract config can't be parsed.""" + + exit_code = ExitCode.invalid_config + message = "Error occurred while parsing a Tesseract configuration file" + + +class DigitalSignatureError(InputFileError): """PDF has a digital signature.""" - exit_code = ExitCode.input_file message = dedent( """\ Input PDF has a digital signature. OCR would alter the document, @@ -120,8 +126,14 @@ class DigitalSignatureError(ExitCodeException): ) -class TesseractConfigError(ExitCodeException): - """Tesseract config can't be parsed.""" +class TaggedPDFError(InputFileError): + """PDF is tagged.""" - exit_code = ExitCode.invalid_config - message = "Error occurred while parsing a Tesseract configuration file" + message = dedent( + """\ + This PDF is marked as a Tagged PDF. This often indicates + that the PDF was generated from an office document and does + not need OCR. Use --force-ocr, --skip-text or --redo-ocr to + override this error. + """ + ) diff --git a/src/ocrmypdf/pdfinfo/info.py b/src/ocrmypdf/pdfinfo/info.py index a14656c8..472967ab 100644 --- a/src/ocrmypdf/pdfinfo/info.py +++ b/src/ocrmypdf/pdfinfo/info.py @@ -1038,7 +1038,11 @@ DEFAULT_EXECUTOR = SerialExecutor() class PdfInfo: - """Get summary information about a PDF.""" + """Extract summary information about a PDF without retaining the PDF itself. + + Crucially this lets us get the information in a pure Python format so that + it can be pickled and passed to a worker process. + """ _has_acroform: bool = False _has_signature: bool = False @@ -1078,6 +1082,9 @@ class PdfInfo: elif Name.XFA in pdf.Root.AcroForm: self._has_acroform = True self._has_signature = bool(pdf.Root.AcroForm.get(Name.SigFlags, 0) & 1) + self._is_tagged = bool( + pdf.Root.get(Name.MarkInfo, {}).get(Name.Marked, False) + ) @property def pages(self) -> Sequence[PageInfo | None]: @@ -1105,6 +1112,11 @@ class PdfInfo: """Return True if the document annotations has a digital signature.""" return self._has_signature + @property + def is_tagged(self) -> bool: + """Return True if the document catalog indicates this is a Tagged PDF.""" + return self._is_tagged + @property def filename(self) -> str | Path: """Return filename of PDF.""" diff --git a/tests/resources/tagged.odt b/tests/resources/tagged.odt new file mode 100644 index 0000000000000000000000000000000000000000..1ef80969e12a66f90f029ec623f025d68da5707b GIT binary patch literal 12767 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 literal 0 HcmV?d00001 diff --git a/tests/resources/tagged.pdf b/tests/resources/tagged.pdf new file mode 100644 index 0000000000000000000000000000000000000000..574cfeaad2c6df60e38095eb88c53d5bb77313c6 GIT binary patch literal 48462 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 literal 0 HcmV?d00001 diff --git a/tests/test_tagged.py b/tests/test_tagged.py new file mode 100644 index 00000000..e36709ae --- /dev/null +++ b/tests/test_tagged.py @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2023 James R. Barlow +# SPDX-License-Identifier: MPL-2.0 + +from __future__ import annotations + +import argparse + +import pytest + +import ocrmypdf + + +def test_block_tagged(resources): + with pytest.raises(ocrmypdf.exceptions.TaggedPDFError): + ocrmypdf.ocr(resources / 'tagged.pdf', '_.pdf') + + +def test_force_tagged_warns(resources, outpdf, caplog): + caplog.set_level('WARNING') + ocrmypdf.ocr( + resources / 'tagged.pdf', + outpdf, + force_ocr=True, + plugins=['tests/plugins/tesseract_noop.py'], + ) + assert 'marked as a Tagged PDF' in caplog.text