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 | 21 +++++++++++++++++++++ tests/test_main.py | 4 ++++ tests/test_pageinfo.py | 8 ++++++++ 5 files changed, 37 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 00000000..aa26d580 --- /dev/null +++ b/tests/resources/no_contents.pdf @@ -0,0 +1,21 @@ +%PDF-1.3 +%¿÷¢þ +1 0 obj +<< /Pages 2 0 R /Type /Catalog >> +endobj +2 0 obj +<< /Count 1 /Kids [ 3 0 R ] /Type /Pages >> +endobj +3 0 obj +<< /MediaBox [ 0 0 720 720 ] /Parent 2 0 R /Resources << >> /Type /Page >> +endobj +xref +0 4 +0000000000 65535 f +0000000015 00000 n +0000000064 00000 n +0000000123 00000 n +trailer << /Root 1 0 R /Size 4 /ID [<52bba3c78160d0c6e851b59110e5d076><52bba3c78160d0c6e851b59110e5d076>] >> +startxref +213 +%%EOF 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 zcmeAS@N?&q;$mQ6;Pv!y31VPiYG7bsTE)S}z`(HT*ZX1y1_s9BAa^H*b?0PWGB7Z( zq&xaLGB9lH=l+w(%D}+DS>O>_%)r2R1cVuis zag8WR&d<$F%`0JW%gjktD9$e}N=~&>$S5f(u+rBD$>rx2>y>9_XXd7+WG3q67p3ci zc={maR!)hP`FVM%@gQ}jd8x(mIhnbcB}MrK8L7qbh6Vto*LxVgS(lT>Wt@QQvOL7bJbMliDbCUB5D&vjJO_R(m4U*DKOf7T` zL9w_wA+(l(;ctwmi(^Pd+?%=V4$|(|j{kqfArSi|&bRRR-NKyZ-=BS{JGpfG>AO$$ z;%7}h9s6tQmwS(obk05E_h!fUd)yKR%f9zH?5+D8rgY3~+rb6_gZ(MJWofEw%hK=v zd4Bec^u%UHzV^cp3oK;LZE$?^>okbP*M3-1t$^_agl&B00n-Gq3cmCi2U!)MstuaC z9UwaAB(jM&$UxYKdGr`8A?!BE7=|JXFq_AC2g8#BFk3Q>T!SYzKdd?na+1GVKI5}< z=L_G?nYHHi^CZ7r*&rwNLEIy$Gl3ySx~pAoMx#JFlh~QL{c|qdoO?-X+3fT5={HFMKcG ze%O+A5BH424-43IV@nz3`!{=6`0mY~eqxtgvGsTU-N(e*&ed`7ueiSRm}J_+UptEz z-20$+FD+l}n8+&g2Y0t$clfd5vHfA!drdnn(q<%0KQ3GC7kNFN{|QrZpXIr)w_~c` zJn{P|Z7JjD{}3G5Y`V*Z8)ThMYd-UcGc6MnFCP*`}55S^l_q2gj3w zUp)6%&pa%!aGrZ1U`4FH^ObWK8^7}QZfTd~KXdfXYtJ7WxBLo-Iqnj1qKDm}T+ciG zw)5t>$DfyU*xyQ=@3_)(XXO_43ELa?l={4o4Q+AwC3F3Eu|d7#@r{)y{@z{tT&4Eh z*Ee(BPeyNNTXTppI2lQ3mPR)3%>L8$)?2|-{QVKoAa~y<8HN-_g1(5 zzW$?g>b=0iEv0j|1@9=bm~-zCI92kLuHc^9xnle4^uO=kz7Cd>p7WS#_Yut>GfJ9+ zcgxOQdPnh7AD3g>hscF9{$AL~v>~~ALG5-K?(e&GYdcW>Lq(EJZ%;S5GT(`zEujD7#+EY&nBQ2wys)TAz~CX#)ee~x`}hQOaYkJIvsENok+F5c>N{mq(pt^Jn4 zG09B*WuMEIP5h#$ERyw5Mrz{p=WmYr&UZdPFZ)mYxu_h0HdU+L(~Ga=CAiDE-)pkV ziYc^^0b7tLbLCF^1DW%F#zNMd_S-m_uNFVseEq$Z_CmShHwnMulq)=}&P_jT=^Qg} z=Y

nhJkewAXK*qs5o)U(p~HaNbX;*AZY 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

C+iE*Jk{RN_E|{+1=!8sP1~+RX%!8g9`G4 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ߜXn{ReL%36D{zBF-t{*dZO-^F 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 Pz`)??>gTe~DWM4fM|o>8 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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 literal 0 HcmV?d00001 diff --git a/tests/test_main.py b/tests/test_main.py index 0c8daf9d..3cc87335 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -874,4 +874,38 @@ def test_gs_raster_failure(spoof_no_tess_gs_raster_fail, resources, outpdf): 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 + env=spoof_tesseract_noop) + + +@pytest.mark.parametrize('image', [ + 'baiona.png', + 'baiona_gray.png', + ]) +def test_lossless_to_lossless(spoof_tesseract_noop, ocrmypdf_exec, + resources, image, 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_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) + assert pdfinfo[0]['images'][0]['enc'] != 'jpeg', \ + "Lossless compression changed to lossy!" + if im.mode.startswith('RGB') or im.mode.startswith('BGR'): + assert pdfinfo[0]['images'][0]['color'] == 'rgb', \ + "Colorspace changed" + elif im.mode.startswith('L'): + assert pdfinfo[0]['images'][0]['color'] == 'gray', \ + "Colorspace changed" \ No newline at end of file From bf04f03c4cb5c7e44e466d985ffc2bca532563ce Mon Sep 17 00:00:00 2001 From: "James R. Barlow" 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`QJ5V^duNkOtZC{|6Wt P7#KWV{an^LB{Ts5q!A+x delta 114 zcmeyihyB|g_6fyY4|q8EjSO?u(swo1ZmnfpbT`~g*U(7Uz#_!Z)XLP*%FsmDz{1MF zApYy!iwq15swJ)wB`Jv|saCo9DVb@N3`Pcq$Qlf+Oe`T9Uc@GTXJBAp@O1TaS?83{ F1OTQbBisN0 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"