diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 430395a5..fc3b0054 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -5,6 +5,15 @@ OCRmyPDF uses `semantic versioning `_ for its command line i The OCRmyPDF package itself does not contain a public API, although it is fairly stable and breaking changes are usually timed with a major release. A future release will clearly define the stable public API. +next +---- + +- Fix issue #219: change how the final output file is created to avoid triggering permission errors when the output is a special file such as ``/dev/null`` +- The "encrypted PDF" error message was different depending on the type of PDF encryption. Now a single clear message appears for all types of PDF encryption. +- ocrmypdf is now in Homebrew. Homebrew users are advised to the version of ocrmypdf in the official homebrew-core formulas rather than the private tap. +- Some linting + + v5.6.0 ------ diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index aee1ed89..b489de45 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -577,6 +577,21 @@ def do_ruffus_exception(ruffus_five_tuple, options, log): msg = "Error occurred while running this command:" log.error(msg + '\n' + exc_value) exit_code = ExitCode.child_process_error + elif (exc_name == 'PyPDF2.utils.PdfReadError' and \ + 'not been decrypted' in exc_value) or \ + (exc_name == 'ocrmypdf.exceptions.EncryptedPdfError'): + log.error(textwrap.dedent("""\ + Input PDF is encrypted. The encryption must be removed to + perform OCR. + + For information about this PDF's security use + qpdf --show-encryption infilename + + You can remove the encryption using + qpdf --decrypt [--password=[password]] infilename + + """)) + exit_code = ExitCode.encrypted_pdf elif exc_name == 'ocrmypdf.exceptions.PdfMergeFailedError': log.error(textwrap.dedent("""\ Failed to merge PDF image layer with OCR layer @@ -592,19 +607,6 @@ def do_ruffus_exception(ruffus_five_tuple, options, log): base_exc_name = exc_name.replace('ocrmypdf.exceptions.', '') exc_class = getattr(ocrmypdf_exceptions, base_exc_name) exit_code = exc_class.exit_code - elif exc_name == 'PyPDF2.utils.PdfReadError' and \ - 'not been decrypted' in exc_value: - log.error(textwrap.dedent("""\ - Input PDF uses either an encryption algorithm or a PDF security - handler that is not supported by ocrmypdf. - - For information about this PDF's security use - qpdf --show-encryption [...input PDF...] - - (Only algorithms "R = 1" and "R = 2" are supported.) - - """)) - exit_code = ExitCode.encrypted_pdf elif exc_name == 'PIL.Image.DecompressionBombError': msg = cleanup_ruffus_error_message(exc_value) msg += ("\nUse the --max-image-mpixels argument to set increase the " diff --git a/ocrmypdf/exec/qpdf.py b/ocrmypdf/exec/qpdf.py index 16e7c02a..85005892 100644 --- a/ocrmypdf/exec/qpdf.py +++ b/ocrmypdf/exec/qpdf.py @@ -67,8 +67,6 @@ def repair(input_file, output_file, log): return if _probably_encrypted(e): - log.error("{0}: this PDF is password-protected - password must " - "be removed for OCR".format(input_file)) raise EncryptedPdfError() from e elif e.returncode == 2: log.error("{0}: not a valid PDF, and could not repair it.".format( diff --git a/tests/resources/README.rst b/tests/resources/README.rst index 7c74aa67..14559983 100644 --- a/tests/resources/README.rst +++ b/tests/resources/README.rst @@ -33,7 +33,7 @@ In some cases they were converted from one image format to another without other - Creative Commons BY-SA 3.0 * - typewriter.png, 2400dpi.pdf - `Wikimedia: Triumph typewrtier text Linzensoep`_ - * Creative Commons BY-SA 2.5 + - Creative Commons BY-SA 2.5 * - baiona.png - `Wikimedia: Baionako udalerri mugakideak`_ - Creative Commons BY-SA 4.0 @@ -119,7 +119,7 @@ These test resources are assemblies or derivatives from other previously mention - palette.pdf (congress.jpg, converted to a 256-color palette) - rotated_skew.pdf (a /Rotate'd and skewed document from LinnSequencer.jpg) - skew.pdf (from LinnSequencer.jpg, skew simulated by adjusting the transformation matrix) -- skew-encrypted.pdf (skew.pdf with encryption - access supported by PyPDF2) +- skew-encrypted.pdf (skew.pdf with encryption - access supported by PyPDF2, password is "password") - baiona_gray.png (from baiona.png) - poster.pdf (from LinnSequencer.jpg) diff --git a/tests/test_main.py b/tests/test_main.py index f569c94a..dbee93bb 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -484,7 +484,7 @@ def test_encrypted(resources, no_outpdf): p, out, err = run_ocrmypdf( resources / 'skew-encrypted.pdf', no_outpdf) assert p.returncode == ExitCode.encrypted_pdf - assert out.find('password') + assert out.find('encrypted') @pytest.mark.parametrize('renderer', [