From 1e7fbd4202753eefad9eab7d9818f04fba9a0999 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 29 Mar 2017 23:31:44 -0700 Subject: [PATCH 01/38] =?UTF-8?q?Fix=20issues=20with=20=E2=80=94pdf-render?= =?UTF-8?q?er=20tess4=20page=20skipping?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If tess4 renderer needed to skip OCR on a page it would end up duplicating the page contents onto the new page, rather than creating a blank OCR layer and placing it on the output page. This created duplicated content in output files. --- ocrmypdf/exec/tesseract.py | 23 +++++++++++-- ocrmypdf/pipeline.py | 5 +-- tests/test_tess4.py | 66 +++++++++++++++++++++++++++++++++++--- 3 files changed, 85 insertions(+), 9 deletions(-) diff --git a/ocrmypdf/exec/tesseract.py b/ocrmypdf/exec/tesseract.py index 30ce5b92..21e2cc4f 100644 --- a/ocrmypdf/exec/tesseract.py +++ b/ocrmypdf/exec/tesseract.py @@ -11,6 +11,7 @@ from ..helpers import page_number from . import get_program from collections import namedtuple from textwrap import dedent +import PyPDF2 as pypdf from subprocess import Popen, PIPE, CalledProcessError, \ TimeoutExpired, check_output, STDOUT, DEVNULL @@ -272,6 +273,24 @@ def generate_hocr(input_file, output_hocr, language: list, engine_mode, f_out.write(line) +def use_skip_page(text_only, skip_pdf, output_pdf): + if not text_only: + os.symlink(skip_pdf, output_pdf) + return + + # For text only we must create a blank page with dimensions identical + # to the skip page because this is equivalent to a page with no text + + pdf_in = pypdf.PdfFileReader(skip_pdf) + page0 = pdf_in.pages[0] + + with open(output_pdf, 'wb') as out: + pdf_out = pypdf.PdfFileWriter() + w, h = page0.mediaBox.getWidth(), page0.mediaBox.getHeight() + pdf_out.addBlankPage(w, h) + pdf_out.write(out) + + def generate_pdf(input_image, skip_pdf, output_pdf, language: list, engine_mode, text_only: bool, tessconfig: list, timeout: float, pagesegmode: int, log): @@ -309,14 +328,14 @@ def generate_pdf(input_image, skip_pdf, output_pdf, language: list, universal_newlines=True, timeout=timeout) except TimeoutExpired: page_timedout(log, input_image) - shutil.copy(skip_pdf, output_pdf) + use_skip_page(text_only, skip_pdf, output_pdf) except CalledProcessError as e: tesseract_log_output(log, e.output, input_image) if 'read_params_file: parameter not found' in e.output: raise TesseractConfigError() from e if 'Image too large' in e.output: - shutil.copy(skip_pdf, output_pdf) + use_skip_page(text_only, skip_pdf, output_pdf) return raise e from e else: diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index 08a688a8..2281115a 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -773,7 +773,8 @@ def generate_postscript_stub( def skip_page( input_file, output_file, - log): + log, + context): # The purpose of this step is its filter to forward only the skipped # files (.skip.oriented.pdf) while disregarding the processed ones # (.ocr.oriented.pdf). Alternative would be for merge_pages to filter @@ -1048,7 +1049,7 @@ def build_pipeline(options, work_folder, log, context): filter=suffix('.skip.oriented.pdf'), output='.done.pdf', output_dir=work_folder, - extras=[log]) + extras=[log, context]) # Merge pages task_merge_pages_ghostscript = main_pipeline.merge( diff --git a/tests/test_tess4.py b/tests/test_tess4.py index c46e0f5b..e1d71294 100644 --- a/tests/test_tess4.py +++ b/tests/test_tess4.py @@ -6,11 +6,42 @@ from ocrmypdf.exceptions import ExitCode from ocrmypdf.exec import tesseract from ocrmypdf import pageinfo import sys +import os +import PyPDF2 as pypdf + + +spoof = pytest.helpers.spoof + + +def tess4_possible_location(): + """The location of tesseract 4 may be OCRMYPDF_TESS4, OCRMYPDF_TESSERACT, + or the installed version on PATH.""" + return os.environ.get('OCRMYPDF_TESS4') or \ + os.environ.get('OCRMYPDF_TESSERACT') or \ + 'tesseract' + + +@pytest.fixture +def ensure_tess4(): + return spoof(tesseract=tess4_possible_location()) + + +def tess4_available(): + """Check if a tesseract 4 binary is available, even if it's not the + official "tesseract" on PATH + + """ + old_environ = os.environ.copy() + try: + os.environ['OCRMYPDF_TESSERACT'] = tess4_possible_location() + return tesseract.v4() and tesseract.has_textonly_pdf() + finally: + os.environ = old_environ # Skip all tests in this file if not tesseract 4 pytestmark = pytest.mark.skipif( - not (tesseract.v4() and tesseract.has_textonly_pdf()), + not tess4_available(), reason="tesseract 4.0 with textonly_pdf feature required") check_ocrmypdf = pytest.helpers.check_ocrmypdf @@ -18,14 +49,15 @@ run_ocrmypdf = pytest.helpers.run_ocrmypdf spoof = pytest.helpers.spoof -def test_textonly_pdf(resources, outdir): +def test_textonly_pdf(ensure_tess4, resources, outdir): check_ocrmypdf( resources / 'linn.pdf', - outdir / 'linn_textonly.pdf', '--pdf-renderer', 'tess4') + outdir / 'linn_textonly.pdf', '--pdf-renderer', 'tess4', + env=ensure_tess4) @pytest.mark.skipif(sys.version_info < (3, 5), reason="needs math.isclose") -def test_pagesize_consistency_tess4(resources, outpdf): +def test_pagesize_consistency_tess4(ensure_tess4, resources, outpdf): from math import isclose infile = resources / 'linn.pdf' @@ -35,9 +67,33 @@ def test_pagesize_consistency_tess4(resources, outpdf): check_ocrmypdf( infile, outpdf, '--pdf-renderer', 'tess4', - '--clean', '--deskew', '--remove-background', '--clean-final') + '--clean', '--deskew', '--remove-background', '--clean-final', + env=ensure_tess4) after_dims = pytest.helpers.first_page_dimensions(outpdf) assert isclose(before_dims[0], after_dims[0]) assert isclose(before_dims[1], after_dims[1]) + + +@pytest.mark.parametrize('basename', ['graph_ocred.pdf', 'cardinal.pdf']) +def test_skip_pages_does_not_replicate( + ensure_tess4, resources, basename, outdir): + infile = resources / basename + outpdf = outdir / basename + + check_ocrmypdf( + infile, + outpdf, '--pdf-renderer', 'tess4', '--force-ocr', + '--tesseract-timeout', '0', + env=ensure_tess4 + ) + + info_in = pageinfo.pdf_get_all_pageinfo(str(infile)) + + info = pageinfo.pdf_get_all_pageinfo(str(outpdf)) + for page in info: + assert len(page['images']) == 1, "skipped page was replicated" + + for n in range(len(info_in)): + assert info[n]['width_inches'] == info_in[n]['width_inches'] From 7b7e3a3e03d4052982c69b69caed32fb16315244 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 29 Mar 2017 23:44:12 -0700 Subject: [PATCH 02/38] =?UTF-8?q?Enable=20lossless=20reconstruction=20for?= =?UTF-8?q?=20=E2=80=94pdf-renderer=20tess4=20where=20appropriate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ocrmypdf/__main__.py | 2 +- tests/test_tess4.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 009c3850..ff6abaae 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -290,7 +290,7 @@ def check_options_output(options, log): "--pdf-renderer=tesseract.") lossless_reconstruction = False - if options.pdf_renderer == 'hocr': + if options.pdf_renderer in ('hocr', 'tess4'): if not any((options.deskew, options.clean_final, options.force_ocr, options.remove_background)): lossless_reconstruction = True diff --git a/tests/test_tess4.py b/tests/test_tess4.py index e1d71294..4cc9942c 100644 --- a/tests/test_tess4.py +++ b/tests/test_tess4.py @@ -97,3 +97,17 @@ def test_skip_pages_does_not_replicate( for n in range(len(info_in)): assert info[n]['width_inches'] == info_in[n]['width_inches'] + + +def test_content_preservation(ensure_tess4, resources, outpdf): + infile = resources / 'masks.pdf' + + check_ocrmypdf( + infile, + outpdf, '--pdf-renderer', 'tess4', '--tesseract-timeout', '0', + env=ensure_tess4 + ) + + info = pageinfo.pdf_get_all_pageinfo(str(outpdf)) + page = info[0] + assert len(page['images']) > 1, "masked were rasterized" \ No newline at end of file From 58d1042147ec7a430caa530d36e841e0e5966612 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 29 Mar 2017 23:50:31 -0700 Subject: [PATCH 03/38] v4.5.3 release notes update --- RELEASE_NOTES.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst index edcfc01b..46af1b02 100644 --- a/RELEASE_NOTES.rst +++ b/RELEASE_NOTES.rst @@ -7,8 +7,10 @@ OCRmyPDF uses `semantic versioning `_. v4.5.3 ====== -- Added a workaround for Ghostscript 9.21 and probably early versions would fail with the error message "VMerror -25", due to a Ghostscript bug in XMP metadata handling +- Added a workaround for Ghostscript 9.21 and probably earlier versions would fail with the error message "VMerror -25", due to a Ghostscript bug in XMP metadata handling - High Unicode characters (U+10000 and up) are no longer accepted for setting metadata on the command line, as Ghostscript may not handle them correctly. +- Fixed an issue where the ``tess4`` renderer would duplicate content onto output pages if tesseract failed or timed out +- Fixed ``tess4`` renderer not recognized when lossless reconstruction is possible v4.5.2 From 345256ee99c5ac6b4de552437c4960782cf96d47 Mon Sep 17 00:00:00 2001 From: Tom Date: Wed, 19 Apr 2017 00:19:24 +0200 Subject: [PATCH 04/38] Fix --skip-big when there are no images in pdf (#152) * fixed skip-big when there are no images in pdf * added only_text pdf * updated only_text pdf * Delete only_text.pdf --- ocrmypdf/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index 2281115a..ca4edcb3 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -247,7 +247,7 @@ def is_ocr_required(pageinfo, log, options): "skipping all processing on this page")) ocr_required = False - if ocr_required and options.skip_big: + if ocr_required and options.skip_big and pageinfo['images']: pixel_count = pageinfo['width_pixels'] * pageinfo['height_pixels'] if pixel_count > (options.skip_big * 1000000): ocr_required = False From 554fcc8b9dd228ebc791f2d2749fb4a17770c030 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 18 Apr 2017 15:20:25 -0700 Subject: [PATCH 05/38] Add test case for #152 --- tests/test_main.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index 2997763e..b00852f3 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -837,3 +837,10 @@ def test_pagesize_consistency(renderer, resources, outpdf): assert isclose(before_dims[0], after_dims[0]) assert isclose(before_dims[1], after_dims[1]) + + +def test_skip_big_with_no_images(spoof_tesseract_noop, resources, outpdf): + check_ocrmypdf(resources / 'blank.pdf', outpdf, + '--skip-big', '5', + '--force-ocr', + env=spoof_tesseract_noop) \ No newline at end of file From 9a4813089c3c80b75a019d0a68f848c5e9fd9f23 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 18 Apr 2017 15:28:30 -0700 Subject: [PATCH 06/38] =?UTF-8?q?autobrew:=20remove=20homebrew=20dependenc?= =?UTF-8?q?y=20=E2=80=9Czlib=E2=80=9D,=20causes=20audit=20failure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis/autobrew.py | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis/autobrew.py b/.travis/autobrew.py index eeebcbb8..eed98b89 100644 --- a/.travis/autobrew.py +++ b/.travis/autobrew.py @@ -13,7 +13,6 @@ class Ocrmypdf < Formula depends_on :python3 depends_on "pkg-config" => :build - depends_on "zlib" depends_on "libffi" depends_on "tesseract" depends_on "ghostscript" From 2b82c31b85f422dba502fe54198306514065106d Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 18 Apr 2017 18:07:19 -0700 Subject: [PATCH 07/38] Update documentation --- docs/introduction.rst | 27 ++++++++++++++++++++++++++- docs/security.rst | 2 +- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/introduction.rst b/docs/introduction.rst index 2f9056a4..4ba9a59c 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -53,6 +53,20 @@ By default, OCRmyPDF will convert the file to a PDF/A. This behavior can be dis Depending on the settings selected, OCRmyPDF may "graft" the OCR layer into the existing PDF, or reconstruct a visually equivalent new PDF. +Why you shouldn't do this manually +---------------------------------- + +There are two routes to manually applying OCR to an existing PDF, both of which destroy information in the original PDF. + +1. Rasterize each page as an image, OCR the images, and combine the output into a PDF. This preserves the appearance of each page, but resamples all images (possibly losing quality, increasing file size, introducing compression artifacts, etc.) + +2. Extract each image, OCR, and combine the output into a PDF. This loses the context in which images are used in the PDF, meaning that cropping, rotation and scaling of pages may be lost. Some PDFs use multiple images per page with stencil masks, which would quite difficult to reassemble correctly. This also loses and text or vector art on any pages in a PDF with both scanned and pure digital content. + +In the case of a PDF that is nothing other than a container of images (no rotation, scaling, cropping, one image per page), the second approach is can be lossless. + +OCRmyPDF uses several strategies depending on input options and the input PDF itself, but generally speaking it rasterizes a page for OCR and then grafts the OCR back onto the original. As such it can handle complex PDFs and still preserve their contents as much as possible. + + Limitations ----------- @@ -73,4 +87,15 @@ Ghostscript also imposes some limitations: * PDFs containing JBIG2-encoded content will be converted to CCITT Group4 encoding, which has lower compression ratios, if Ghostscript PDF/A is enabled. -OCRmyPDF is currently not designed to be used as a Python API; it is designed to be run as a command line tool. ``import ocrmypf`` currently attempts to process the command line on ``sys.argv`` at import time so it has side effects that will interfere with its use as a package. The API it presents should not be considered stable. \ No newline at end of file +OCRmyPDF is currently not designed to be used as a Python API; it is designed to be run as a command line tool. ``import ocrmypf`` currently attempts to process the command line on ``sys.argv`` at import time so it has side effects that will interfere with its use as a package. The API it presents should not be considered stable. + + +Similar programs +---------------- + +To the author's knowledge, OCRmyPDF is the most feature-rich and thoroughly tested command line OCR PDF conversion tool. If it doesn't meet your needs, consider of these similar open source programs: + +* pdf2pdfocr +* pdfsandwich +* pypdfocr +* pdfbeads \ No newline at end of file diff --git a/docs/security.rst b/docs/security.rst index b42a9ae2..5f4a214a 100644 --- a/docs/security.rst +++ b/docs/security.rst @@ -1,4 +1,4 @@ -PDF Security Issues +PDF security issues =================== OCRmyPDF should only be used on PDFs you trust. It is not designed to protect you against malware. From fee22b6b0b8efc3451b9cc4e50e4d70b1fed35b1 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 18 Apr 2017 18:08:45 -0700 Subject: [PATCH 08/38] Fix #151, cannot write mode P as JPEG all() is True. --- ocrmypdf/__main__.py | 4 ++++ ocrmypdf/pipeline.py | 22 ++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index ff6abaae..855df7cd 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -46,6 +46,10 @@ def complain(message): print(*textwrap.wrap(message), file=sys.stderr) +# Hack to help debugger context find /usr/local/bin +if 'IDE_PROJECT_ROOTS' in os.environ: + os.environ['PATH'] = '/usr/local/bin:' + os.environ['PATH'] + if tesseract.version() < MINIMUM_TESS_VERSION: complain( "Please install tesseract {0} or newer " diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index ca4edcb3..6303b910 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -393,15 +393,16 @@ def rasterize_with_ghostscript( pageinfo = get_pageinfo(input_file, context) device = 'png16m' # 24-bit - if all(image['comp'] == 1 for image in pageinfo['images']): - if all(image['bpc'] == 1 for image in pageinfo['images']): - device = 'pngmono' - elif all(image['bpc'] > 1 and image['color'] == 'index' - for image in pageinfo['images']): - device = 'png256' - elif all(image['bpc'] > 1 and image['color'] == 'gray' - for image in pageinfo['images']): - device = 'pnggray' + if pageinfo['images']: + if all(image['comp'] == 1 for image in pageinfo['images']): + if all(image['bpc'] == 1 for image in pageinfo['images']): + device = 'pngmono' + elif all(image['bpc'] > 1 and image['color'] == 'index' + for image in pageinfo['images']): + device = 'png256' + elif all(image['bpc'] > 1 and image['color'] == 'gray' + for image in pageinfo['images']): + device = 'pnggray' log.debug("Rasterize {0} with {1}".format( os.path.basename(input_file), device)) @@ -517,7 +518,8 @@ def select_visible_page_image( image = next(ii for ii in infiles if ii.endswith(image_suffix)) pageinfo = get_pageinfo(image, context) - if all(orig_image['enc'] == 'jpeg' for orig_image in pageinfo['images']): + if pageinfo['images'] and \ + all(im['enc'] == 'jpeg' for im in pageinfo['images']): # If all images were JPEGs originally, produce a JPEG as output im = Image.open(image) From 8954e6c3b9e609f78021943f84235c2c3b39fcea Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 18 Apr 2017 18:09:15 -0700 Subject: [PATCH 09/38] v4.5.4 Update release notes --- RELEASE_NOTES.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst index 46af1b02..153f5847 100644 --- a/RELEASE_NOTES.rst +++ b/RELEASE_NOTES.rst @@ -4,6 +4,13 @@ RELEASE NOTES OCRmyPDF uses `semantic versioning `_. +v4.5.4 +====== + +- Fix ``--skip-big`` raising an exception if a page contains no images (#152) (thanks to @TomRaz) +- Fix an issue where pages with no images might trigger "cannot write mode P as JPEG" (#151) + + v4.5.3 ====== From 204336e1a5fb6f49447070e11cc57ceeb2453b6a Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 18 Apr 2017 18:26:31 -0700 Subject: [PATCH 10/38] Move release notes into the rest of documentation --- README.rst | 2 +- docs/index.rst | 11 +- RELEASE_NOTES.rst => docs/release_notes.rst | 112 ++++++++++---------- 3 files changed, 64 insertions(+), 61 deletions(-) rename RELEASE_NOTES.rst => docs/release_notes.rst (97%) diff --git a/README.rst b/README.rst index 2ed58590..f1d61dd6 100644 --- a/README.rst +++ b/README.rst @@ -35,7 +35,7 @@ Main features - Supports more than `100 languages `_ recognized by Tesseract - Battle-tested on thousands of PDFs, a test suite and continuous integration -For details: please consult the `release notes `_. +For details: please consult the `documentation `_. Motivation ---------- diff --git a/docs/index.rst b/docs/index.rst index 029f1d9c..f166a89d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,14 +11,18 @@ be searched. PDFs are the best format for scanned documents. Unfortunately, PDFs can be difficult to work with. OCRmyPDF makes it easy to apply image processing and OCR to existing PDFs. -Contents: - .. toctree:: - :maxdepth: 2 + :maxdepth: 1 introduction + release_notes installation languages + +.. toctree:: + :caption: Usage + :maxdepth: 2 + cookbook advanced batch @@ -26,7 +30,6 @@ Contents: errors - Indices and tables ================== diff --git a/RELEASE_NOTES.rst b/docs/release_notes.rst similarity index 97% rename from RELEASE_NOTES.rst rename to docs/release_notes.rst index 153f5847..22823d19 100644 --- a/RELEASE_NOTES.rst +++ b/docs/release_notes.rst @@ -1,18 +1,18 @@ -RELEASE NOTES +Release notes ============= OCRmyPDF uses `semantic versioning `_. v4.5.4 -====== +------ - Fix ``--skip-big`` raising an exception if a page contains no images (#152) (thanks to @TomRaz) - Fix an issue where pages with no images might trigger "cannot write mode P as JPEG" (#151) v4.5.3 -====== +------ - Added a workaround for Ghostscript 9.21 and probably earlier versions would fail with the error message "VMerror -25", due to a Ghostscript bug in XMP metadata handling - High Unicode characters (U+10000 and up) are no longer accepted for setting metadata on the command line, as Ghostscript may not handle them correctly. @@ -21,7 +21,7 @@ v4.5.3 v4.5.2 -====== +------ - Fix issue #147. ``--pdf-renderer tess4 --clean`` will produce an oversized page containing the original image in the bottom left corner, due to loss DPI information. - Make "using Tesseract 4.0" warning less ominous @@ -29,13 +29,13 @@ v4.5.2 v4.5.1 -====== +------ - Fix issue #137, proportions of images with a non-square pixel aspect ratio would be distorted in output for ``--force-ocr`` and some other combinations of flags v4.5 -==== +---- - Exotic PDFs containing "Form XObjects" are now supported (issue #134; PDF reference manual 8.10), and images they contain are taken into account when determining the resolution for rasterizing - The Tesseract 4 Docker image no longer includes all languages, because it took so long to build something would tend to fail @@ -43,7 +43,7 @@ v4.5 v4.4.2 -====== +------ - The Docker images (ocrmypdf, ocrmypdf-polyglot, ocrmypdf-tess4) are now based on Ubuntu 16.10 instead of Debian stretch @@ -54,7 +54,7 @@ v4.4.2 v4.4.1 -====== +------ - To prevent a `TIFF output error `_ caused by img2pdf >= 0.2.1 and Pillow <= 3.4.2, dependencies have been tightened - The Tesseract 4.00 simultaneous process limit was increased from 1 to 2, since it was observed that 1 lowers performance @@ -63,7 +63,7 @@ v4.4.1 - Tweaks to setup.py to deal with issues in the v4.4 release v4.4 -==== +---- - Tesseract 4.00 is now supported on an experimental basis. @@ -81,32 +81,32 @@ v4.4 v4.3.5 -====== +------ - Update documentation to confirm Python 3.6.0 compatibility. No code changes were needed, so many earlier versions are likely supported. v4.3.4 -====== +------ - Fixed "decimal.InvalidOperation: quantize result has too many digits" for high DPI images v4.3.3 -====== +------ - Fixed PDF/A creation with Ghostscript 9.20 properly - Fixed an exception on inline stencil masks with a missing optional parameter v4.3.2 -====== +------ - Fixed a PDF/A creation issue with Ghostscript 9.20 (note: this fix did not actually work) v4.3.1 -====== +------ - Fixed an issue where pages produced by the "hocr" renderer after a Tesseract timeout would be rotated incorrectly if the input page was rotated with a /Rotate marker - Fixed a file handle leak in LeptonicaErrorTrap that would cause a "too many open files" error for files around hundred pages of pages long when ``--deskew`` or ``--remove-background`` or other Leptonica based image processing features were in use, depending on the system value of ``ulimit -n`` @@ -117,7 +117,7 @@ v4.3.1 v4.3 -==== +---- - New feature ``--remove-background`` to detect and erase the background of color and grayscale images - Better documentation @@ -128,20 +128,20 @@ v4.3 + Some output validation is disabled in this mode v4.2.5 -====== +------ - Fixed an issue (#100) with PDFs that omit the optional /BitsPerComponent parameter on images - Removed non-free file milk.pdf v4.2.4 -====== +------ - Fixed an error (#90) caused by PDFs that use stencil masks properly - Fixed handling of PDFs that try to draw images or stencil masks without properly setting up the graphics state (such images are now ignored for the purposes of calculating DPI) v4.2.3 -====== +------ - Fixed an issue with PDFs that store page rotation (/Rotate) in an indirect object - Integrated a few fixes to simplify downstream packaging (Debian) @@ -155,20 +155,20 @@ v4.2.3 v4.2.2 -====== +------ - Improvements to documentation v4.2.1 -====== +------ - Fixed an issue where PDF pages that contained stencil masks would report an incorrect DPI and cause Ghostscript to abort - Implemented stdin streaming v4.2 -==== +---- - ocrmypdf will now try to convert single image files to PDFs if they are provided as input (#15) @@ -201,13 +201,13 @@ v4.2 - Ghostscript now runs in "safer" mode where possible v4.1.4 -====== +------ - Bug fix: monochrome images with an ICC profile attached were incorrectly converted to full color images if lossless reconstruction was not possible due to other settings; consequence was increased file size for these images v4.1.3 -====== +------ - More helpful error message for PDFs with version 4 security handler - Update usage instructions for Windows/Docker users @@ -216,14 +216,14 @@ v4.1.3 v4.1.2 -====== +------ - Replace IEC sRGB ICC profile with Debian's sRGB (from icc-profiles-free) which is more compatible with the MIT license - More helpful error message for an error related to certain types of malformed PDFs v4.1 -==== +---- - ``--rotate-pages`` now only rotates pages when reasonably confidence in the orientation. This behavior can be adjusted with the new argument ``--rotate-pages-threshold`` - Fixed problems in error checking if ``unpaper`` is uninstalled or missing at run-time @@ -231,20 +231,20 @@ v4.1 v4.0.7 -====== +------ - Minor correction to Ghostscript output settings v4.0.6 -====== +------ - Update install instructions - Provide a sRGB profile instead of using Ghostscript's v4.0.5 -====== +------ - Remove some verbose debug messages from v4.0.4 - Fixed temporary that wasn't being deleted @@ -252,22 +252,22 @@ v4.0.5 - Inline images are now checked during DPI calculation instead of rejecting the image v4.0.4 -====== +------ Released with verbose debug message turned on. Do not use. Skip to v4.0.5. v4.0.3 -====== +------ New features ------------- +^^^^^^^^^^^^ - Page orientations detected are now reported in a summary comment Fixes ------ +^^^^^ - Show stack trace if unexpected errors occur - Treat "too few characters" error message from Tesseract as a reason to skip that page rather than @@ -276,10 +276,10 @@ Fixes v4.0.2 -====== +------ Fixes ------ +^^^^^ - Fixed compatibility with Tesseract 3.04.01 release, particularly its different way of outputting orientation information @@ -288,19 +288,19 @@ Fixes v4.0.1 -====== +------ Fixes ------ +^^^^^ - Fixed a KeyError if tesseract fails to find page orientation information v4.0 -==== +---- New features ------------- +^^^^^^^^^^^^ - Automatic page rotation (``-r``) is now available. It uses ignores any prior rotation information on PDFs and sets rotation based on the dominant orientation of detectable text. This feature is @@ -310,7 +310,7 @@ New features Fixes ------ +^^^^^ - Fixed an issue where lossless reconstruction could cause some pages to be appear incorrectly if the page was rotated by the user in Acrobat after being scanned (specifically if it a /Rotate tag) @@ -319,7 +319,7 @@ Fixes Changes -------- +^^^^^^^ - Logging output is now much easier to read - ``--deskew`` is now performed by Leptonica instead of unpaper (#25) @@ -332,20 +332,20 @@ Changes v3.2.1 -====== +------ Changes -------- +^^^^^^^ - Fixed issue #47 "convert() got and unexpected keyword argument 'dpi'" by upgrading to img2pdf 0.2 - Tweaked the Dockerfiles v3.2 -==== +---- New features ------------- +^^^^^^^^^^^^ - Lossless reconstruction: when possible, OCRmyPDF will inject text layers without otherwise manipulating the content and layout of a PDF page. For example, a PDF containing a mix @@ -357,25 +357,25 @@ New features for the polyglots among us. It is much larger. Changes -------- +^^^^^^^ - JPEG transcoding quality is now 95 instead of the default 75. Bigger file sizes for less degradation. v3.1.1 -====== +------ Changes -------- +^^^^^^^ - Fixed bug that caused incorrect page size and DPI calculations on documents with mixed page sizes v3.1 -==== +---- Changes -------- +^^^^^^^ - Default output format is now PDF/A-2b instead of PDF/A-1b - Python 3.5 and macOS El Capitan are now supported platforms - no changes were @@ -390,10 +390,10 @@ Changes - Set up Travis CI automatic integration testing v3.0 -==== +---- New features ------------- +^^^^^^^^^^^^ - Easier installation with a Docker container or Python's ``pip`` package manager - Eliminated many external dependencies, so it's easier to setup @@ -416,7 +416,7 @@ New features - Multiple images on the same PDF page are now supported Changes -------- +^^^^^^^ - New, robust rewrite in Python 3.4+ with ruffus_ pipelines - Now uses Ghostscript 9.14's improved color conversion model to preserve PDF colors @@ -454,7 +454,7 @@ Changes .. _JHOVE: http://jhove.sourceforge.net/ Release candidates ------------------- +^^^^^^^^^^^^^^^^^^ - rc9: @@ -522,12 +522,12 @@ where ``settings.txt`` contains *one argument per line*, for example: Fixes ------ +^^^^^ - Handling of filenames containing spaces: fixed Notes and known issues ----------------------- +^^^^^^^^^^^^^^^^^^^^^^ - Some dependencies may work with lower versions than tested, so try overriding dependencies if they are "in the way" to see if they work. @@ -540,7 +540,7 @@ Notes and known issues v2.2-stable (2014-09-29) -======================== +------------------------ OCRmyPDF versions 1 and 2 were implemented as shell scripts. OCRmyPDF 3.0+ is a fork that gradually replaced all shell scripts with Python while maintaining the existing command line arguments. No one is maintaining old versions. From a1033cdc64f48a907cc136e8ec44bc267eefde7e Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 18 Apr 2017 23:38:07 -0700 Subject: [PATCH 11/38] =?UTF-8?q?osx=5Fbrew:=20show=20output=20before=20le?= =?UTF-8?q?tting=20=E2=80=9Cbrew=20audit=E2=80=9D=20check=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis/osx_brew.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/osx_brew.sh b/.travis/osx_brew.sh index a9edc459..32e9a140 100644 --- a/.travis/osx_brew.sh +++ b/.travis/osx_brew.sh @@ -4,5 +4,5 @@ set -x pip3 install homebrew-pypi-poet python3 .travis/autobrew.py -brew audit ocrmypdf.rb cat ocrmypdf.rb +brew audit ocrmypdf.rb From 2846fb4e310c331c502367f13011396335c803f6 Mon Sep 17 00:00:00 2001 From: Jakub Wilk Date: Thu, 20 Apr 2017 09:38:23 +0200 Subject: [PATCH 12/38] Remove misplaced flags from re.sub() call (#153) The 4th argument of re.sub() is maximum number of substitutions, not flags. Moreover, re.MULTILINE affects only semantics of ^ and $, so it wouldn't have any effect on this regular expression. --- ocrmypdf/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 855df7cd..09280c0a 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -420,7 +420,7 @@ def available_cpu_count(): def cleanup_ruffus_error_message(msg): - msg = re.sub(r'\s+', r' ', msg, re.MULTILINE) + msg = re.sub(r'\s+', r' ', msg) msg = re.sub(r"\((.+?)\)", r'\1', msg) msg = msg.strip() return msg From 6a91fa637f7bedd48a0b368a0f91c0e9356c07e5 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Fri, 28 Apr 2017 15:17:38 -0700 Subject: [PATCH 13/38] Squash merge improvements to auto-homebrewing macOS version --- .travis.yml | 38 +++++++++++++++++++++++++++----------- .travis/osx_brew.sh | 12 ++++++++++++ 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index d3b328ae..cb9a6896 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,13 +24,18 @@ matrix: - os: osx osx_image: xcode8 language: generic + env: + - secure: "hsf6MT+n2x3OiDM2fQyJZdV0/PWYmv81LdVqC6cfnHBE/8N3DloJRqQ7WfO14TxhiK9PEC7MpyCj0lSabUHEO7gSH6Vks6I1asoSkt8S9/bSMlhT4hei+pwVpeGEiU5xHVATNjY+D919VC3IFvc3XmjT74h/2SLhaZ+jhEmDggM=" before_cache: - rm -f $HOME/.cache/pip/log/debug.log -before_install: -- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then bash .travis/linux_before_install.sh ; fi -- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash .travis/osx_before_install.sh ; fi +before_install: | + if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + bash .travis/linux_before_install.sh + elif [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + bash .travis/osx_before_install.sh + fi install: - pip3 install . @@ -41,20 +46,31 @@ script: - pytest - mv dont_import_this_ocrmypdf ocrmypdf -after_success: -- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash .travis/osx_brew.sh ; fi - -# See https://www.appneta.com/blog/pypi-deployment-with-travis-ci/ for -# steps to set up testpypi deploy for untagged builds if desired - deploy: - provider: pypi + # release for main pypi +- provider: pypi user: ocrmypdf-travis password: - secure: DTFOmmNL6olA0+yXvp4u9jXZlZeqrJsJ0526jzqf4a3gZ6jnGTq5UI6WzRsslSyoMMfXKtHQebqHM6ogSgCZinyZ3ufHJo8fn9brxbEc2gsiWkbj5o3bGwdWMT1vNNE7XW0VCpw87rZ1EEwjl4FJHFudMlPR1yfU5+uq0k0PACo= + secure: "DTFOmmNL6olA0+yXvp4u9jXZlZeqrJsJ0526jzqf4a3gZ6jnGTq5UI6WzRsslSyoMMfXKtHQebqHM6ogSgCZinyZ3ufHJo8fn9brxbEc2gsiWkbj5o3bGwdWMT1vNNE7XW0VCpw87rZ1EEwjl4FJHFudMlPR1yfU5+uq0k0PACo=" distributions: "sdist bdist_wheel" on: branch: master tags: true condition: $TRAVIS_PYTHON_VERSION == "3.6" && $TRAVIS_OS_NAME == "linux" skip_upload_docs: true + + # test pypi +- provider: pypi + server: https://testpypi.python.org/pypi + user: ocrmypdf-travis + password: + secure: "DTFOmmNL6olA0+yXvp4u9jXZlZeqrJsJ0526jzqf4a3gZ6jnGTq5UI6WzRsslSyoMMfXKtHQebqHM6ogSgCZinyZ3ufHJo8fn9brxbEc2gsiWkbj5o3bGwdWMT1vNNE7XW0VCpw87rZ1EEwjl4FJHFudMlPR1yfU5+uq0k0PACo=" + distributions: "sdist" + on: + branch: develop + tags: false + condition: $TRAVIS_OS_NAME == "osx" + skip_upload_docs: true + +after_deploy: +- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash .travis/osx_brew.sh ; fi \ No newline at end of file diff --git a/.travis/osx_brew.sh b/.travis/osx_brew.sh index 32e9a140..d82a4514 100644 --- a/.travis/osx_brew.sh +++ b/.travis/osx_brew.sh @@ -6,3 +6,15 @@ pip3 install homebrew-pypi-poet python3 .travis/autobrew.py cat ocrmypdf.rb brew audit ocrmypdf.rb + +# Important: disable debug output so token is hidden +set +x +git clone https://$HOMEBREW_OCRMYPDF_TOKEN@github.com/jbarlow83/homebrew-ocrmypdf.git +set -x + +pushd homebrew-ocrmypdf +cp ../ocrmypdf.rb Formula/ocrmypdf.rb +git add Formula/ocrmypdf.rb +git commit -m "homebrew-ocrmypdf: automatic release $TRAVIS_BUILD_NUMBER $TRAVIS_TAG" +git push origin master +popd From 6c8c1d8173047a3ae9241d4c8b30ce39c442383c Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Fri, 28 Apr 2017 15:22:05 -0700 Subject: [PATCH 14/38] =?UTF-8?q?Fix=20#154:=20KeyError=20=E2=80=98/Conten?= =?UTF-8?q?ts=E2=80=99=20on=20blank=20pages=20with=20/Contents=20record?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ocrmypdf/pageinfo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ocrmypdf/pageinfo.py b/ocrmypdf/pageinfo.py index a54ec385..f2ddb879 100644 --- a/ocrmypdf/pageinfo.py +++ b/ocrmypdf/pageinfo.py @@ -464,6 +464,9 @@ def _find_images(pdf, container, shorthand=None): def _page_has_text(pdf, page): + if not '/Contents' in page: + return False + # Simple test text = page.extractText() if text.strip() != '': From 474b6b050031f31548a0be3623098af8b983fdfc Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Fri, 28 Apr 2017 15:27:41 -0700 Subject: [PATCH 15/38] v4.5.5 release notes --- .gitignore | 1 + docs/release_notes.rst | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index 63265f5b..ee5d7de4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ pyvenv.cfg tasks.py .bash_history .ruffus_history.sqlite +.idea/ # Package building *.egg-info/ diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 22823d19..a9c0afc7 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -4,6 +4,13 @@ Release notes OCRmyPDF uses `semantic versioning `_. +v4.5.5 +------ + +- Automated update of macOS homebrew tap +- Fixed issue #154, KeyError '/Contents' when searching for text on blank pages that have no /Contents record + + v4.5.4 ------ From 5b1a7880a94cd85588fae55d3aa347a4b220680e Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Fri, 28 Apr 2017 17:18:01 -0700 Subject: [PATCH 16/38] Switch to Travis triggering Docker build to skip race condition with PyPI --- .travis.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index cb9a6896..80312f1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,11 +21,13 @@ matrix: sudo: required language: python python: 3.6 + env: + - secure: "oyX5xesoHD7qcDXKIxMyGZPi+H/WxcvfFkaviEmq84K1DDyHk48+9e92IKgrw8/lcTADnEo/AgVKfnhCPflFimk1xTkgaK4sUg1WLI2YjmaHcwl5SlBHa2rN3uGBwy1hyP92qyv/mMc9R59NtRJ8u76lbn6eN9wi7lkFWdE6BTw=" # DOCKERHUB_OCRMYPDF_TOKEN - os: osx osx_image: xcode8 language: generic env: - - secure: "hsf6MT+n2x3OiDM2fQyJZdV0/PWYmv81LdVqC6cfnHBE/8N3DloJRqQ7WfO14TxhiK9PEC7MpyCj0lSabUHEO7gSH6Vks6I1asoSkt8S9/bSMlhT4hei+pwVpeGEiU5xHVATNjY+D919VC3IFvc3XmjT74h/2SLhaZ+jhEmDggM=" + - secure: "hsf6MT+n2x3OiDM2fQyJZdV0/PWYmv81LdVqC6cfnHBE/8N3DloJRqQ7WfO14TxhiK9PEC7MpyCj0lSabUHEO7gSH6Vks6I1asoSkt8S9/bSMlhT4hei+pwVpeGEiU5xHVATNjY+D919VC3IFvc3XmjT74h/2SLhaZ+jhEmDggM=" # HOMEBREW_OCRMYPDF_TOKEN before_cache: - rm -f $HOME/.cache/pip/log/debug.log @@ -72,5 +74,9 @@ deploy: condition: $TRAVIS_OS_NAME == "osx" skip_upload_docs: true -after_deploy: -- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash .travis/osx_brew.sh ; fi \ No newline at end of file +after_deploy: | + if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + bash .travis/osx_brew.sh + elif [[ "$TRAVIS_PYTHON_VERSION" == "3.6" && "$TRAVIS_OS_NAME" == "linux" ]]; then + curl -H "Content-Type: application/json" --data '{"build": true}' -X POST https://registry.hub.docker.com/u/jbarlow83/ocrmypdf/trigger/$DOCKERHUB_OCRMYPDF_TOKEN/ + fi \ No newline at end of file From cf643c9f431cf5d68df8b275c6210072cd9c53b2 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 1 May 2017 14:55:47 -0700 Subject: [PATCH 17/38] Fix argparse.ArgumentError needs two positional args --- ocrmypdf/__main__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 09280c0a..2ff469c9 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -268,7 +268,7 @@ def check_options_languages(options, _log): "data for the following requested languages: \n") for lang in (set(options.language) - tesseract.languages()): msg += lang + '\n' - raise argparse.ArgumentError(msg) + raise argparse.ArgumentError(None, msg) def check_options_output(options, log): @@ -324,6 +324,7 @@ def check_options_preprocessing(options, log): def check_options_ocr_behavior(options, log): if options.force_ocr and options.skip_text: raise argparse.ArgumentError( + None, "Error: --force-ocr and --skip-text are mutually incompatible.") if set(options.language) & {'chi_sim', 'chi_tra'} and \ From b9b12e28798f6fe0614859887cf297f99fa3fc18 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 1 May 2017 15:44:21 -0700 Subject: [PATCH 18/38] Ensure that ocrmypdf stops and reports an error if Ghostscript fails Past behavior was to continue and let ruffus puke eventually --- ocrmypdf/exceptions.py | 2 +- ocrmypdf/exec/ghostscript.py | 19 +++++++++++++------ tests/spoof/gs_raster_failure.py | 31 +++++++++++++++++++++++++++++++ tests/spoof/gs_render_failure.py | 31 +++++++++++++++++++++++++++++++ tests/test_main.py | 27 +++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 7 deletions(-) create mode 100755 tests/spoof/gs_raster_failure.py create mode 100755 tests/spoof/gs_render_failure.py diff --git a/ocrmypdf/exceptions.py b/ocrmypdf/exceptions.py index bfad6108..c68bcf9f 100644 --- a/ocrmypdf/exceptions.py +++ b/ocrmypdf/exceptions.py @@ -48,7 +48,7 @@ class InputFileError(ExitCodeException): class SubprocessOutputError(ExitCodeException): - exit_code = ExitCode.other_error + exit_code = ExitCode.child_process_error class EncryptedPdfError(ExitCodeException): diff --git a/ocrmypdf/exec/ghostscript.py b/ocrmypdf/exec/ghostscript.py index c022c4f3..eb8eb451 100644 --- a/ocrmypdf/exec/ghostscript.py +++ b/ocrmypdf/exec/ghostscript.py @@ -6,8 +6,9 @@ from subprocess import Popen, PIPE, STDOUT, check_call, CalledProcessError, \ check_output from shutil import copy from functools import lru_cache +import re from . import get_program -from ..pdfa import SRGB_ICC_PROFILE +from ..exceptions import SubprocessOutputError @lru_cache(maxsize=1) @@ -28,6 +29,10 @@ def version(): return version.strip() +def _gs_error_reported(stream): + return re.search(r'error', stream, flags=re.IGNORECASE) + + def rasterize_pdf(input_file, output_file, xres, yres, raster_device, log, pageno=1): with NamedTemporaryFile(delete=True) as tmp: @@ -48,15 +53,16 @@ def rasterize_pdf(input_file, output_file, xres, yres, raster_device, log, p = Popen(args_gs, close_fds=True, stdout=PIPE, stderr=STDOUT, universal_newlines=True) stdout, _ = p.communicate() - if 'error' in stdout: - log.error(stdout) # Ghostscript puts errors in stdout + if _gs_error_reported(stdout): + log.error(stdout) else: log.debug(stdout) if p.returncode == 0: copy(tmp.name, output_file) else: - log.error('Ghostscript rendering failed') + log.error('Ghostscript rasterizing failed') + raise SubprocessOutputError() def generate_pdfa(pdf_pages, output_file, log, threads=1): @@ -81,7 +87,7 @@ def generate_pdfa(pdf_pages, output_file, log, threads=1): universal_newlines=True) stdout, _ = p.communicate() - if 'error' in stdout or 'ERROR' in stdout: + if _gs_error_reported(stdout): log.error(stdout) elif 'overprint mode not set' in stdout: # Unless someone is going to print PDF/A documents on a @@ -99,4 +105,5 @@ def generate_pdfa(pdf_pages, output_file, log, threads=1): # PDF/A - check PDF/A status elsewhere copy(gs_pdf.name, output_file) else: - log.error('Ghostscript PDF/A failed') + log.error('Ghostscript PDF/A rendering failed') + raise SubprocessOutputError() \ No newline at end of file diff --git a/tests/spoof/gs_raster_failure.py b/tests/spoof/gs_raster_failure.py new file mode 100755 index 00000000..70c23b31 --- /dev/null +++ b/tests/spoof/gs_raster_failure.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +import sys +import os + +"""Replicate Ghostscript raster failure while allowing rendering""" + + +def real_ghostscript(argv): + gs_args = ['gs'] + argv[1:] + os.execvp("gs", gs_args) + return # Not reachable + + +def main(): + if '--version' in sys.argv: + print('9.20') + print('SPOOFED: ' + os.path.basename(__filename__)) + sys.exit(0) + + # For any rendering calls (device == pdfwrite) call real ghostscript + if '-sDEVICE=pdfwrite' in sys.argv: + real_ghostscript(sys.argv) + return + + # Fail + print("ERROR: Ghost story archive not found") + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/tests/spoof/gs_render_failure.py b/tests/spoof/gs_render_failure.py new file mode 100755 index 00000000..b1ba58f8 --- /dev/null +++ b/tests/spoof/gs_render_failure.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +import sys +import os + +"""Replicate Ghostscript render failure while allowing rasterizing""" + + +def real_ghostscript(argv): + gs_args = ['gs'] + argv[1:] + os.execvp("gs", gs_args) + return # Not reachable + + +def main(): + if '--version' in sys.argv: + print('9.20') + print('SPOOFED: ' + os.path.basename(__filename__)) + sys.exit(0) + + # For any rasterize calls (device != pdfwrite) call real ghostscript + if '-sDEVICE=pdfwrite' not in sys.argv: + real_ghostscript(sys.argv) + return + + # Fail + print("ERROR: Casper is not a friendly ghost") + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/tests/test_main.py b/tests/test_main.py index b00852f3..88f10b58 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -51,6 +51,16 @@ def spoof_no_tess_pdfa_warning(): return spoof(tesseract='tesseract_noop.py', gs='gs_feature_elision.py') +@pytest.fixture +def spoof_no_tess_gs_render_fail(): + return spoof(tesseract='tesseract_noop.py', gs='gs_render_failure.py') + + +@pytest.fixture +def spoof_no_tess_gs_raster_fail(): + return spoof(tesseract='tesseract_noop.py', gs='gs_raster_failure.py') + + @pytest.fixture def spoof_qpdf_always_error(): return spoof(qpdf='qpdf_dummy_return2.py') @@ -843,4 +853,21 @@ def test_skip_big_with_no_images(spoof_tesseract_noop, resources, outpdf): check_ocrmypdf(resources / 'blank.pdf', outpdf, '--skip-big', '5', '--force-ocr', + env=spoof_tesseract_noop) + + +def test_gs_render_failure(spoof_no_tess_gs_render_fail, resources, outpdf): + p, out, err = run_ocrmypdf( + resources / 'blank.pdf', outpdf, + env=spoof_no_tess_gs_render_fail) + print(err) + assert p.returncode == ExitCode.child_process_error + + +def test_gs_raster_failure(spoof_no_tess_gs_raster_fail, resources, outpdf): + p, out, err = run_ocrmypdf( + resources / 'ccitt.pdf', outpdf, + env=spoof_no_tess_gs_raster_fail) + print(err) + assert p.returncode == ExitCode.child_process_error env=spoof_tesseract_noop) \ No newline at end of file From aa859a4139271e4f44c46894b6fcb42f5b61ddc1 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 1 May 2017 15:46:15 -0700 Subject: [PATCH 19/38] =?UTF-8?q?Fix=20#156=20-=20NoneType=20has=20no=20?= =?UTF-8?q?=E2=80=98getObject=E2=80=99=20for=20pages=20with=20no=20/Conten?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ocrmypdf/pageinfo.py | 2 +- tests/resources/README.rst | 3 +++ tests/resources/no_contents.pdf | Bin 0 -> 431 bytes tests/test_main.py | 4 ++++ tests/test_pageinfo.py | 8 ++++++++ 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 tests/resources/no_contents.pdf diff --git a/ocrmypdf/pageinfo.py b/ocrmypdf/pageinfo.py index f2ddb879..a7ddd147 100644 --- a/ocrmypdf/pageinfo.py +++ b/ocrmypdf/pageinfo.py @@ -430,7 +430,7 @@ def _find_images(pdf, container, shorthand=None): """ - if container.get('/Type') == '/Page': + if container.get('/Type') == '/Page' and '/Contents' in container: # For a /Page the content stream is attached to the page's /Contents page = container contentstream = pypdf.pdf.ContentStream(page.getContents(), pdf) diff --git a/tests/resources/README.rst b/tests/resources/README.rst index a321515d..12e05700 100644 --- a/tests/resources/README.rst +++ b/tests/resources/README.rst @@ -85,6 +85,9 @@ under the terms of the license in LICENSE.rst. * - overlay.pdf - @maxandersen - PDF file generated by PDFPen pro that triggered content stream parse errors + * - no_conentes.pdf + - @jbarlow83 + - synthetic PDF with a blank page that has no /Contents entry Assemblies ========== diff --git a/tests/resources/no_contents.pdf b/tests/resources/no_contents.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aa26d580df6dfc1fdb723d243c3b0f7fa225be82 GIT binary patch literal 431 zcmaixu};G<5QcX@#Vr|&?Id0u4YfNn(*DMjuy9sK}y&;Knjrv*uq)k0){Mf7fq&rG#-1OAwr$Ay4|AqG6d-|5t3nGQHE*4Xec5|4(%LxFSCx C4sV_S literal 0 HcmV?d00001 diff --git a/tests/test_main.py b/tests/test_main.py index 88f10b58..0c8daf9d 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -870,4 +870,8 @@ def test_gs_raster_failure(spoof_no_tess_gs_raster_fail, resources, outpdf): env=spoof_no_tess_gs_raster_fail) print(err) assert p.returncode == ExitCode.child_process_error + + +def test_no_contents(spoof_tesseract_noop, resources, outpdf): + check_ocrmypdf(resources / 'no_contents.pdf', outpdf, '--force-ocr', env=spoof_tesseract_noop) \ No newline at end of file diff --git a/tests/test_pageinfo.py b/tests/test_pageinfo.py index dcb4ab90..07c6d85b 100644 --- a/tests/test_pageinfo.py +++ b/tests/test_pageinfo.py @@ -108,3 +108,11 @@ def test_form_xobject(resources): pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename)) pdfimage = pdfinfo[0]['images'][0] assert pdfimage['width'] == 50 + + +def test_no_contents(resources): + filename = resources / 'no_contents.pdf' + + pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename)) + assert len(pdfinfo[0]['images']) == 0 + assert pdfinfo[0]['has_text'] == False \ No newline at end of file From fae2119b1ef16e1a10bbb083def90f1e13780709 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 1 May 2017 15:55:02 -0700 Subject: [PATCH 20/38] v4.5.6 release notes --- docs/release_notes.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/release_notes.rst b/docs/release_notes.rst index a9c0afc7..f8196c6c 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -4,11 +4,19 @@ Release notes OCRmyPDF uses `semantic versioning `_. +v4.5.6 +------ + +- Fixed issue #156, 'NoneType' object has no attribute 'getObject' on pages with no optional /Contents record. This should resolve all issues related to pages with no /Contents record. +- Fixed issue #158, ocrmypdf now stops and terminates if Ghostscript fails on an intermediate step, as it is not possible to proceed. +- Fixed issue #160, exception thrown on certain invalid arguments instead of error message + + v4.5.5 ------ - Automated update of macOS homebrew tap -- Fixed issue #154, KeyError '/Contents' when searching for text on blank pages that have no /Contents record +- Fixed issue #154, KeyError '/Contents' when searching for text on blank pages that have no /Contents record. Note: incomplete fix for this issue. v4.5.4 From e8cc8fc87989ff230e70f7c6718d87f369677091 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 1 May 2017 17:24:43 -0700 Subject: [PATCH 21/38] Add travis null_deploy for osx --- .travis.yml | 10 ++++++++++ .travis/null_deploy.sh | 3 +++ 2 files changed, 13 insertions(+) create mode 100755 .travis/null_deploy.sh diff --git a/.travis.yml b/.travis.yml index 80312f1c..ced5b41a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -74,6 +74,16 @@ deploy: condition: $TRAVIS_OS_NAME == "osx" skip_upload_docs: true + # null deploy for osx + # we really just want to run after_deploy *after* pypi upload is done, but + # after_deploy on runs if a given box deployed + provider: script + script: .travis/null_deploy.sh + on: + branch: master + tags: false + condition: "$TRAVIS_OS_NAME" == "osx" + after_deploy: | if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash .travis/osx_brew.sh diff --git a/.travis/null_deploy.sh b/.travis/null_deploy.sh new file mode 100755 index 00000000..c4f76591 --- /dev/null +++ b/.travis/null_deploy.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +exit 0 \ No newline at end of file From 1464b9087ac253ea46081ed3939de2d2f346960c Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 1 May 2017 17:37:59 -0700 Subject: [PATCH 22/38] Try Travis again with null deploy for OSX --- .travis.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ced5b41a..568d6689 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,12 @@ cache: - tests/cache - $HOME/Library/Caches/Homebrew +env: + global: + - secure: "oyX5xesoHD7qcDXKIxMyGZPi+H/WxcvfFkaviEmq84K1DDyHk48+9e92IKgrw8/lcTADnEo/AgVKfnhCPflFimk1xTkgaK4sUg1WLI2YjmaHcwl5SlBHa2rN3uGBwy1hyP92qyv/mMc9R59NtRJ8u76lbn6eN9wi7lkFWdE6BTw=" # DOCKERHUB_OCRMYPDF_TOKEN + - secure: "WlyII8YLsiUUyLtEA563GvEZmbneDb/T8q/P1uNbyQ2ps1U82tH0nSUV2CspSMxOFtZzPHCrRvnAmuTYKshBj+GNnBb1J9FKQmFwF+4NPeqsFdUkQ1NeeCmfIRShuNC3Otg2GGwj4Zssdg+QnVy43t2L11qizzfY+lY+MVzAYcM=" # DOCKERHUB_OCRMYPDF_TESS4_TOKEN + - secure: "hsf6MT+n2x3OiDM2fQyJZdV0/PWYmv81LdVqC6cfnHBE/8N3DloJRqQ7WfO14TxhiK9PEC7MpyCj0lSabUHEO7gSH6Vks6I1asoSkt8S9/bSMlhT4hei+pwVpeGEiU5xHVATNjY+D919VC3IFvc3XmjT74h/2SLhaZ+jhEmDggM=" # HOMEBREW_OCRMYPDF_TOKEN + matrix: include: - os: linux @@ -21,13 +27,9 @@ matrix: sudo: required language: python python: 3.6 - env: - - secure: "oyX5xesoHD7qcDXKIxMyGZPi+H/WxcvfFkaviEmq84K1DDyHk48+9e92IKgrw8/lcTADnEo/AgVKfnhCPflFimk1xTkgaK4sUg1WLI2YjmaHcwl5SlBHa2rN3uGBwy1hyP92qyv/mMc9R59NtRJ8u76lbn6eN9wi7lkFWdE6BTw=" # DOCKERHUB_OCRMYPDF_TOKEN - os: osx osx_image: xcode8 language: generic - env: - - secure: "hsf6MT+n2x3OiDM2fQyJZdV0/PWYmv81LdVqC6cfnHBE/8N3DloJRqQ7WfO14TxhiK9PEC7MpyCj0lSabUHEO7gSH6Vks6I1asoSkt8S9/bSMlhT4hei+pwVpeGEiU5xHVATNjY+D919VC3IFvc3XmjT74h/2SLhaZ+jhEmDggM=" # HOMEBREW_OCRMYPDF_TOKEN before_cache: - rm -f $HOME/.cache/pip/log/debug.log @@ -50,6 +52,10 @@ script: deploy: # release for main pypi + # 3.6 is considered the build leader and does the deploy, otherwise there is + # a race and all versions will try to deploy + # OTOH if we ever need separate binary wheels then each version needs its + # own deploy - provider: pypi user: ocrmypdf-travis password: @@ -77,16 +83,17 @@ deploy: # null deploy for osx # we really just want to run after_deploy *after* pypi upload is done, but # after_deploy on runs if a given box deployed - provider: script +- provider: script script: .travis/null_deploy.sh on: branch: master tags: false - condition: "$TRAVIS_OS_NAME" == "osx" + condition: $TRAVIS_OS_NAME == "osx" after_deploy: | if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash .travis/osx_brew.sh elif [[ "$TRAVIS_PYTHON_VERSION" == "3.6" && "$TRAVIS_OS_NAME" == "linux" ]]; then curl -H "Content-Type: application/json" --data '{"build": true}' -X POST https://registry.hub.docker.com/u/jbarlow83/ocrmypdf/trigger/$DOCKERHUB_OCRMYPDF_TOKEN/ + curl -H "Content-Type: application/json" --data '{"build": true}' -X POST https://registry.hub.docker.com/u/jbarlow83/ocrmypdf-tess4/trigger/$DOCKERHUB_OCRMYPDF_TESS4_TOKEN/ fi \ No newline at end of file From 93e802f473184deec68a39f91986c5a836da5d59 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 6 May 2017 22:27:25 -0700 Subject: [PATCH 23/38] Fix issue #163, color and grayscale images JPEG compressed when not needed --- ocrmypdf/exec/ghostscript.py | 4 ++++ ocrmypdf/pipeline.py | 2 ++ tests/resources/README.rst | 7 ++++++- tests/resources/baiona.png | Bin 0 -> 172560 bytes tests/resources/baiona_gray.png | Bin 0 -> 62490 bytes tests/test_main.py | 36 +++++++++++++++++++++++++++++++- 6 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/resources/baiona.png create mode 100644 tests/resources/baiona_gray.png diff --git a/ocrmypdf/exec/ghostscript.py b/ocrmypdf/exec/ghostscript.py index eb8eb451..8c87186a 100644 --- a/ocrmypdf/exec/ghostscript.py +++ b/ocrmypdf/exec/ghostscript.py @@ -77,6 +77,10 @@ def generate_pdfa(pdf_pages, output_file, log, threads=1): "-dAutoRotatePages=/None", "-sColorConversionStrategy=/RGB", "-sProcessColorModel=DeviceRGB", + "-dAutoFilterColorImages=false", + "-sColorImageFilter=", + "-dAutoFilterGrayImages=false", + "-sGrayImageFilter=", "-dJPEGQ=95", "-dPDFA=2", "-dPDFACompatibilityPolicy=1", diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index 6303b910..1ad88dd9 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -520,6 +520,8 @@ def select_visible_page_image( pageinfo = get_pageinfo(image, context) if pageinfo['images'] and \ all(im['enc'] == 'jpeg' for im in pageinfo['images']): + log.debug('{:4d}: JPEG input -> JPEG output'.format( + page_number(page_pdf))) # If all images were JPEGs originally, produce a JPEG as output im = Image.open(image) diff --git a/tests/resources/README.rst b/tests/resources/README.rst index 12e05700..29a803e8 100644 --- a/tests/resources/README.rst +++ b/tests/resources/README.rst @@ -34,6 +34,9 @@ In some cases they were converted from one image format to another without other * - typewriter.png, 2400dpi.pdf - `Wikimedia: Triumph typewrtier text Linzensoep`_ * Creative Commons BY-SA 2.5 + * - baiona.png + - `Wikimedia: Baionako udalerri mugakideak`_ + - Creative Commons BY-SA 4.0 Files generated for this project @@ -118,4 +121,6 @@ These test resources are assemblies from other previously mentioned files, relea .. _`Linux (Wikipedia Article)`: https://de.wikipedia.org/wiki/Linux -.. _`Wikimedia: Triumph typewrtier text Linzensoep`: https://commons.wikimedia.org/wiki/File:Triumph.typewriter_text_Linzensoep.gif \ No newline at end of file +.. _`Wikimedia: Triumph typewrtier text Linzensoep`: https://commons.wikimedia.org/wiki/File:Triumph.typewriter_text_Linzensoep.gif + +.. _`Wikimedia: Baionako udalerri mugakideak`: https://commons.wikimedia.org/wiki/File:Baionako_udalerri_mugakideak.png \ No newline at end of file diff --git a/tests/resources/baiona.png b/tests/resources/baiona.png new file mode 100644 index 0000000000000000000000000000000000000000..02318fc0b1afd225feeb4f773a65a38fbc3c83af GIT binary patch literal 172560 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

$KVWY_BIM70gt(Ms_KuE&w6IRIV9OSC zzx_C}$r2cl0P#I9A#L2aBTkV}S@t$*G3T?wf7aSi>y*m`Saf9)#zj-s7(2JGSfRt) zj07&vS0ZiSGQ8il3_)%tJSv!sZ<4Qrn}?_4$4&sPPfG~&z^ikjF)P`ZvkV^Y%2a-e zEx7yFU*Pf8OGxZ)z+T^2NN$^l)TuLYGG}?rW((TdtgzYm;PX|G%L7>T^uK;+u(0>< z&EUUq6MT3U>=->4{?V}zdwN15lR?BjxhZ$P;DC(}9{Y3`2sp={0%Ui{rz1q>=%Cp zBxSN9oIGOh!r*`goQw0@@aS(fjQkxwJ}JfcBkUih9vwvZ9-WrLdG%5V7Z-*GTuvYZ z0CjW*wF;80OQ5sz;5ltBB+|YGnYA!wZ8odm?%w~-r@!d#Hn97-!DQ;<)*8C-Z;-`i z*U}#m_R9w_^M%k}{}j?EPIN-YW=BwDBs4J@sN1s}S?%Sh-Mt+hA&g)$!qD4!9|+R3 zMn<5P?rlehzJ~y^{ehkW+>jHD0O@`Y;UJk1lcE{v*s>INm41yNo(T`QPsH~r*McWu zqiZLTKLT|C?K(5oS9Zf&?2e2O=@A_aXn$C8GFs$`Xe!)`;T@Ie*s~SY;sD4KQ<&VJ z92Q8KL7JMB@bU^|?N7%(2j&Pu!Iq0ZeG3`2xu}d8iIMZ(M8fDX2u)2#P+S81BBJ0M z8V+B12z-NrIZK?cpC1>b-P=pXS(POoB8V74qm+A8jWi%QaHDSZ$QvEszmbe|cXpw5 z;rj^EDp5V^93)Mg+;bf#fVB@Oo59=gCNM<>RI+`h^MDz19RlmZX$6v+rF&`Gw;D=~ z<*?*WV7DMkR{;;3fs65XG%28;pOGlXI~NSc^n_ptTxH6VzGoZLf1Nr!-1wx8>?#|`t@@JSdA!7oraX@ zGo9CYG7_0Gas(uIJ%@dMaTwNJ2h+#Tp?Ldt>biSQIvA8EILeP=I6BHe3bajYfkLxC zWgyvyOlB*}ep!O^b}T>?--Ko1Q?Yi$4X}#6*nOQ;{sTZAfs&Qs$=_@7)}|(Cj*<(M z>MwiB6iEK>W$cirAzG_|&lk^O&(iOq(;M0Ej@D%i4#>*p;o*i4Kl~6&maO0$L;4Gn zm$up(gcWashF#A%b`E4-WNEc>8?Cwf_tqOOsCOd^u48i!*kH7?9npFv)B-W0Mvi7m z-I?{vu2o$O_$eG&KZ@L8PaMY-j4QtA=>(D(vi$v+*M>)at3fN%IY*lIjW;wP!BBrp zDI>>@D~Cnl!;3~BGlV?FT^MR`5x@aL7!;0rNhmxFDkuwf_Ut`6DE8l`O`Bje4t^&{ z;b17x^k09i!M=UPPV8__4^aJU^#&Aw`5_XTi&5?$gQy$tg%|74omy9{)6bkV3F5n7 z#6GV`WGafGdgCEfy&g`o**1r{bU-{rO9 zp7;7o7<79uSTUfoXJ}#wW^+@2ZN#*+&VT6Z=9QrP_O=lNps=E!9@TE zh+w%K9w|BSatEXhg|J$W?QvIGS%r>{4vZR=!L9!pT<~Br>G9x$58%^JzhvL{69^Zm z`{H5muRkMh+ft}`eCXy}hxl~zSRI6pja@Ts;zWq=e;s>#<1nnV9Br>Zh~k~Q7zsIe zJq(eO5Sfru%DtfA)MR}l(E0U6MG$`bKcv`HoCAWv^NsqmTE!pS5*J?!E^0%?|&F9hHcA^7D z+u`r;i{#{Zw6rLp(NG@lzJtnIS5XD&-@kA~T{Puf1c!$Wj=b~(R(Aio9a|tUm?28e zf`2fjrgYLc(n>Bi;EA`o3{CV-{kkpx1fdoks>Q{T2cyU^ZF84LQ}9xOISwAQRd zTzdtoy~E)(b{bChQg&+3I;|FdO=X~X-I9bfNF);OS)Bv+ZfZ)Hva11TiF2bE_F*&F zZdZQs(*e|GbtW6$T;GUiSJ$J1>6oLDKhj~%LVxU*Cd24<@F4X-oShoVIebt)Ul)cp zTm$yydx;MWzRcsCFTf~A(YkdA{`)6%gO9p%??ls0FQC{r8mY=Mge`aidtP`L zm4$^E7wwBrFHPXm%fjJmesd4L)O8i{tNC8FlyMN<$vFETMFgOsyAAA-C z)31k?l|6ggVwAr67#iy84|?{&#<+1~aM@*-!)WaL8eDpoPGu|j8&`lt$aYGr}SsBeCF-)O5xs5C8fM~O0##ishz9+LUgWFDA7<^FMq`c!V{#B1x z*EK+6v>uWC9k^cE;ihzC8H@3gaxwnAUF7eSfXfT`I3N&vK(}!jg0xLgXU&9v+|e?E z*x~N3hgf{#I5({Wr1V!Rl^$oFISBy)Oo9K`l{X_BB^%bk_lGwiV7*$?xpyG_taFY! z@^vOieFjEFp~WX0T}8Rb=&VLfSsC;(sa!fadOu{bqtr{Jph;2Fc5zl9qC8Ace*6mJ z6=leaACF=8JcgvvW1vYKiLwq2yj!Y}*j$8~?VHhL<-;!~784SJxcGf~iw%|S2AHhm zyy3iuB@)=CGh=J58X~?M+I1GJDOcgoG8LECIKZ8D#Hq_8fC#=^9)Zb|&w$CKMqpqc7p60rDO$4%v75h#O6(1vTOLP1SQtBS za@!IS=enI+5wPJ$ba)0qeBn(T(RNz7>`eatUJ8We1GK`WWfU;+Qkwp79CzWA1hs#q z+KhRtYVpZ-1CoQR zil+KH)K!(Ev8)Kn;yknz?SY9eg0~+DN8n&IdPJ_pDba)qCbOrc)D`c|&_F`O8d@YSlXn6Z+q;*tdchVGO-u)A02LZX3@!?-a#3agESrBu*qX1P z^6&=#wr3EVn#Og~0U@FA8#5W@(onS3RB@zIkhcMQORIs1q$^5L zlD`+4umt#rhB>WFhXcKTJtNhCh<&R1L;&eGU0vO%`{-4~D66n9c`}mcUIU@<RkIwpPD9ejbwR1Cy*8h(D-yMCbTZ*#gc0^7)@1MAtE*w8x1n@XO>i~1NZ$o6mE>yL40hyEG7eFKMgVEX9$woIF ztn(Yh-t91;hHWsISvkGY+Skf#;XNOqCh*eq!Fk%w&81eFMEJbQ_5t=vug;I?Tfr%*?9UFi%61};A%q6XQZv79D zH)nt@L%e{dn&~@Tx3a^4{3b0%MtCCVA4?#(_;(?x8E6iOg>vsMWVe^2Vdvja_(dW( zF8-LE%)nvi2%z0g1hBJ@1dxy74Qmm+@)LBs3*mmOF*Z zH={V~45T_Ugb`VLn(M$TU>)&D9k7ShUf88Td=@)+vZuaX7zjvaN|ieN-->FiEa~Lh z+0oislD-a^x=K`wLs2J^bLldV1|nuTZM$Jx{uU~ieuBpVh3Eciz0Qc2j zK={`ekZxQAznwoJtoSd))@?^ja~?t!MF?!KfLCWd1l>y3acRNE!7z(uFnP#X)}8(+KLBEiwe8QeTh6_9}Q5ZAE!uF}i%^h>wfHw0Iw6$R%8S!P-tEN8AQOr_v>BIt?gR z=rJN($_20P1qEgfV$a?Yo{ajU0%UepF(SMj^?V-$C8mNu2y#j?P+VMvy?aX`k+>l= zG>GjzGGU_jL!p8i7k!Ahn!PAWnS|79Z{^7L$p$@(s<|1`m7hasGr;}g+aZrnWJjDx z0P8EktNjs3VFQuP?3pvJ0K((gK^Fl$)j+bG+o-|4E2^-*vg?=wKcU@>G<`J`LO<-4 zB*4sbKMGmoaqFAMHf_KIrJrDYdoIG&bqLlr!$;o%p-IO@D(JBD(Fh6Zg@I@fNT?c2BGn{U3s<(JRK`0>L}sO5kfy+YB( zNT>)ln;DUjo)9`SMbs$*ss{@FQSkWf7+13mxzRaDdgU_&201Zb>T!TV((L(V1;igc zfdpeG*M|$3o+DjHqhMo?$Y|L2swY3I)fv1m~s zkwbgIZOFKAE_{7_pimp|;g)86x?RCd3m+-F$MJ&V=S_(A!p9fKBR=4e{K~9jDc-pg z&2K%4u`PR1BlLmtvIjBt@~a^dk|T`s-Vd#rd+DXO@zz@l@b%YkVb-ka?D|Iz-$dt^ z?A`_AQ`aHXrbgXe?_k8)=N!~zbFw5$tp*s}gs_k-91%Q7 zh3=Tt@E7LQeuYFgHMRu|M`!93_ymQ(J4g<%fM5uuUVzAhF-s5d#UAkR@ZdbwDTS(w z)SW!IEP%%ecXxM$r(~hYHwLYRxyb4&LBsCNP|Cs(5S@TOR;^;>%ZT&Nn|8wU@lwO5 zf!@4%FJslJ)tEhdGQ{Hkr35e(e)6ymcekE!#>#qoef+6xyQ3XlC7E}}zLE{^O@aRZPj`P8=Pzlr~E4OBkVh)nrI1}`I^(qsJm3j;hJ9s*n z${83I#;t!WDyu@0vJ8Ua9VpiE;FprolVjUC?}?sk`SRbfXU{&|cH7km4L!Q!iP>sH z(HHL{tzs(*gHjNG<2{f_PwaZpBY~#lb}#(_QAL|k;v0*wi>`r(#EIEC*!6iEer6+) ztzaSul*Is(uK}w7$8i@<8T?V&iTi)4L1ByTsN|2ld-osZaiLz0HtkEqEzwVc^IF&8 z(b{hiZSO)}%2|khCg0O!!B}!6zgfK7qmT@$-k5mlsF=XbF|Gb&U)C zgNpz<0VKpBiD_t)C!?WY53*Fn=-#st_2OW3!5zuTkw{6Q{I4eiJbd=qLhRdDgo`ge z8$Ld??rCTcpA!L^Dl6Ky726pUmw6+^Lo1FAJ< zNF!sB5fz9T2|ipJy6O%Cmxq`m06kZ621w6WwHr83WFmoqhmb(Oz#zD1j6z{uGh&*H zAt~O8B4szcQnR_v!WlAaHkMgir=X>z8bTjgIHe&93 z8xc&8xo~R0WqWlZGAGYO(31IN4Dk8x@b&dUYim2( z`WO86R0q|0M|%fazkCbvnr7t5GZ1z0wGa!2W*}RdTI6xlYc?eK2_fP0Sbxh$fUgX3 z;lc3t^QN=7bNdcv@giF9cmvx*GZCXzAbIg?D0u1)6f%M=6T0EP$>I3! zsw7;N9S9G`kZn%3kWvTqSGfweF0H`6=7R&1)3ZlLMe-^OZy5dtp%uaRv6sf+xbA|NTHr6UV-TXE-4m7Mkc=$1bq!l=aL z?p#LXy4c@Gm-9$pDW02=f-BnAVd9@J!B$}P8GNappy}so{i{v zUt>$^1qigL5x3%h*zw*Q=<3!ScPBOwP%J>XJP>BHg$rl#Ujj{M?pyjj(yOCNO*Yx_RPK=N}(6VRQ?V3 zmv6_$H(x|cQwy>}z3|=zarp3}IAn)X`UmHNrh|9Xsc|>!nDQE_P3-S%sEmPu0T_AT zlPH>VJ34t{&g2Z$yjO4}!>ewr}9Faaa%mwCMqw@ue(;d=GY87XcjVpys4C z+wl7O20Z?IE!vNf+KmutQecF(1YLYjbh%S5@gvJpMyL>eXA zp%LL2bI&6%-1|RlmuDbMqr|Y)pP=ZeJ5liWW=1@Dn42AhFXkpN5-4@LC6GuU1&+S& z=V~r2#i1n7+gpa5+wMcdr4OK;FGWuATGYJu2qS@I?8OeO{a7qk=yX4A z^_#43(;G_H-wT)sMOU{Pl^?u<%$l9Zm!~4?uBQ+X6mUeV&rkvp zzt`3`VpjtN4hKd?$hf?|&f_3q?B+s0MLX91g%6!B$6{D!63~mV- z@ZlQG;FA$j43ziO&CL_t-R-RNJN;t;lHqLk;_nc-Y5{Zt5%kwSfz)y1SalD5>nD3% zsA@Oj4K|AJ)LS?S86PdfoD^Tj2~LF_UOqmM=Zu3QECmhC3WT*(Agp2+D)#21%fknf z&`7KchcgR!I(dZS5j*@+hpq8U$?=H0Z zgd-q2mUEox3#i=Nw&g*swm>Wf0t0Db+u=dvr(o?G$p8ErDmMY7H#`hEx2|dM+iG7x zGYCrdo)q7_k3dT&jA!472nqo1r1DW+{k3*8=D+?5{6ozcogN2~EC9=LYtf-~!?0oL zE)qBdKy8QKmC0&HL9-Ss3fnP%V-uH&$IQqd9X}Ed_4d`fiDBmP57>7wMnw4IsqqmI z|ME6cHhje0ym->B$hz|d`1&6^HQUAyp1~I@*JJ(q1GhE=Pf5kVcv~C0=4<$&K+F9V zlC;EU-_HlZ**Pe%O2Dhwhcrboiu3ou7?ljakkBKJ zxSRz}Ntnz`X-lC{G{etN0zQ9eIzc!C)InD4W%c|1JVY5gkw5%gjJV-8ZvES-08-pv z?NVYHQ{?pS=)ajszL*?G4j_X8hcz%XE&;+(Q?OU(2Dhe4q$}k|uM7Za_NFZ4;LXuO^8j^^*y?c;UAaC zmHlX-I_&P&;Ngd#!?I<|ao%}T;qQO=oY-`(s!NT!Pv1a7QwfTaCn4_g8{i>6^0e5A z2FbUgv>38Kz64L~3EAa$!aHz(Kxj zK~(8aybTY|JKq7CS)sBW4pBK%Fl9T|#F8aHvG44TgMZ7D20IgJeco22sT)uk7>~H??}n#Ta!O47 z(tByun6aFV<|%{&fu)d1!72MT?$`s?;#~SHYVY< zyLTeMtVOjr0B+vCFqllx8%@v|jL>LxT=pLdb<^0;h?=Tul$VsDhz*MJckRZmE!(hT z!zS!p`xkcoxeB>|tVG_*<;eee2?|$ykMG}p2XTHKm^Chh=?Y5H&o)LlqQj(^nk~e# zrN6*ta|MDvQ6SOomG34-`j+l(HZ*mcIPGvWPhWzsRgE#~0!&ip zb0qLs-o6v#g7MtAP*}fu5}AL0%&iaHJN^GKAG!bJd` z49c{TnVF19lSXhMSP0aC2;JR~Ir}Ww?|ucvzEQ|%D~IK+hq3$DUwRh%4_*VZSj_nR z^Uv_hFTcXbI*P%(*U5&_Y=pU{l#O&*y(bMvL_+*gI{cvq9!CIcI*goUjHE)y2w;Sd zlS6zQ0aQ;Sfjd%1k3rhAZ=>kE|3ia^FUBhNVe+!4ae4Lkcyfdg!^6Eeh3`yWM9;gs zL4*5$sqP68({rE)R2vDIS%`l473_$efKYQcVt;xIyFULA-Q9Hl;Z>QL$-|F7{=yA> zF1zeJ);^CMESZQ@(_bqQ!pK!sL^cw}Ph@+Cmh4dGA(Zch2m7vXZ$shBk73WlH=*d^ z8&UbtwWxdOYBW836_jl2c;qT{KXw&#k6#7T6Ia3ZM97Hxf&kNUkBMsH^TeX zTj2M`?Ff47E`+`Fe=z;<5kmYab>t!S$=-E%uo!x+nyX6}1{b~Ui_$gzUEPf*ey_zv zUzgy9AItImo>opr(DW~nzGJQRBcc~%?!d(EJoqsZSm+Uh4tLguISq4ojEN4!qa%Z0 z{q{v+3F~NzL(@<{^JZ-J%)*ia6_gsIQ$1v9EHpe!ijOXeM`oz>-_Oj- zrD$wI@%(3zvFBHq-1sP(a5;wE{V2EG;y|)b^;uKXi2Lt3K`@ z_rfsmI)rJJXt?7|WLp5e9cY4=;aK zf_Bj)y#B^KcB6mSp$h{C*MfT5k(Ran{3b0{mvv%Qsfr8E-ley4-uTC|@*NHi0@#Ug zlM+?pP;|K;J-ic5`#v)!1n%EFiOhXV(FQSU&wdzVZ+?VJ;WjW7W63i=pn#@;@0f&R zuN)-w{HEtG9Qs>E!k%F)EPd`XxHxblK6tOkB9}fF&s?0szR+61_pr9dOvjx^yAQf< z5T@OA2PXAglpIUmV?Q|ZHTR!$5V+$wxV(qrfNLD{*-j8#1kmYFGu?QMczaBdSMAM5 z-8;`L$oMX}Z$6BW$D5hzl>g3Awoii~#ZEvz|Hx@SEKV+_|iZvkDU#3iB3X)y--D&Y^pPKy|8UQJ`w& zQh5COITE`X(Jb;p?U?gWG2&wU*yO?G8RgF9{yl!sbLT{O;>~knFe*~^ujeMR)~ZmV zV8J^`T)zkcy9Grf&O!1$PeM*<<$B&Xt;ema>tcURyVMX2^v@Q7pX?ZKrZswtJ+yw|=&&!QA8KL7gcQ%N0 z7qE>F8{hHW#_eN&_w47f^8`ZLggu+%yO3=bs|}Ao`V6uID{;%kagcbpb5p<@cDLfg zUkrHSg;$WBoi-%u<#YhOTY`>}z9NMVtIAZ^S+B;qiAcCOTO`cMuW=8tqU9$Cgn)*!LUQ> z=?VYgqp`2c0?*n4MAz>_erYw_;!@!g5WrnSr6Mmu8SA)&2n+M(mS-FeL@1l;8em!U z7G#=MG|#>Xsncg3wWB;y;H-YiRun8*1ly<2Bcoy)x_JWB=A4Dpd*>l);&cSCdI-wS zL15-c1f>r{P+As(Q!*e=N`pKx86okB2#t$JSWGO!qN5nGjbKDM6hZP}_y_vK*Uy*B zFD+$*Pnk@H#H2(lT~&e&n@dpJti{R=jreuF7T4VM0H#bCb3_vDLf=5LN$p#2wxLw1 z$M2<`T-?65HZ|e5;trIx8vY66LQ5m){Qkh-(v28nGxY8vn3${_`17M(YIIZ}9!Zx# z{4E;*6#tA?kw2O*d%>G7ytGJbW`uZ#YQ9Ju~)Er++`5Misauv!md}JL`xH; zzH(lN@5VIARaae(_uhLCzP^X|fIJ;wGMV63mIomtBHaAGaiw zfr?JVkJ7T8Oi&%V@$5)rigNf1@1ykc$5HJOfZ>h#uzvnL?oa38shQD`3MqYD&yS81 zG}X12k&oM!R$@op!5KpcWP$Qxgk>BfC5@Loj26Bp#ufjGy65jkdH!CmE-CP{mzOWp zY9&+Jq9e)z4cBV^`W+!nMQ9CV1BY4Xp7g-aL`uz8JNB$!hr%cCK;pvZkPLpB<;_HJy*!9G({6YF4pj4YV!pCQ_KM?Vw z*nCO)T1@WV!w6s#1nh5iSI5C)V03g49?6hEvfw`Cl>UqccOSH0{R+lich5o)(Mi8aKGiT zf6q49a1lT!Vcoj5_~Vb&tg|7jL*E)5DO*bJKm6V&kU!~4Slork*|iL1^PfR|6&sqc zPQV$UxLqQVfXjZM(dbW0B~HrKpwS?-s{uOpci`|b@Hp;K>xqS#u@;*4IS@V`d@d#2 zP~hw&uau=@!nHR-bM51(5cy(6&33eXJs(#l3-Rdm2#&BiOT4HvB!>`6X1|N`4(>V7 z1CnDglj{+eU4!;(pF)jCAaYvvq5buTux{xxELr*+N=gdg?=LxG>^hPgWpfKGYk%Uh zo;4+pLvZBDO#4Pm!3|9{HQ4t48*qF59^_Q~jZTpaJ0@I-;O7@$^u==_^JJwRq;^ct zE|Ym;cA^jNxe&POA|Om+W=#2H)yb&|5?7KhdP_w5R+V<*k(D(#_lsiO{Zkc|>}`XB zkv z8TlK2;k73x=3`qcl-%09gGo~Fwtvd?$WSUsLd3>~BOt(+>zMiqQnoZDJMN)*C_Cp)bht|}Jogt=ym&uH0?86^ydcFwqkUQv z)!nV@SNTpI@X*3KO;KATnglZNqZ2s=e5!!nk-=g^CnJCdmOIu@%%x@(Yy3;*2$ss zY%T)m1eBGPp|i6CSy{<&Ka%_JQ9#OE>LEtXjd!5s`e#t(5y%?jHk7^fER>2?u46bp z@L(|Lv1iX7w6%5g>^t4SLvvm(MBN?WMJ6IVF@fznwK^<~(FT=)5x|~KfjW|e01wWg zWoW?;fx8=qUvw!dhs}YE5t86-zo4$55VwyH!@Uzj*m38PRw9A<%{ngb8F@(`js#LX z=wY*F!|Tzv@q;88e>4~nCA2|q*TQI~I{kOMr0aC4)evo84S$;z+L1F5m6^$ooLIS` z_HDDfp)5ZiJD#~8As;=A%;rK=NPHQ5Rl4pnmLl(YA33Hqs1e&y;Jyx{ZuV z9fIN|SW?{ceTbrMG`RcjyYSUl->`xFAX^Vk0w{)?xTX+Z?7KBQ z4qiS(D}e8@!Q%qDcIn9i=y=yO^BXKXnWOL{gX&hq1}*THgH{?v8Qajj=zZu^ow$E; zI4;c!=y?j~fI3bJjdAaaYHXPsX!H&;Afcp8{F?!buF3@sr&bbgh z^)W`@bSLMqapKb$G72G&VyuGI7ZE@M>#kJPWgVvC|6?E#a*#e&J!Tv78a4PfSJ@M* zubA8Zx1ouXQ?lsO0LEFQkEVJ>HZzj-wHT|}2dP!h?dwHfhh3E0_j=!U#C-oK(wlam z!YdZm+ulLO%=1nP`J*Y*^#wsl

iaNyL(rYw_L(2NETkR#hTsfKC#JuCHrVlFP4? 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

    J@A^k2rAw7}DG`~;y_3f5M1 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 literal 0 HcmV?d00001 diff --git a/tests/resources/baiona_gray.png b/tests/resources/baiona_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..0aed0204498c2d2acfba9a3771ae068948fa423b GIT binary patch literal 62490 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 tGBdF^b8_}J;^OBu Date: Sat, 6 May 2017 22:28:34 -0700 Subject: [PATCH 24/38] =?UTF-8?q?Fix=20corrupt=20test=20file=20=E2=80=9Cty?= =?UTF-8?q?pewriter.png=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This file is not currently used in any tests, but could be, so replace corrupt version with a useful one. --- tests/resources/typewriter.png | Bin 122486 -> 122486 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/resources/typewriter.png b/tests/resources/typewriter.png index 28331b67651fb098e1cea4738bded05707a6e48d..e97cf288d1244568cfa2cb8090c87c7253e3809f 100644 GIT binary patch delta 114 zcmeyihyB|g_6fyY_qaG2)RkBNaz5NxyS0{a(cN%!T?12H1LF`w6Dw0wD-he<%D~|E z90w%^1_sp<*NBpo#FA92-29Zxv`Pje149#CLjzp{%Mb$tD`QJ5W2gq%@c##Z8W=oX L{an^LB{Ts5q!A+x delta 114 zcmeyihyB|g_6fyY4|q8EjSO?u(swo1ZmnfpbT`~g*U(7Uz#_!Z)XLP*%FqPJwlXk? z|9bZ#0|SFRc?MtW?ChKk%1wy1_LV-ONfRSv5DV-8W=oX{an^LB{Ts5 DrX?fX From fd27df2abb57ea7c7c0f0bdcbc5fb8d28803e1f7 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 6 May 2017 22:33:24 -0700 Subject: [PATCH 25/38] Update documentation to warn that transparency is not tested --- docs/introduction.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/introduction.rst b/docs/introduction.rst index 4ba9a59c..9dc7011d 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -78,6 +78,7 @@ OCRmyPDF is limited by the Tesseract OCR engine. As such it experiences these l * If a document contains languages outside of those given in the ``-l LANG`` arguments, results may be poor. * It is not always good at analyzing the natural reading order of documents. For example, it may fail to recognize that a document contains two columns and join text across the columns. * Poor quality scans may produce poor quality OCR. Garbage in, garbage out. +* PDFs that use transparent layers are not currently checked in the test suite, so they may not work correctly. OCRmyPDF is also limited by the PDF specification: @@ -86,6 +87,7 @@ OCRmyPDF is also limited by the PDF specification: Ghostscript also imposes some limitations: * PDFs containing JBIG2-encoded content will be converted to CCITT Group4 encoding, which has lower compression ratios, if Ghostscript PDF/A is enabled. +* PDFs containing JPEG 2000-encoded content will be converted to JPEG encoding, which may introduce compression artifacts, if Ghostscript PDF/A is enabled. OCRmyPDF is currently not designed to be used as a Python API; it is designed to be run as a command line tool. ``import ocrmypf`` currently attempts to process the command line on ``sys.argv`` at import time so it has side effects that will interfere with its use as a package. The API it presents should not be considered stable. @@ -93,7 +95,7 @@ OCRmyPDF is currently not designed to be used as a Python API; it is designed to Similar programs ---------------- -To the author's knowledge, OCRmyPDF is the most feature-rich and thoroughly tested command line OCR PDF conversion tool. If it doesn't meet your needs, consider of these similar open source programs: +To the author's knowledge, OCRmyPDF is the most feature-rich and thoroughly tested command line OCR PDF conversion tool. If it does not meet your needs, contributions and suggestions are welcome. If not, consider one of these similar open source programs: * pdf2pdfocr * pdfsandwich From c97ea1f2a98f81b266dbb4a78014c1be63b4c9b3 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 6 May 2017 22:34:01 -0700 Subject: [PATCH 26/38] Update high DPI test case to confirm the output image is not downsampled --- tests/test_main.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index 3cc87335..e38e6217 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -749,6 +749,11 @@ def test_very_high_dpi(spoof_tesseract_cache, resources, outpdf): "Checks for a Decimal quantize error with high DPI, etc" check_ocrmypdf(resources / '2400dpi.pdf', outpdf, env=spoof_tesseract_cache) + pdfinfo = pdf_get_all_pageinfo(outpdf) + + image = pdfinfo[0]['images'][0] + assert image['dpi_w'] == image['dpi_h'] + assert image['dpi_w'] == 2400 def test_overlay(spoof_tesseract_noop, resources, outpdf): From d077c03686981c1601305cac2eb7b97e7f823a34 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 6 May 2017 22:34:54 -0700 Subject: [PATCH 27/38] v4.5.7 release notes --- docs/release_notes.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/release_notes.rst b/docs/release_notes.rst index f8196c6c..c8289177 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -4,6 +4,12 @@ Release notes OCRmyPDF uses `semantic versioning `_. +v4.5.7 +------ + +- Fixed issue #163, color and grayscale images were unnecessarily changed from lossless to lossy JPEG compression when using ``--output-type pdfa`` on recent versions of Ghostscript + + v4.5.6 ------ @@ -52,7 +58,7 @@ v4.5.1 v4.5 ---- -- Exotic PDFs containing "Form XObjects" are now supported (issue #134; PDF reference manual 8.10), and images they contain are taken into account when determining the resolution for rasterizing +- Uncommon PDFs containing "Form XObjects" are now supported (issue #134; PDF reference manual 8.10), and images they contain are taken into account when determining the resolution for rasterizing - The Tesseract 4 Docker image no longer includes all languages, because it took so long to build something would tend to fail - OCRmyPDF now warns about using ``--pdf-renderer tesseract`` with Tesseract 3.04 or lower due to issues with Ghostscript corrupting the OCR text in these cases From 63a4a761dd47e9b8c86074545c6846377f1a74d6 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 8 May 2017 14:37:48 -0700 Subject: [PATCH 28/38] Revert "v4.5.7 release notes" The change introduced regressions, so find another way to fix. This reverts commit d077c03686981c1601305cac2eb7b97e7f823a34. [ci skip] --- docs/release_notes.rst | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/release_notes.rst b/docs/release_notes.rst index c8289177..f8196c6c 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -4,12 +4,6 @@ Release notes OCRmyPDF uses `semantic versioning `_. -v4.5.7 ------- - -- Fixed issue #163, color and grayscale images were unnecessarily changed from lossless to lossy JPEG compression when using ``--output-type pdfa`` on recent versions of Ghostscript - - v4.5.6 ------ @@ -58,7 +52,7 @@ v4.5.1 v4.5 ---- -- Uncommon PDFs containing "Form XObjects" are now supported (issue #134; PDF reference manual 8.10), and images they contain are taken into account when determining the resolution for rasterizing +- Exotic PDFs containing "Form XObjects" are now supported (issue #134; PDF reference manual 8.10), and images they contain are taken into account when determining the resolution for rasterizing - The Tesseract 4 Docker image no longer includes all languages, because it took so long to build something would tend to fail - OCRmyPDF now warns about using ``--pdf-renderer tesseract`` with Tesseract 3.04 or lower due to issues with Ghostscript corrupting the OCR text in these cases From c4f01de231d22da5cea02c25aa581a965a37640b Mon Sep 17 00:00:00 2001 From: Ingo Feinerer Date: Wed, 10 May 2017 01:22:10 +0200 Subject: [PATCH 29/38] Fix typo "cutput" -> "output" (#164) [ci skip] --- ocrmypdf/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 2ff469c9..878a1892 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -596,7 +596,7 @@ def run_pipeline(): return ExitCode.bad_args elif not is_file_writable(options.output_file): _log.error(textwrap.dedent("""\ - Cutput file location is not writable.""")) + Output file location is not writable.""")) return ExitCode.file_access_error manager = JobContextManager() From 01a1c2b57642ab8e687e3b187251f18ba5302e41 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 9 May 2017 16:37:29 -0700 Subject: [PATCH 30/38] =?UTF-8?q?Implement=20=E2=80=94pdfa-image-compressi?= =?UTF-8?q?on=20to=20control=20Ghostscript=E2=80=99s=20compression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #163 --- ocrmypdf/__main__.py | 18 ++++++++++ ocrmypdf/exec/ghostscript.py | 30 ++++++++++++---- ocrmypdf/pipeline.py | 6 ++-- tests/test_main.py | 67 ++++++++++++++++++++++++++++++++---- 4 files changed, 106 insertions(+), 15 deletions(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 2ff469c9..a7463e20 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -242,6 +242,18 @@ advanced.add_argument( '--rotate-pages-threshold', default=14.0, type=float, metavar='CONFIDENCE', help="only rotate pages when confidence is above this value (arbitrary " "units reported by tesseract)") +advanced.add_argument( + '--pdfa-image-compression', choices=['auto', 'jpeg', 'lossless'], + default='auto', + help="specify how to compress images in the output PDF/A. 'auto' lets " + "OCRmyPDF decide. 'jpeg' changes all grayscale and color images to " + "JPEG compression. 'lossless' uses PNG-style lossless compression " + "for all images. Monochrome images are always compressed using a " + "lossless codec. In 'auto' mode OCRmyPDF lets Ghostscript's auto " + "filter decide how to compress the image. Compression settings " + "are applied to all pages, including those for which OCR was " + "skipped. Not supported for --output-type=pdf ; that setting " + "preserves the original compression of all images.") debugging = parser.add_argument_group( "Debugging", @@ -346,6 +358,12 @@ def check_options_advanced(options, log): raise MissingDependencyError( "--pdf-renderer tess4 requires Tesseract 4.x " "commit 3d9fb3b or later") + if options.pdfa_image_compression != 'auto' and \ + options.output_type != 'pdfa': + log.warning( + "--pdfa-image-compression argument has no effect when " + "--output-type is not 'pdfa'" + ) def check_options_metadata(options, log): diff --git a/ocrmypdf/exec/ghostscript.py b/ocrmypdf/exec/ghostscript.py index 8c87186a..b77adea8 100644 --- a/ocrmypdf/exec/ghostscript.py +++ b/ocrmypdf/exec/ghostscript.py @@ -65,7 +65,28 @@ def rasterize_pdf(input_file, output_file, xres, yres, raster_device, log, raise SubprocessOutputError() -def generate_pdfa(pdf_pages, output_file, log, threads=1): +def generate_pdfa(pdf_pages, output_file, compression, log, threads=1): + compression_args = [] + if compression == 'jpeg': + compression_args = [ + "-dAutoFilterColorImages=false", + "-dColorImageFilter=/DCTEncode", + "-dAutoFilterGrayImages=false", + "-dGrayImageFilter=/DCTEncode", + ] + elif compression == 'lossless': + compression_args = [ + "-dAutoFilterColorImages=false", + "-dColorImageFilter=/FlateEncode", + "-dAutoFilterGrayImages=false", + "-dGrayImageFilter=/FlateEncode", + ] + else: + compression_args = [ + "-dAutoFilterColorImages=true", + "-dAutoFilterGrayImages=true", + ] + with NamedTemporaryFile(delete=True) as gs_pdf: args_gs = [ get_program("gs"), @@ -76,11 +97,8 @@ def generate_pdfa(pdf_pages, output_file, log, threads=1): "-sDEVICE=pdfwrite", "-dAutoRotatePages=/None", "-sColorConversionStrategy=/RGB", - "-sProcessColorModel=DeviceRGB", - "-dAutoFilterColorImages=false", - "-sColorImageFilter=", - "-dAutoFilterGrayImages=false", - "-sGrayImageFilter=", + "-sProcessColorModel=DeviceRGB" + ] + compression_args + [ "-dJPEGQ=95", "-dPDFA=2", "-dPDFACompatibilityPolicy=1", diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index 1ad88dd9..beafe1b4 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -521,7 +521,7 @@ def select_visible_page_image( if pageinfo['images'] and \ all(im['enc'] == 'jpeg' for im in pageinfo['images']): log.debug('{:4d}: JPEG input -> JPEG output'.format( - page_number(page_pdf))) + page_number(image))) # If all images were JPEGs originally, produce a JPEG as output im = Image.open(image) @@ -807,7 +807,9 @@ def merge_pages_ghostscript( pdf_pages = sorted(input_files, key=input_file_order) log.debug("Final pages: " + "\n".join(pdf_pages)) - ghostscript.generate_pdfa(pdf_pages, output_file, log, options.jobs or 1) + ghostscript.generate_pdfa( + pdf_pages, output_file, options.pdfa_image_compression, + log, options.jobs or 1) def merge_pages_qpdf( diff --git a/tests/test_main.py b/tests/test_main.py index e38e6217..ddca6fba 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -885,9 +885,10 @@ def test_no_contents(spoof_tesseract_noop, resources, outpdf): @pytest.mark.parametrize('image', [ 'baiona.png', 'baiona_gray.png', + 'congress.jpg' ]) -def test_lossless_to_lossless(spoof_tesseract_noop, ocrmypdf_exec, - resources, image, outpdf): +def test_compression_preserved(spoof_tesseract_noop, ocrmypdf_exec, + resources, image, outpdf): from PIL import Image input_file = str(resources / image) @@ -897,7 +898,8 @@ def test_lossless_to_lossless(spoof_tesseract_noop, ocrmypdf_exec, # Runs: ocrmypdf - output.pdf < testfile with open(input_file, 'rb') as input_stream: - p_args = ocrmypdf_exec + ['--image-dpi', '150', '-', output_file] + p_args = ocrmypdf_exec + [ + '--image-dpi', '150', '--output-type', 'pdf', '-', output_file] p = Popen( p_args, close_fds=True, stdout=PIPE, stderr=PIPE, stdin=input_stream, env=spoof_tesseract_noop) @@ -906,11 +908,62 @@ def test_lossless_to_lossless(spoof_tesseract_noop, ocrmypdf_exec, assert p.returncode == ExitCode.ok pdfinfo = pdf_get_all_pageinfo(output_file) - assert pdfinfo[0]['images'][0]['enc'] != 'jpeg', \ - "Lossless compression changed to lossy!" + + pdfimage = pdfinfo[0]['images'][0] + + if input_file.endswith('.png'): + assert pdfimage['enc'] != 'jpeg', \ + "Lossless compression changed to lossy!" + elif input_file.endswith('.jpg'): + assert pdfimage['enc'] == 'jpeg', \ + "Lossy compression changed to lossless!" if im.mode.startswith('RGB') or im.mode.startswith('BGR'): - assert pdfinfo[0]['images'][0]['color'] == 'rgb', \ + assert pdfimage['color'] == 'rgb', \ "Colorspace changed" elif im.mode.startswith('L'): - assert pdfinfo[0]['images'][0]['color'] == 'gray', \ + assert pdfimage['color'] == 'gray', \ + "Colorspace changed" + + +@pytest.mark.parametrize('image,compression', [ + ('baiona.png', 'jpeg'), + ('baiona_gray.png', 'lossless'), + ('congress.jpg', 'lossless') + ]) +def test_compression_changed(spoof_tesseract_noop, ocrmypdf_exec, + resources, image, compression, outpdf): + from PIL import Image + + input_file = str(resources / image) + output_file = str(outpdf) + + im = Image.open(input_file) + + # Runs: ocrmypdf - output.pdf < testfile + with open(input_file, 'rb') as input_stream: + p_args = ocrmypdf_exec + [ + '--image-dpi', '150', '--output-type', 'pdfa', + '--pdfa-image-compression', compression, + '-', output_file] + p = Popen( + p_args, close_fds=True, stdout=PIPE, stderr=PIPE, + stdin=input_stream, env=spoof_tesseract_noop) + out, err = p.communicate() + + assert p.returncode == ExitCode.ok + + pdfinfo = pdf_get_all_pageinfo(output_file) + + pdfimage = pdfinfo[0]['images'][0] + + if compression == 'jpeg': + assert pdfimage['enc'] == 'jpeg' + elif compression == 'lossless': + assert pdfimage['enc'] == 'image' + + if im.mode.startswith('RGB') or im.mode.startswith('BGR'): + assert pdfimage['color'] == 'rgb', \ + "Colorspace changed" + elif im.mode.startswith('L'): + assert pdfimage['color'] == 'gray', \ "Colorspace changed" \ No newline at end of file From 1606b6a383a82c2015477305bdf10d9cb4bd6d47 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 9 May 2017 17:24:06 -0700 Subject: [PATCH 31/38] =?UTF-8?q?Add=20=E2=80=94quiet=20(fixes=20#143),=20?= =?UTF-8?q?stop=20using=20ruffus=20to=20partially=20generate=20argparser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ocrmypdf/__main__.py | 95 ++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index d448e4df..dcb979a3 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -60,14 +60,9 @@ if tesseract.version() < MINIMUM_TESS_VERSION: # ------------- # Parser -parser = cmdline.get_argparse( +parser = argparse.ArgumentParser( prog=PROGRAM_NAME, - version=VERSION, fromfile_prefix_chars='@', - ignored_args=[ - 'touch_files_only', 'recreate_database', 'checksum_file_name', - 'key_legend_in_graph', 'draw_graph_horizontally', 'flowchart_format', - 'forced_tasks', 'target_tasks', 'use_threads', 'jobs', 'log_file'], formatter_class=argparse.RawDescriptionHelpFormatter, description="""\ Generates a searchable PDF or PDF/A from a regular PDF. @@ -124,19 +119,18 @@ parser.add_argument( "standard input)") parser.add_argument( 'output_file', - help="output searchable PDF file (or '-' to write to standard output)") + help="Output searchable PDF file (or '-' to write to standard output)") parser.add_argument( '-l', '--language', action='append', help="Language(s) of the file to be OCRed (see tesseract --list-langs for " - "all language packs installed in your system). To specify multiple " - "languages, join them with '+' or issue this argument once for each " - "language.") + "all language packs installed in your system). Use -l eng+deu for " + "multiple languages.") parser.add_argument( '-j', '--jobs', metavar='N', type=int, - help="Use up to N CPU cores simultaneously (default: use all)") + help="Use up to N CPU cores simultaneously (default: use all).") parser.add_argument( '--image-dpi', metavar='DPI', type=int, - help="for input image instead of PDF, use this DPI instead of file's") + help="For input image instead of PDF, use this DPI instead of file's.") parser.add_argument( '--output-type', choices=['pdfa', 'pdf'], default='pdfa', help="Choose output type. 'pdfa' creates a PDF/A-2b compliant file for " @@ -144,48 +138,56 @@ parser.add_argument( "for users who want their file altered as little as possible. 'pdfa' " "also has problems with full Unicode text. 'pdf' attempts to " "preserve file contents as much as possible.") +parser.add_argument( + '-q', '--quiet', action='store_true', help="Suppress INFO messages") +parser.add_argument( + '-v', '--verbose', const="+", default=[], nargs='?', action="append", + help="Print more verbose messages for each additional verbose level") +parser.add_argument( + '--version', action='version', version=VERSION, + help="Print program version and exit") metadata = parser.add_argument_group( "Metadata options", "Set output PDF/A metadata (default: use input document's metadata)") metadata.add_argument( '--title', type=str, - help="set document title (place multiple words in quotes)") + help="Set document title (place multiple words in quotes)") metadata.add_argument( '--author', type=str, - help="set document author") + help="Set document author") metadata.add_argument( '--subject', type=str, - help="set document subject description") + help="Set document subject description") metadata.add_argument( '--keywords', type=str, - help="set document keywords") + help="Set document keywords") preprocessing = parser.add_argument_group( "Image preprocessing options", "Options to improve the quality of the final PDF and OCR") preprocessing.add_argument( '-r', '--rotate-pages', action='store_true', - help="automatically rotate pages based on detected text orientation") + help="Automatically rotate pages based on detected text orientation") preprocessing.add_argument( '--remove-background', action='store_true', - help="attempt to remove background from gray or color pages, setting it " + help="Attempt to remove background from gray or color pages, setting it " "to white ") preprocessing.add_argument( '-d', '--deskew', action='store_true', - help="deskew each page before performing OCR") + help="Deskew each page before performing OCR") preprocessing.add_argument( '-c', '--clean', action='store_true', - help="clean pages from scanning artifacts before performing OCR, and send " + help="Clean pages from scanning artifacts before performing OCR, and send " "the cleaned page to OCR, but do not include the cleaned page in " - "the output ") + "the output") preprocessing.add_argument( '-i', '--clean-final', action='store_true', - help="clean page as above, and incorporate the cleaned image in the final " - "PDF") + help="Clean page as above, and incorporate the cleaned image in the final " + "PDF. Might remove desired content.") preprocessing.add_argument( '--oversample', metavar='DPI', type=int, default=0, - help="oversample images to at least the specified DPI, to improve OCR " + help="Oversample images to at least the specified DPI, to improve OCR " "results slightly") ocrsettings = parser.add_argument_group( @@ -193,16 +195,16 @@ ocrsettings = parser.add_argument_group( "Control how OCR is applied") ocrsettings.add_argument( '-f', '--force-ocr', action='store_true', - help="rasterize any fonts or vector objects on each page, apply OCR, and " + help="Rasterize any fonts or vector objects on each page, apply OCR, and " "save the rastered output (this rewrites the PDF)") ocrsettings.add_argument( '-s', '--skip-text', action='store_true', - help="skip OCR on any pages that already contain text, but include the " + help="Skip OCR on any pages that already contain text, but include the " "page in final output; useful for PDFs that contain a mix of " "images, text pages, and/or previously OCRed pages") ocrsettings.add_argument( '--skip-big', type=float, metavar='MPixels', - help="skip OCR on pages larger than the specified amount of megapixels, " + help="Skip OCR on pages larger than the specified amount of megapixels, " "but include skipped pages in final output") advanced = parser.add_argument_group( @@ -210,15 +212,15 @@ advanced = parser.add_argument_group( "Advanced options for power users") advanced.add_argument( '--tesseract-config', action='append', metavar='CFG', default=[], - help="additional Tesseract configuration files -- see documentation") + help="Additional Tesseract configuration files -- see documentation") advanced.add_argument( '--tesseract-pagesegmode', action='store', type=int, metavar='PSM', choices=range(0, 14), - help="set Tesseract page segmentation mode (see tesseract --help)") + help="Set Tesseract page segmentation mode (see tesseract --help)") advanced.add_argument( '--tesseract-oem', action='store', type=int, metavar='MODE', choices=range(0, 4), - help=("set Tesseract 4.0 OCR engine mode: " + help=("Set Tesseract 4.0 OCR engine mode: " "0 - original Tesseract only; " "1 - neural nets LSTM only; " "2 - Tesseract + LSTM; " @@ -226,7 +228,7 @@ advanced.add_argument( ) advanced.add_argument( '--pdf-renderer', choices=['auto', 'tesseract', 'hocr', 'tess4'], default='auto', - help="choose OCR PDF renderer - the default option is to let OCRmyPDF " + help="Choose OCR PDF renderer - the default option is to let OCRmyPDF " "choose. The 'tesseract' PDF renderer is more accurate and does a " "better job and document structure such as recognizing columns. It " "also does a better job on non-Latin languages. However, it does " @@ -236,21 +238,20 @@ advanced.add_argument( "to 'tesseract', requires tesseract 4, and gives superior results.") advanced.add_argument( '--tesseract-timeout', default=180.0, type=float, metavar='SECONDS', - help='give up on OCR after the timeout, but copy the preprocessed page ' + help='Give up on OCR after the timeout, but copy the preprocessed page ' 'into the final output') advanced.add_argument( '--rotate-pages-threshold', default=14.0, type=float, metavar='CONFIDENCE', - help="only rotate pages when confidence is above this value (arbitrary " + help="Only rotate pages when confidence is above this value (arbitrary " "units reported by tesseract)") advanced.add_argument( '--pdfa-image-compression', choices=['auto', 'jpeg', 'lossless'], default='auto', - help="specify how to compress images in the output PDF/A. 'auto' lets " + help="Specify how to compress images in the output PDF/A. 'auto' lets " "OCRmyPDF decide. 'jpeg' changes all grayscale and color images to " "JPEG compression. 'lossless' uses PNG-style lossless compression " "for all images. Monochrome images are always compressed using a " - "lossless codec. In 'auto' mode OCRmyPDF lets Ghostscript's auto " - "filter decide how to compress the image. Compression settings " + "lossless codec. Compression settings " "are applied to all pages, including those for which OCR was " "skipped. Not supported for --output-type=pdf ; that setting " "preserves the original compression of all images.") @@ -260,10 +261,13 @@ debugging = parser.add_argument_group( "Arguments to help with troubleshooting and debugging") debugging.add_argument( '-k', '--keep-temporary-files', action='store_true', - help="keep temporary files (helpful for debugging)") + help="Keep temporary files (helpful for debugging)") debugging.add_argument( '-g', '--debug-rendering', action='store_true', - help="render each page twice with debug information on second page") + help="Render each page twice with debug information on second page") +debugging.add_argument( + '--flowchart', type=str, + help="Generate the pipeline execution flowchart") def check_options_languages(options, _log): @@ -403,8 +407,9 @@ def check_options(options, log): # Logging -def logging_factory(logger_name, listargs): - log_file_name, verbose = listargs +def logging_factory(logger_name, logger_args): + verbose = logger_args['verbose'] + quiet = logger_args['quiet'] root_logger = logging.getLogger(logger_name) root_logger.setLevel(logging.DEBUG) @@ -414,6 +419,8 @@ def logging_factory(logger_name, listargs): handler.setFormatter(formatter_) if verbose: handler.setLevel(logging.DEBUG) + elif quiet: + handler.setLevel(logging.WARNING) else: handler.setLevel(logging.INFO) root_logger.addHandler(handler) @@ -573,8 +580,10 @@ def run_pipeline(): if not check_closed_streams(options): return ExitCode.bad_args + logger_args = {'verbose': options.verbose, 'quiet': options.quiet} + _log, _log_mutex = proxy_logger.make_shared_logger_and_proxy( - logging_factory, __name__, [None, options.verbose]) + logging_factory, __name__, logger_args) _log.debug('ocrmypdf ' + VERSION) _log.debug('tesseract ' + tesseract.version()) @@ -660,7 +669,9 @@ def run_pipeline(): _log.error(e) return ExitCode.other_error - if options.output_file != '-': + if options.flowchart: + _log.info("Flowchart saved to {}".format(options.flowchart)) + elif options.output_file != '-': if options.output_type == 'pdfa': pdfa_info = file_claims_pdfa(options.output_file) if pdfa_info['pass']: From 4bdebf573e0f8cdf68697701fbf00c203f5a09b8 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 9 May 2017 17:24:32 -0700 Subject: [PATCH 32/38] Tell Travis CI to use multiple cores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let’s see if this helps the build go faster --- .travis.yml | 2 +- setup.cfg | 1 + test_requirements.txt | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 568d6689..eb98b714 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ install: script: - mv ocrmypdf dont_import_this_ocrmypdf -- pytest +- pytest -n auto - mv dont_import_this_ocrmypdf ocrmypdf deploy: diff --git a/setup.cfg b/setup.cfg index 579a575c..432d7f5c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -11,3 +11,4 @@ ignore = [tool:pytest] norecursedirs = lib .pc .git output cache resources testpaths = tests +addopts = -n auto \ No newline at end of file diff --git a/test_requirements.txt b/test_requirements.txt index 3e9f413a..a3e920b2 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -1,2 +1,3 @@ pytest >= 3.0 -pytest-helpers-namespace \ No newline at end of file +pytest-helpers-namespace +pytest-xdist \ No newline at end of file From 74d98216f150aa58a194b8a62dcb1f9fb5c015f5 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 9 May 2017 17:43:39 -0700 Subject: [PATCH 33/38] Update documentation for Ghostscript behavior --- docs/cookbook.rst | 7 +++++++ docs/introduction.rst | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/cookbook.rst b/docs/cookbook.rst index c9779cce..2ca9805f 100644 --- a/docs/cookbook.rst +++ b/docs/cookbook.rst @@ -28,6 +28,13 @@ Add an OCR layer and output a standard PDF ocrmypdf --output-type pdf input.pdf output.pdf +Create a PDF/A with all color and grayscale images converted to JPEG +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +.. code-block:: bash + + ocrmypdf --output-type pdfa --pdfa-image-compression jpeg input.pdf output.pdf + Modify a file in place """""""""""""""""""""" diff --git a/docs/introduction.rst b/docs/introduction.rst index 9dc7011d..3bad601e 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -60,9 +60,9 @@ There are two routes to manually applying OCR to an existing PDF, both of which 1. Rasterize each page as an image, OCR the images, and combine the output into a PDF. This preserves the appearance of each page, but resamples all images (possibly losing quality, increasing file size, introducing compression artifacts, etc.) -2. Extract each image, OCR, and combine the output into a PDF. This loses the context in which images are used in the PDF, meaning that cropping, rotation and scaling of pages may be lost. Some PDFs use multiple images per page with stencil masks, which would quite difficult to reassemble correctly. This also loses and text or vector art on any pages in a PDF with both scanned and pure digital content. +2. Extract each image, OCR, and combine the output into a PDF. This loses the context in which images are used in the PDF, meaning that cropping, rotation and scaling of pages may be lost. Some scanned PDFs use multiple images segmented into black and white, grayscale and color regions, with stencil masks to prevent overlap, as this can enhance the appearance of a file while reducing file size. Clearly, reassembling these images will be easy. This also loses and text or vector art on any pages in a PDF with both scanned and pure digital content. -In the case of a PDF that is nothing other than a container of images (no rotation, scaling, cropping, one image per page), the second approach is can be lossless. +In the case of a PDF that is nothing other than a container of images (no rotation, scaling, cropping, one image per page), the second approach can be lossless. OCRmyPDF uses several strategies depending on input options and the input PDF itself, but generally speaking it rasterizes a page for OCR and then grafts the OCR back onto the original. As such it can handle complex PDFs and still preserve their contents as much as possible. @@ -88,6 +88,7 @@ Ghostscript also imposes some limitations: * PDFs containing JBIG2-encoded content will be converted to CCITT Group4 encoding, which has lower compression ratios, if Ghostscript PDF/A is enabled. * PDFs containing JPEG 2000-encoded content will be converted to JPEG encoding, which may introduce compression artifacts, if Ghostscript PDF/A is enabled. +* Ghostscript may transcode grayscale and color images, either lossy to lossless or lossless to lossy, based on an internal algorithm. This behavior can be suppressed by setting ``--pdfa-image-compression`` to ``jpeg`` or ``lossless`` to set all images to one type or the other. Ghostscript has no option to maintain the input image's format. OCRmyPDF is currently not designed to be used as a Python API; it is designed to be run as a command line tool. ``import ocrmypf`` currently attempts to process the command line on ``sys.argv`` at import time so it has side effects that will interfere with its use as a package. The API it presents should not be considered stable. From 47a2997538780a52bda4d3cae8ef7d228e20df8a Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 10 May 2017 12:12:03 -0700 Subject: [PATCH 34/38] =?UTF-8?q?Reorganize=20=E2=80=94help=20text?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ocrmypdf/__main__.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index dcb979a3..9a23c75e 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -119,15 +119,14 @@ parser.add_argument( "standard input)") parser.add_argument( 'output_file', - help="Output searchable PDF file (or '-' to write to standard output)") + help="Output searchable PDF file (or '-' to write to standard output). " + "Existing files will be ovewritten. If same as input file, the " + "input file will be updated only if processing is successful.") parser.add_argument( '-l', '--language', action='append', help="Language(s) of the file to be OCRed (see tesseract --list-langs for " "all language packs installed in your system). Use -l eng+deu for " "multiple languages.") -parser.add_argument( - '-j', '--jobs', metavar='N', type=int, - help="Use up to N CPU cores simultaneously (default: use all).") parser.add_argument( '--image-dpi', metavar='DPI', type=int, help="For input image instead of PDF, use this DPI instead of file's.") @@ -138,18 +137,24 @@ parser.add_argument( "for users who want their file altered as little as possible. 'pdfa' " "also has problems with full Unicode text. 'pdf' attempts to " "preserve file contents as much as possible.") -parser.add_argument( - '-q', '--quiet', action='store_true', help="Suppress INFO messages") -parser.add_argument( - '-v', '--verbose', const="+", default=[], nargs='?', action="append", - help="Print more verbose messages for each additional verbose level") parser.add_argument( '--version', action='version', version=VERSION, help="Print program version and exit") +jobcontrol = parser.add_argument_group( + "Job control options") +jobcontrol.add_argument( + '-j', '--jobs', metavar='N', type=int, + help="Use up to N CPU cores simultaneously (default: use all).") +jobcontrol.add_argument( + '-q', '--quiet', action='store_true', help="Suppress INFO messages") +jobcontrol.add_argument( + '-v', '--verbose', const="+", default=[], nargs='?', action="append", + help="Print more verbose messages for each additional verbose level") + metadata = parser.add_argument_group( "Metadata options", - "Set output PDF/A metadata (default: use input document's metadata)") + "Set output PDF/A metadata (default: copy input document's metadata)") metadata.add_argument( '--title', type=str, help="Set document title (place multiple words in quotes)") @@ -209,7 +214,7 @@ ocrsettings.add_argument( advanced = parser.add_argument_group( "Advanced", - "Advanced options for power users") + "Advanced options to control Tesseract's OCR behavior") advanced.add_argument( '--tesseract-config', action='append', metavar='CFG', default=[], help="Additional Tesseract configuration files -- see documentation") From 183eafa587b1952fbded889918cf75fa9b20ff1c Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 10 May 2017 15:22:44 -0700 Subject: [PATCH 35/38] Implement sidecar text files (#126) --- ocrmypdf/exec/tesseract.py | 40 ++++++++++----- ocrmypdf/pipeline.py | 99 ++++++++++++++++++++++++++++++-------- tests/test_main.py | 6 ++- tests/test_tess4.py | 1 + 4 files changed, 114 insertions(+), 32 deletions(-) diff --git a/ocrmypdf/exec/tesseract.py b/ocrmypdf/exec/tesseract.py index 21e2cc4f..c2835a68 100644 --- a/ocrmypdf/exec/tesseract.py +++ b/ocrmypdf/exec/tesseract.py @@ -200,7 +200,7 @@ def page_timedout(log, input_file): log.warning(prefix + " took too long to OCR - skipping") -def _generate_null_hocr(output_hocr, image): +def _generate_null_hocr(output_hocr, output_sidecar, image): """Produce a .hocr file that reports no text detected on a page that is the same size as the input image.""" from PIL import Image @@ -210,12 +210,16 @@ def _generate_null_hocr(output_hocr, image): with open(output_hocr, 'w', encoding="utf-8") as f: f.write(HOCR_TEMPLATE.format(w, h)) + with open(output_sidecar, 'w', encoding='utf-8') as f: + f.write('[skipped page]') -def generate_hocr(input_file, output_hocr, language: list, engine_mode, +def generate_hocr(input_file, output_files, language: list, engine_mode, tessconfig: list, timeout: float, pagesegmode: int, log): + output_hocr = next(o for o in output_files if o.endswith('.hocr')) + output_sidecar = next(o for o in output_files if o.endswith('.txt')) badxml = os.path.splitext(output_hocr)[0] + '.badxml' args_tesseract = tess_base_args(language, engine_mode) @@ -226,7 +230,8 @@ def generate_hocr(input_file, output_hocr, language: list, engine_mode, args_tesseract.extend([ input_file, badxml, - 'hocr' + 'hocr', + 'txt' ] + tessconfig) try: log.debug(args_tesseract) @@ -238,13 +243,13 @@ def generate_hocr(input_file, output_hocr, language: list, engine_mode, # Temporary workaround to hocrTransform not being able to function if # it does not have a valid hOCR file. page_timedout(log, input_file) - _generate_null_hocr(output_hocr, input_file) + _generate_null_hocr(output_hocr, output_sidecar, input_file) except CalledProcessError as e: tesseract_log_output(log, e.output, input_file) if 'read_params_file: parameter not found' in e.output: raise TesseractConfigError() from e if 'Image too large' in e.output: - _generate_null_hocr(output_hocr, input_file) + _generate_null_hocr(output_hocr, output_sidecar, input_file) return raise e from e @@ -258,6 +263,9 @@ def generate_hocr(input_file, output_hocr, language: list, engine_mode, # Tesseract 3.03 appends suffix ".hocr" on its own (.badxml.hocr) shutil.move(badxml + '.hocr', badxml) + if os.path.exists(badxml + '.txt'): + shutil.move(badxml + '.txt', output_sidecar) + # Tesseract 3.03 inserts source filename into hocr file without # escaping it, creating invalid XML and breaking the parser. # As a workaround, rewrite the hocr file, replacing the filename @@ -273,7 +281,10 @@ def generate_hocr(input_file, output_hocr, language: list, engine_mode, f_out.write(line) -def use_skip_page(text_only, skip_pdf, output_pdf): +def use_skip_page(text_only, skip_pdf, output_pdf, output_text): + with open(output_text, 'w') as f: + f.write('[skipped page]') + if not text_only: os.symlink(skip_pdf, output_pdf) return @@ -291,14 +302,15 @@ def use_skip_page(text_only, skip_pdf, output_pdf): pdf_out.write(out) -def generate_pdf(input_image, skip_pdf, output_pdf, language: list, - engine_mode, text_only: bool, +def generate_pdf(*, input_image, skip_pdf, output_pdf, output_text, + language: list, engine_mode, text_only: bool, tessconfig: list, timeout: float, pagesegmode: int, log): '''Use Tesseract to render a PDF. input_image -- image to analyze skip_pdf -- if we time out, use this file as output output_pdf -- file to generate + output_text -- OCR text file language -- list of languages to consider engine_mode -- engine mode argument for tess v4 text_only -- enable tesseract text only mode? @@ -315,10 +327,12 @@ def generate_pdf(input_image, skip_pdf, output_pdf, language: list, if text_only: args_tesseract.extend(['-c', 'textonly_pdf=1']) + prefix = os.path.splitext(output_pdf)[0] # Tesseract appends suffixes + args_tesseract.extend([ input_image, - os.path.splitext(output_pdf)[0], # Tesseract appends suffix - 'pdf' + prefix, + 'pdf', 'txt' ] + tessconfig) try: @@ -326,16 +340,18 @@ def generate_pdf(input_image, skip_pdf, output_pdf, language: list, stdout = check_output( args_tesseract, close_fds=True, stderr=STDOUT, universal_newlines=True, timeout=timeout) + if os.path.exists(prefix + '.txt'): + shutil.move(prefix + '.txt', output_text) except TimeoutExpired: page_timedout(log, input_image) - use_skip_page(text_only, skip_pdf, output_pdf) + use_skip_page(text_only, skip_pdf, output_pdf, output_text) except CalledProcessError as e: tesseract_log_output(log, e.output, input_image) if 'read_params_file: parameter not found' in e.output: raise TesseractConfigError() from e if 'Image too large' in e.output: - use_skip_page(text_only, skip_pdf, output_pdf) + use_skip_page(text_only, skip_pdf, output_pdf, output_text) return raise e from e else: diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index beafe1b4..9fd314a0 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -483,13 +483,13 @@ def select_ocr_image( def ocr_tesseract_hocr( input_file, - output_file, + output_files, log, context): options = context.get_options() tesseract.generate_hocr( input_file=input_file, - output_hocr=output_file, + output_files=output_files, language=options.language, engine_mode=options.tesseract_oem, tessconfig=options.tesseract_config, @@ -579,12 +579,12 @@ def select_image_layer( def render_hocr_page( - input_file, + infiles, output_file, log, context): options = context.get_options() - hocr = input_file + hocr = next(ii for ii in infiles if ii.endswith('.hocr')) pageinfo = get_pageinfo(hocr, context) dpi = get_page_square_dpi(pageinfo, options) @@ -610,13 +610,23 @@ def render_hocr_debug_page( showBoundingboxes=True, invisibleText=False) +def flatten_groups(groups): + for obj in groups: + if is_iterable_notstr(obj): + yield from obj + else: + yield obj + + def combine_layers( infiles, output_file, log, context): - text = next(ii for ii in infiles if ii.endswith('.text.pdf')) - image = next(ii for ii in infiles if ii.endswith('.image-layer.pdf')) + text = next(ii for ii in flatten_groups(infiles) + if ii.endswith('.text.pdf')) + image = next(ii for ii in flatten_groups(infiles) + if ii.endswith('.image-layer.pdf')) pdf_text = pypdf.PdfFileReader(open(text, "rb")) pdf_image = pypdf.PdfFileReader(open(image, "rb")) @@ -682,21 +692,27 @@ def combine_layers( def ocr_tesseract_and_render_pdf( infiles, - output_file, + outfiles, log, context): options = context.get_options() input_image = next((ii for ii in infiles if ii.endswith('.image')), '') input_pdf = next((ii for ii in infiles if ii.endswith('.pdf'))) + output_pdf = next((ii for ii in outfiles if ii.endswith('.pdf'))) + output_text = next((ii for ii in outfiles if ii.endswith('.txt'))) + if not input_image: # Skipping this page - re_symlink(input_pdf, output_file, log) + re_symlink(input_pdf, output_pdf, log) + with open(output_text, 'w') as f: + f.write('[skipped page]') return tesseract.generate_pdf( input_image=input_image, skip_pdf=input_pdf, - output_pdf=output_file, + output_pdf=output_pdf, + output_text=output_text, language=options.language, engine_mode=options.tesseract_oem, text_only=False, @@ -708,19 +724,23 @@ def ocr_tesseract_and_render_pdf( def ocr_tesseract_textonly_pdf( infiles, - output_file, + outfiles, log, context): options = context.get_options() input_image = next((ii for ii in infiles if ii.endswith('.ocr.png')), '') if not input_image: raise ValueError("No image rendered?") - skip_pdf = next((ii for ii in infiles if ii.endswith('.pdf'))) + + output_pdf = next((ii for ii in outfiles if ii.endswith('.pdf'))) + output_text = next((ii for ii in outfiles if ii.endswith('.txt'))) + tesseract.generate_pdf( input_image=input_image, skip_pdf=skip_pdf, - output_pdf=output_file, + output_pdf=output_pdf, + output_text=output_text, language=options.language, engine_mode=options.tesseract_oem, text_only=True, @@ -787,7 +807,7 @@ def skip_page( def merge_pages_ghostscript( - input_files, + input_files_groups, output_file, log, context): @@ -805,6 +825,8 @@ def merge_pages_ghostscript( key += 1 return key + input_files = (f for f in flatten_groups(input_files_groups) + if not f.endswith('.txt')) pdf_pages = sorted(input_files, key=input_file_order) log.debug("Final pages: " + "\n".join(pdf_pages)) ghostscript.generate_pdfa( @@ -813,11 +835,14 @@ def merge_pages_ghostscript( def merge_pages_qpdf( - input_files, + input_files_groups, output_file, log, context): options = context.get_options() + + input_files = list(f for f in flatten_groups(input_files_groups) + if not f.endswith('.txt')) metadata_file = next( (ii for ii in input_files if ii.endswith('.repaired.pdf'))) input_files.remove(metadata_file) @@ -851,6 +876,31 @@ def merge_pages_qpdf( qpdf.merge(pdf_pages, output_file) +def merge_sidecars( + input_files_groups, + output_file, + log, + context): + options = context.get_options() + + txt_files = sorted(f for f in flatten_groups(input_files_groups) + if f.endswith('.txt')) + + def write_pages(stream): + for page_number, txt_file in enumerate(txt_files): + if page_number != 0: + stream.write('\f') # Form feed between pages + with open(txt_file, 'r') as in_: + stream.write(in_.read()) + + if output_file == '-': + write_pages(sys.stdout) + sys.stdout.flush() + else: + with open(output_file, 'w', encoding='utf-8') as out: + write_pages(out) + + def copy_final( input_files, output_file, @@ -955,7 +1005,7 @@ def build_pipeline(options, work_folder, log, context): task_func=ocr_tesseract_hocr, input=task_select_ocr_image, filter=suffix(".ocr.png"), - output=".hocr", + output=[".hocr", ".txt"], extras=[log, context]) task_ocr_tesseract_hocr.graphviz(fillcolor='"#00cc66"') task_ocr_tesseract_hocr.active_if(options.pdf_renderer == 'hocr') @@ -987,8 +1037,8 @@ def build_pipeline(options, work_folder, log, context): task_render_hocr_page = main_pipeline.transform( task_func=render_hocr_page, input=task_ocr_tesseract_hocr, - filter=suffix('.hocr'), - output='.text.pdf', + filter=regex(r".*/(\d{6})(?:\.hocr)"), + output=os.path.join(work_folder, r'\1.text.pdf'), extras=[log, context]) task_render_hocr_page.graphviz(fillcolor='"#00cc66"') task_render_hocr_page.active_if(options.pdf_renderer == 'hocr') @@ -1008,7 +1058,8 @@ def build_pipeline(options, work_folder, log, context): task_func=ocr_tesseract_textonly_pdf, input=[task_select_ocr_image, task_orient_page], filter=regex(r".*/(\d{6})(?:\.ocr.png|\.ocr\.oriented\.pdf)"), - output=os.path.join(work_folder, r'\1.text.pdf'), + output=[os.path.join(work_folder, r'\1.text.pdf'), + os.path.join(work_folder, r'\1.text.txt')], extras=[log, context]) task_ocr_tesseract_textonly_pdf.graphviz(fillcolor='"#ff69b4"') task_ocr_tesseract_textonly_pdf.active_if(options.pdf_renderer == 'tess4') @@ -1031,7 +1082,8 @@ def build_pipeline(options, work_folder, log, context): task_func=ocr_tesseract_and_render_pdf, input=[task_select_visible_page_image, task_orient_page], filter=regex(r".*/(\d{6})(?:\.image|\.ocr\.oriented\.pdf)"), - output=os.path.join(work_folder, r'\1.rendered.pdf'), + output=[os.path.join(work_folder, r'\1.rendered.pdf'), + os.path.join(work_folder, r'\1.rendered.txt')], extras=[log, context]) task_ocr_tesseract_and_render_pdf.graphviz(fillcolor='"#66ccff"') task_ocr_tesseract_and_render_pdf.active_if(options.pdf_renderer == 'tesseract') @@ -1080,6 +1132,15 @@ def build_pipeline(options, work_folder, log, context): extras=[log, context]) task_merge_pages_qpdf.active_if(options.output_type == 'pdf') + task_merge_sidecars = main_pipeline.merge( + task_func=merge_sidecars, + input=[task_ocr_tesseract_hocr, + task_ocr_tesseract_and_render_pdf, + task_ocr_tesseract_textonly_pdf], + output=options.sidecar, + extras=[log, context]) + task_merge_sidecars.active_if(options.sidecar) + # Finalize task_copy_final = main_pipeline.merge( task_func=copy_final, diff --git a/tests/test_main.py b/tests/test_main.py index ddca6fba..85b90564 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -147,14 +147,18 @@ def test_remove_background(spoof_tesseract_noop, resources, outdir): @pytest.mark.parametrize("output_type", ['pdf', 'pdfa']) def test_exotic_image(spoof_tesseract_cache, pdf, renderer, output_type, resources, outdir): + outfile = outdir / 'test_{0}_{1}.pdf'.format(pdf, renderer) check_ocrmypdf( resources / pdf, - outdir / 'test_{0}_{1}.pdf'.format(pdf, renderer), + outfile, '-dc', '-v', '1', '--output-type', output_type, + '--sidecar', '--pdf-renderer', renderer, env=spoof_tesseract_cache) + assert outfile.with_suffix('.pdf.txt').exists() + @pytest.mark.parametrize("output_type", [ 'pdfa', 'pdf' diff --git a/tests/test_tess4.py b/tests/test_tess4.py index 4cc9942c..5a706178 100644 --- a/tests/test_tess4.py +++ b/tests/test_tess4.py @@ -53,6 +53,7 @@ def test_textonly_pdf(ensure_tess4, resources, outdir): check_ocrmypdf( resources / 'linn.pdf', outdir / 'linn_textonly.pdf', '--pdf-renderer', 'tess4', + '--sidecar', 'foo', env=ensure_tess4) From 16b6442b23cc7a45a416dc9a8b094e45f49f8a6f Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 10 May 2017 17:55:42 -0700 Subject: [PATCH 36/38] Add changes to __main__.py that should have been in last commit --- ocrmypdf/__main__.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 9a23c75e..11607518 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -114,11 +114,11 @@ Online documentation is located at: """) parser.add_argument( - 'input_file', + 'input_file', metavar="input_pdf_or_image", help="PDF file containing the images to be OCRed (or '-' to read from " "standard input)") parser.add_argument( - 'output_file', + 'output_file', metavar="output_pdf", help="Output searchable PDF file (or '-' to write to standard output). " "Existing files will be ovewritten. If same as input file, the " "input file will be updated only if processing is successful.") @@ -137,6 +137,19 @@ parser.add_argument( "for users who want their file altered as little as possible. 'pdfa' " "also has problems with full Unicode text. 'pdf' attempts to " "preserve file contents as much as possible.") + +# Use null string '\0' as sentinel to indicate the user supplied no argument, +# since that is the only invalid character for filepaths on all platforms +# bool('\0') is True in Python +parser.add_argument( + '--sidecar', nargs='?', const='\0', default=None, metavar='FILE', + help="Generate sidecar text files that contain the same text recognized " + "by Tesseract. This may be useful for building a OCR text database. " + "If FILE is omitted, the sidecar file be named {output_file}.txt " + "If FILE is set to '-', the sidecar is written to stdout (a " + "convenient way to preview OCR quality). The output file and sidecar " + "may not both use stdout at the same time.") + parser.add_argument( '--version', action='version', version=VERSION, help="Print program version and exit") @@ -322,6 +335,16 @@ def check_options_output(options, log): options.lossless_reconstruction = lossless_reconstruction +def check_options_sidecar(options, log): + if options.sidecar == '\0': + if options.output_file == '-': + raise argparse.ArgumentError( + None, + "--sidecar filename must be specified when output file is " + "stdout.") + options.sidecar = options.output_file + '.txt' + + def check_options_preprocessing(options, log): if any((options.clean, options.clean_final)): from .exec import unpaper @@ -394,6 +417,7 @@ def check_options(options, log): check_options_languages(options, log) check_options_metadata(options, log) check_options_output(options, log) + check_options_sidecar(options, log) check_options_preprocessing(options, log) check_options_ocr_behavior(options, log) check_options_advanced(options, log) From c8a4cbcf17389a0a10e261c6d9e66b8dc3aeeb48 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Thu, 11 May 2017 00:17:24 -0700 Subject: [PATCH 37/38] Fix test suite breakage after sidecar feature added Forgot to update tesseract spoofers to account for change in tesseract parameters. Also the change to outputting multiple files in the collate steps affected how ruffus passes information into downstream consumers of those files. --- ocrmypdf/exec/tesseract.py | 35 ++++++++++++++++++++-------------- ocrmypdf/pipeline.py | 20 +++++++++---------- tests/spoof/tesseract_cache.py | 18 +++++++++++++++-- tests/spoof/tesseract_noop.py | 12 ++++++++---- 4 files changed, 55 insertions(+), 30 deletions(-) diff --git a/ocrmypdf/exec/tesseract.py b/ocrmypdf/exec/tesseract.py index c2835a68..34756faf 100644 --- a/ocrmypdf/exec/tesseract.py +++ b/ocrmypdf/exec/tesseract.py @@ -220,18 +220,20 @@ def generate_hocr(input_file, output_files, language: list, engine_mode, output_hocr = next(o for o in output_files if o.endswith('.hocr')) output_sidecar = next(o for o in output_files if o.endswith('.txt')) - badxml = os.path.splitext(output_hocr)[0] + '.badxml' + prefix = os.path.splitext(output_hocr)[0] args_tesseract = tess_base_args(language, engine_mode) if pagesegmode is not None: args_tesseract.extend([psm(), str(pagesegmode)]) + # Reminder: test suite tesseract spoofers will break after any changes + # to the number of order parameters here args_tesseract.extend([ input_file, - badxml, - 'hocr', - 'txt' + prefix, + 'txt', + 'hocr' ] + tessconfig) try: log.debug(args_tesseract) @@ -256,15 +258,17 @@ def generate_hocr(input_file, output_files, language: list, engine_mode, else: tesseract_log_output(log, stdout, input_file) - if os.path.exists(badxml + '.html'): - # Tesseract 3.02 appends suffix ".html" on its own (.badxml.html) - shutil.move(badxml + '.html', badxml) - elif os.path.exists(badxml + '.hocr'): - # Tesseract 3.03 appends suffix ".hocr" on its own (.badxml.hocr) - shutil.move(badxml + '.hocr', badxml) + # Tesseract 3.02 appends suffix ".html" instead of ".hocr". For + # consistency rename its output to .hocr + if os.path.exists(prefix + '.html'): + shutil.move(prefix + '.html', prefix + '.tmp') + elif os.path.exists(prefix + '.hocr'): + shutil.move(prefix + '.hocr', prefix + '.tmp') - if os.path.exists(badxml + '.txt'): - shutil.move(badxml + '.txt', output_sidecar) + # The sidecar text file will get the suffix .txt; rename it to + # whatever caller wants it named + if os.path.exists(prefix + '.txt'): + shutil.move(prefix + '.txt', output_sidecar) # Tesseract 3.03 inserts source filename into hocr file without # escaping it, creating invalid XML and breaking the parser. @@ -273,7 +277,7 @@ def generate_hocr(input_file, output_files, language: list, engine_mode, regex_nested_single_quotes = re.compile( r"""title='image "([^"]*)";""") - with open(badxml, mode='r', encoding='utf-8') as f_in, \ + with open(prefix + '.tmp', mode='r', encoding='utf-8') as f_in, \ open(output_hocr, mode='w', encoding='utf-8') as f_out: for line in f_in: line = regex_nested_single_quotes.sub( @@ -329,10 +333,13 @@ def generate_pdf(*, input_image, skip_pdf, output_pdf, output_text, prefix = os.path.splitext(output_pdf)[0] # Tesseract appends suffixes + # Reminder: test suite tesseract spoofers will break after any changes + # to the number of order parameters here args_tesseract.extend([ input_image, prefix, - 'pdf', 'txt' + 'txt', + 'pdf', ] + tessconfig) try: diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index 9fd314a0..615c5960 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -593,14 +593,22 @@ def render_hocr_page( showBoundingboxes=False, invisibleText=True) +def flatten_groups(groups): + for obj in groups: + if is_iterable_notstr(obj): + yield from obj + else: + yield obj + + def render_hocr_debug_page( infiles, output_file, log, context): options = context.get_options() - hocr = next(ii for ii in infiles if ii.endswith('.hocr')) - image = next(ii for ii in infiles if ii.endswith('.image')) + hocr = next(ii for ii in flatten_groups(infiles) if ii.endswith('.hocr')) + image = next(ii for ii in flatten_groups(infiles) if ii.endswith('.image')) pageinfo = get_pageinfo(image, context) dpi = get_page_square_dpi(pageinfo, options) @@ -610,14 +618,6 @@ def render_hocr_debug_page( showBoundingboxes=True, invisibleText=False) -def flatten_groups(groups): - for obj in groups: - if is_iterable_notstr(obj): - yield from obj - else: - yield obj - - def combine_layers( infiles, output_file, diff --git a/tests/spoof/tesseract_cache.py b/tests/spoof/tesseract_cache.py index 86b14a28..6f19701a 100755 --- a/tests/spoof/tesseract_cache.py +++ b/tests/spoof/tesseract_cache.py @@ -36,6 +36,10 @@ def real_tesseract(): def main(): operation = sys.argv[-1] + sidecar = False + if sys.argv[-2] == 'txt': + sidecar = True + # For anything unexpected operation, defer to real tesseract binary # Currently this includes all use of "--tesseract-config" if operation != 'hocr' and operation != 'pdf' and operation != 'stdout': @@ -92,16 +96,22 @@ def main(): return if operation == 'stdout': + # tesseract [--options] ... input stdout input_file = sys.argv[-2] output_file = 'stdout' + sidecar_file = '' else: - input_file = sys.argv[-3] - output_file = sys.argv[-2] + # tesseract [--options] ... input output txt hocr|pdf + input_file = sys.argv[-4] + output_file = sys.argv[-3] + sidecar_file = sys.argv[-3] if operation == 'hocr': output_file += '.hocr' + sidecar_file += '.txt' elif operation == 'pdf': output_file += '.pdf' + sidecar_file += '.txt' with open(input_file, 'rb') as f: m.update(f.read()) @@ -112,6 +122,8 @@ def main(): print("Tesseract cache hit", file=sys.stderr) if operation != 'stdout': shutil.copy(cache_name, output_file) + if sidecar: + shutil.copy(cache_name + '.sidecar', sidecar_file) # Replicate output with open(cache_name + '.stdout', 'rb') as f: @@ -149,6 +161,8 @@ def main(): shutil.copy(output_file, cache_name) else: print("Could not find output file", file=sys.stderr) + if sidecar and os.path.exists(sidecar_file): + shutil.copy(sidecar_file, cache_name + '.sidecar') else: open(cache_name, 'w').close() diff --git a/tests/spoof/tesseract_noop.py b/tests/spoof/tesseract_noop.py index 8441046d..92f03489 100755 --- a/tests/spoof/tesseract_noop.py +++ b/tests/spoof/tesseract_noop.py @@ -53,18 +53,22 @@ def main(): print('List of available languages (1):\neng', file=sys.stderr) sys.exit(0) elif sys.argv[-1] == 'hocr': - inputf = sys.argv[-3] - output = sys.argv[-2] + inputf = sys.argv[-4] + output = sys.argv[-3] with Image.open(inputf) as im, \ open(output + '.hocr', 'w', encoding='utf-8') as f: w, h = im.size f.write(HOCR_TEMPLATE.format(str(w), str(h))) + with open(output + '.txt', 'w') as f: + f.write('') elif sys.argv[-1] == 'pdf': - inputf = sys.argv[-3] - output = sys.argv[-2] + inputf = sys.argv[-4] + output = sys.argv[-3] pdf_bytes = img2pdf.convert([inputf], dpi=300) with open(output + '.pdf', 'wb') as f: f.write(pdf_bytes) + with open(output + '.txt', 'w') as f: + f.write('') elif sys.argv[-1] == 'stdout': inputf = sys.argv[-2] print("""Orientation: 0 From 01b7205e2c0940577b795dbb0405c30af74723a6 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Thu, 11 May 2017 00:43:36 -0700 Subject: [PATCH 38/38] Ensure skipped pages are explained in sidecars --- ocrmypdf/pipeline.py | 17 +++++++++++++---- tests/test_main.py | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/ocrmypdf/pipeline.py b/ocrmypdf/pipeline.py index 615c5960..507a9f9a 100644 --- a/ocrmypdf/pipeline.py +++ b/ocrmypdf/pipeline.py @@ -882,16 +882,25 @@ def merge_sidecars( log, context): options = context.get_options() + pdfinfo = context.get_pdfinfo() - txt_files = sorted(f for f in flatten_groups(input_files_groups) - if f.endswith('.txt')) + txt_files = [None] * len(pdfinfo) + + for infile in flatten_groups(input_files_groups): + if infile.endswith('.txt'): + idx = page_number(infile) - 1 + txt_files[idx] = infile def write_pages(stream): for page_number, txt_file in enumerate(txt_files): if page_number != 0: stream.write('\f') # Form feed between pages - with open(txt_file, 'r') as in_: - stream.write(in_.read()) + if txt_file: + with open(txt_file, 'r') as in_: + stream.write(in_.read()) + else: + stream.write('[OCR skipped on page {}]'.format( + page_number + 1)) if output_file == '-': write_pages(sys.stdout) diff --git a/tests/test_main.py b/tests/test_main.py index 85b90564..b1d96185 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -970,4 +970,24 @@ def test_compression_changed(spoof_tesseract_noop, ocrmypdf_exec, "Colorspace changed" elif im.mode.startswith('L'): assert pdfimage['color'] == 'gray', \ - "Colorspace changed" \ No newline at end of file + "Colorspace changed" + + +def test_sidecar_pagecount(spoof_tesseract_cache, resources, outpdf): + sidecar = outpdf + '.txt' + check_ocrmypdf( + resources / 'multipage.pdf', outpdf, + '--skip-text', + '--sidecar', sidecar, + env=spoof_tesseract_cache) + + pdfinfo = pdf_get_all_pageinfo(str(resources / 'multipage.pdf')) + num_pages = len(pdfinfo) + + with open(sidecar, 'r') as f: + ocr_text = f.read() + + # There should a formfeed between each pair of pages, so the count of + # formfeeds is the page count less one + assert ocr_text.count('\f') == num_pages - 1, \ + "Sidecar page count does not match PDF page count"