From 7ed0f8f50eb81e31dfb59d11a46340b662a4655e Mon Sep 17 00:00:00 2001 From: Frank <50119297+FPille@users.noreply.github.com> Date: Tue, 7 May 2019 00:18:15 +0200 Subject: [PATCH 01/13] Add bash completion (#384) * Add bash completion file must be copied to completion folder e.g. /usr/share/bash-completion/completions --- misc/ocrmypdf | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 misc/ocrmypdf diff --git a/misc/ocrmypdf b/misc/ocrmypdf new file mode 100644 index 00000000..50d4a25e --- /dev/null +++ b/misc/ocrmypdf @@ -0,0 +1,87 @@ +# ocrmypdf completion -*- shell-script -*- + +_ocrmypdf() +{ + local cur prev cword words split + _init_completion -s || return + + case $prev in + --version|-h|--help) + return + ;; + --user-words|--user-patterns|--tesseract-config) + _filedir + return + ;; + --output-type) + COMPREPLY=( $( compgen -W 'pdfa pdf pdfa-1 pdfa-2 pdfa-3' -- \ + "$cur" ) ) + return + ;; + --pdf-renderer) + COMPREPLY=( $( compgen -W 'auto hocr sandwich' -- "$cur" ) ) + return + ;; + --pdfa-image-compression) + COMPREPLY=( $( compgen -W 'auto jpeg lossless' -- "$cur" ) ) + return + ;; + -O|--optimize|--tesseract-oem) + COMPREPLY=( $( compgen -W '{0..3}' -- "$cur" ) ) + return + ;; + --jpeg-quality|--png-quality) + COMPREPLY=( $( compgen -W '{0..100}' -- "$cur" ) ) + return + ;; + -l|--language) + COMPREPLY=$( command tesseract --list-langs 2>/dev/null ) + COMPREPLY=( $( compgen -W '${COMPREPLY[@]##*:}' -- "$cur" ) ) + return + ;; + --image-dpi|--oversample|--skip-big|--max-image-mpixels|\ + --tesseract-timeout|--rotate-pages-threshold) + COMPREPLY=( $( compgen -P "$cur" -W '{0..9}' ) ) + return + ;; + -j|--jobs) + COMPREPLY=( $( compgen -W '{1..'$( _ncpus )'}' -- "$cur" ) ) + return + ;; + -v|--verbose) + COMPREPLY=( $( compgen -W '{1..9}' -- "$cur" ) ) # max level ? + return + ;; + --tesseract-pagesegmode) + COMPREPLY=( $( compgen -W '{1..13}' -- "$cur" ) ) + return + ;; + --sidecar|--title|--author|--subject|--keywords|--unpaper-args) + # argument required but no completions available + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=( $( compgen -W '--language --image-dpi --output-type + --sidecar --version --jobs --quiet --verbose --title --author + --subject --keywords --rotate-pages --remove-background --deskew + --clean --clean-final --unpaper-args --oversample --remove-vectors + --mask-barcodes --threshold --force-ocr --skip-text --redo-ocr + --skip-big --jpeg-quality --png-quality --jbig2-lossy + --max-image-mpixels --tesseract-config --tesseract-pagesegmode + --help --tesseract-oem --pdf-renderer --tesseract-timeout + --rotate-pages-threshold --pdfa-image-compression --user-words + --user-patterns --keep-temporary-files --flowchart --output-type' \ + -- "$cur" ) ) + return + else + _filedir + return + fi +} && +complete -F _ocrmypdf ocrmypdf + +# ex: filetype=sh From 4d5e0eb749d82cb7a115b88c30a4c7c2b1c670a5 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 6 May 2019 18:07:41 -0700 Subject: [PATCH 02/13] docs: mention completions --- .pre-commit-config.yaml | 2 +- docs/installation.rst | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b9a75aff..b268b628 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,4 +3,4 @@ repos: rev: stable hooks: - id: black - language_version: python3.6 + language_version: python3.7 diff --git a/docs/installation.rst b/docs/installation.rst index 555ad0d5..014f769f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -490,3 +490,16 @@ To install all of the development and test requirements: pip install -r requirements/dev.txt -r requirements/test.txt To add JBIG2 encoding, see :ref:`jbig2`. + +Shell completions +----------------- + +Completions for ``bash`` and ``fish`` are available in the project's ``misc/`` folder. +The ``bash`` completions are likely ``zsh`` compatible but this has not been confirmed. +Package maintainers, please install these at the appropriate locations for your system. + +To manually install the ``bash`` completion, copy ``misc/ocrmypdf`` to +``/etc/bash_completion.d/``. + +To manually install the ``fish`` completion, copy ``misc/completions.fish`` to +``~/.config/fish/completions/ocrmypdf.fish``. From 0cd576e701550add496f3b063bc223ca87556af9 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 11 May 2019 10:52:42 -0700 Subject: [PATCH 03/13] Rename bash completions file --- misc/{ocrmypdf => completions.bash} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename misc/{ocrmypdf => completions.bash} (100%) diff --git a/misc/ocrmypdf b/misc/completions.bash similarity index 100% rename from misc/ocrmypdf rename to misc/completions.bash From bcdd19669917aa0b1e3d4aca945ebf569d83c8f3 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 11 May 2019 12:10:50 -0700 Subject: [PATCH 04/13] ghostscript: remove unnecessary post-render resizing step --- src/ocrmypdf/exec/ghostscript.py | 20 +------- tests/test_ghostscript.py | 81 ++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 18 deletions(-) create mode 100644 tests/test_ghostscript.py diff --git a/src/ocrmypdf/exec/ghostscript.py b/src/ocrmypdf/exec/ghostscript.py index af91960b..7973885a 100644 --- a/src/ocrmypdf/exec/ghostscript.py +++ b/src/ocrmypdf/exec/ghostscript.py @@ -129,8 +129,7 @@ def rasterize_pdf( :param filter_vector: if True, remove vector graphics objects :return: """ - res = xres, yres - int_res = round(xres), round(yres) + res = round(xres, 6), round(yres, 6) if not page_dpi: page_dpi = res @@ -145,7 +144,7 @@ def rasterize_pdf( f'-sDEVICE={raster_device}', f'-dFirstPage={pageno}', f'-dLastPage={pageno}', - f'-r{str(int_res[0])}x{str(int_res[1])}', + f'-r{res[0]:f}x{res[1]:f}', ] + (['-dFILTERVECTOR'] if filter_vector else []) + [ @@ -168,23 +167,8 @@ def rasterize_pdf( log.error('Ghostscript rasterizing failed') raise SubprocessOutputError() - # Ghostscript only accepts integers for output resolution - # if the resolution happens to be fractional, then the discrepancy - # would change the size of the output page, especially if the DPI - # is quite low. Resize the image to the expected size - tmp.seek(0) with Image.open(tmp) as im: - expected_size = ( - round(im.size[0] / int_res[0] * res[0]), - round(im.size[1] / int_res[1] * res[1]), - ) - if expected_size != im.size or page_dpi != (xres, yres): - log.debug( - f"Ghostscript: resize output image {im.size} -> {expected_size}" - ) - im = im.resize(expected_size) - if rotation is not None: log.debug("Rotating output by %i", rotation) # rotation is a clockwise angle and Image.ROTATE_* is diff --git a/tests/test_ghostscript.py b/tests/test_ghostscript.py new file mode 100644 index 00000000..8756e8a8 --- /dev/null +++ b/tests/test_ghostscript.py @@ -0,0 +1,81 @@ +# © 2019 James R. Barlow: github.com/jbarlow83 +# +# This file is part of OCRmyPDF. +# +# OCRmyPDF is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# OCRmyPDF is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OCRmyPDF. If not, see . + +import logging +from decimal import Decimal + +import pikepdf +import pytest +from PIL import Image + +from ocrmypdf.exec.ghostscript import rasterize_pdf + + +@pytest.fixture +def linn(resources): + path = resources / 'linn.pdf' + return path, pikepdf.open(path) + + +def test_rasterize_size(linn, outdir, caplog): + path, pdf = linn + page_size_pts = (pdf.pages[0].MediaBox[2], pdf.pages[0].MediaBox[3]) + assert pdf.pages[0].MediaBox[0] == pdf.pages[0].MediaBox[1] == 0 + page_size = (page_size_pts[0] / Decimal(72), page_size_pts[1] / Decimal(72)) + target_size = Decimal('200.0'), Decimal('150.0') + target_dpi = 42.0, 4242.0 + + log = logging.getLogger() + rasterize_pdf( + path, + outdir / 'out.png', + target_size[0] / page_size[0], + target_size[1] / page_size[1], + raster_device='pngmono', + log=log, + page_dpi=target_dpi, + ) + + with Image.open(outdir / 'out.png') as im: + assert im.size == target_size + assert im.info['dpi'] == target_dpi + + +def test_rasterize_rotated(linn, outdir, caplog): + path, pdf = linn + page_size_pts = (pdf.pages[0].MediaBox[2], pdf.pages[0].MediaBox[3]) + assert pdf.pages[0].MediaBox[0] == pdf.pages[0].MediaBox[1] == 0 + page_size = (page_size_pts[0] / Decimal(72), page_size_pts[1] / Decimal(72)) + target_size = Decimal('200.0'), Decimal('150.0') + target_dpi = 42.0, 4242.0 + + log = logging.getLogger() + caplog.set_level(logging.DEBUG) + rasterize_pdf( + path, + outdir / 'out.png', + target_size[0] / page_size[0], + target_size[1] / page_size[1], + raster_device='pngmono', + log=log, + page_dpi=target_dpi, + rotation=90, + ) + + with Image.open(outdir / 'out.png') as im: + assert im.size == (target_size[1], target_size[0]) + assert im.info['dpi'] == (target_dpi[1], target_dpi[0]) From 83398e54eaf6307436d51f74d228bfe2b49917f1 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 11 May 2019 12:22:21 -0700 Subject: [PATCH 05/13] weave: fix corruption of certain high page count files Corruption occurred when replacements was not incremented for multiple consecutive pages. --- src/ocrmypdf/_weave.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/ocrmypdf/_weave.py b/src/ocrmypdf/_weave.py index a66244a2..fb5f3c22 100644 --- a/src/ocrmypdf/_weave.py +++ b/src/ocrmypdf/_weave.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU General Public License # along with OCRmyPDF. If not, see . +from contextlib import suppress from itertools import groupby from pathlib import Path import os @@ -329,7 +330,8 @@ def weave_layers(infiles, output_file, log, context): pikepdf.Object.parse(b'[ /PDF /Text /ImageB /ImageC /ImageI ]') ) - replacements = 0 + replacements = 1 + interim_count = 0 # Iterate rest for page_num, layers in groups: @@ -405,13 +407,25 @@ def weave_layers(infiles, output_file, log, context): _update_page_resources( page=page0, font=font, font_key=font_key, procset=procset ) - interim = output_file + f'_working{page_num}.pdf' - pdf_base.save(interim) + + # We cannot read and write the same file, that will corrupt it + # but we don't to keep more copies than we need to. Delete intermediates. + # {interim_count} is the opened file we were updateing + # {interim_count - 1} can be deleted + # {interim_count + 1} is the new file will produce and open + old_file = output_file + f'_working{interim_count - 1}.pdf' + if not context.get_options().keep_temporary_files: + with suppress(FileNotFoundError): + os.unlink(old_file) + + next_file = output_file + f'_working{interim_count + 1}.pdf' + pdf_base.save(next_file) pdf_base.close() - pdf_base = pikepdf.open(interim) + pdf_base = pikepdf.open(next_file) procset = pdf_base.pages[0].Resources.ProcSet - font, font_key = None, None # Reacquire this information + font, font_key = None, None # Ensure we reacquire this information + interim_count += 1 _fix_toc(pdf_base, pagerefs, log) pdf_base.save(output_file) From 15a988b99960ce3249db032b030ff312104adf2d Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 11 May 2019 12:40:25 -0700 Subject: [PATCH 06/13] weave: use emplacement method, scrap TOC repair The new emplacement method updates page objects in place without generating new objgen numbers, meaning we no longer need to update the table of contents to preserve links. --- src/ocrmypdf/_weave.py | 128 +++++------------------------------------ tests/test_weave.py | 20 ------- 2 files changed, 14 insertions(+), 134 deletions(-) diff --git a/src/ocrmypdf/_weave.py b/src/ocrmypdf/_weave.py index fb5f3c22..6b3c8cdd 100644 --- a/src/ocrmypdf/_weave.py +++ b/src/ocrmypdf/_weave.py @@ -189,99 +189,6 @@ def _find_font(text, pdf_base): return None, None -def _traverse_toc(pdf_base, visitor_fn, log): - """ - Walk the table of contents, calling visitor_fn() at each node - - The /Outlines data structure is a messy data structure, but rather than - navigating hierarchically we just track unique nodes. Enqueue nodes when - we find them, and never visit them again. set() is awesome. We look for - the two types of object in the table of contents that can be page bookmarks - and update the page entry. - - """ - - visited = set() - queue = set() - link_keys = ('/Parent', '/First', '/Last', '/Prev', '/Next') - - if not '/Outlines' in pdf_base.root: - return - - queue.add(pdf_base.root.Outlines.objgen) - while queue: - objgen = queue.pop() - visited.add(objgen) - node = pdf_base.get_object(objgen) - log.debug('fix toc: exploring outline entries at %r', objgen) - - # Enumerate other nodes we could visit from here - for key in link_keys: - if key not in node: - continue - item = node[key] - if not item.is_indirect: - # Direct references are not allowed here, but it's not clear - # what we should do if we find any. Removing them is an option: - # node[key] = pdf_base.make_indirect(None) - continue - objgen = item.objgen - if objgen not in visited: - queue.add(objgen) - - if visitor_fn: - visitor_fn(pdf_base, node, log) - - -def _fix_toc(pdf_base, pageref_remap, log): - """Repair the table of contents - - Whenever we replace a page wholesale, it gets assigned a new objgen number - and other references to it within the PDF become invalid, most notably in - the table of contents (/Outlines in PDF-speak). In weave_layers we collect - pageref_remap, a mapping that describes the new objgen number given an old - one. (objgen is a tuple, and the gen is almost always zero.) - - It may ultimately be better to find a way to rebuild a page in place. - - """ - - if not pageref_remap: - return - - def remap_dest(dest_node): - """ - Inner helper function: change the objgen for any page from the old we - invalidated to its new one. - """ - try: - pageref = dest_node[0] - if pageref['/Type'] == '/Page' and pageref.objgen in pageref_remap: - new_objgen = pageref_remap[pageref.objgen] - dest_node[0] = pdf_base.get_object(new_objgen) - except (IndexError, TypeError) as e: - log.warning("This file may contain invalid table of contents entries") - log.debug(e) - - def visit_remap_dest(pdf_base, node, log): - """ - Visitor function to fix ToC entries - - Test for the two types of references to pages that can occur in ToCs. - Both types have the same final format (an indirect reference to the - target page). - """ - if '/Dest' in node: - # /Dest reference to another page (old method) - remap_dest(node['/Dest']) - elif '/A' in node: - # /A (action) command set to "GoTo" (newer method) - if '/S' in node['/A'] and node['/A']['/S'] == '/GoTo': - remap_dest(node['/A']['/D']) - - _traverse_toc(pdf_base, visit_remap_dest, log) - - def weave_layers(infiles, output_file, log, context): """Apply text layer and/or image layer changes to baseline file @@ -324,13 +231,12 @@ def weave_layers(infiles, output_file, log, context): pdf_base = pikepdf.open(path_base) font, font_key, procset = None, None, None pdfinfo = context.get_pdfinfo() - pagerefs = {} procset = pdf_base.make_indirect( pikepdf.Object.parse(b'[ /PDF /Text /ImageB /ImageC /ImageI ]') ) - replacements = 1 + emplacements = 1 interim_count = 0 # Iterate rest @@ -345,30 +251,25 @@ def weave_layers(infiles, output_file, log, context): if text and not font: font, font_key = _find_font(text, pdf_base) - replacing = False + emplaced_page = False content_rotation = pdfinfo[page_num - 1].rotation path_image = Path(image).resolve() if image else None if path_image is not None and path_image != path_base: - # We are replacing the old page with a rasterized PDF of the new - # page - log.debug("Replace") - old_objgen = pdf_base.pages[page_num - 1].objgen - + # We are updating the old page with a rasterized PDF of the new + # page (without changing objgen, to preserve references) + log.debug("Emplacement update") with pikepdf.open(image) as pdf_image: - replacements += 1 - image_page = pdf_image.pages[0] - pdf_base.pages[page_num - 1] = image_page - - # We're adding a new page, which will get a new objgen number pair, - # so we need to update any references to it. qpdf did not like - # my attempt to update the old object in place, but that is an - # option to consider - pagerefs[old_objgen] = pdf_base.pages[page_num - 1].objgen - replacing = True + emplacements += 1 + foreign_image_page = pdf_image.pages[0] + pdf_base.pages.append(foreign_image_page) + local_image_page = pdf_base.pages[-1] + pdf_base.pages[page_num - 1].emplace(local_image_page) + del pdf_base.pages[-1] + emplaced_page = True autorotate_correction = context.get_rotation(page_num - 1) - if replacing: + if emplaced_page: content_rotation = autorotate_correction text_rotation = autorotate_correction text_misaligned = (text_rotation - content_rotation) % 360 @@ -397,7 +298,7 @@ def weave_layers(infiles, output_file, log, context): content_rotation - autorotate_correction ) % 360 - if replacements % MAX_REPLACE_PAGES == 0: + if emplacements % MAX_REPLACE_PAGES == 0: # Periodically save and reload the Pdf object. This will keep a # lid on our memory usage for very large files. Attach the font to # page 1 even if page 1 doesn't use it, so we have a way to get it @@ -427,6 +328,5 @@ def weave_layers(infiles, output_file, log, context): font, font_key = None, None # Ensure we reacquire this information interim_count += 1 - _fix_toc(pdf_base, pagerefs, log) pdf_base.save(output_file) pdf_base.close() diff --git a/tests/test_weave.py b/tests/test_weave.py index 372eddca..a603673b 100644 --- a/tests/test_weave.py +++ b/tests/test_weave.py @@ -15,35 +15,15 @@ # You should have received a copy of the GNU General Public License # along with OCRmyPDF. If not, see . -from unittest.mock import MagicMock -import logging import os import pytest import pikepdf -from ocrmypdf._weave import _fix_toc, _update_page_resources check_ocrmypdf = pytest.helpers.check_ocrmypdf -def test_invalid_toc(resources, outdir, caplog): - pdf = pikepdf.open(resources / 'toc.pdf') - - # Corrupt a TOC entry - pdf.Root.Outlines.Last.Dest = pikepdf.Array([None, 0.0, 0.1, 0.2]) - pdf.save(outdir / 'test.pdf') - - pdf = pikepdf.open(outdir / 'test.pdf') - remap = {} - remap[pdf.pages[0].objgen] = pdf.pages[0].objgen # Dummy remap - - # Confirm we complain about the TOC and don't throw an exception - log = logging.getLogger() - _fix_toc(pdf, remap, log) - assert 'invalid table of contents entries' in caplog.text - - def test_no_glyphless_weave(resources, outdir): pdf = pikepdf.open(resources / 'francais.pdf') pdf_aspect = pikepdf.open(resources / 'aspect.pdf') From 482cb788ed79e13df462d0b990a7b6317b679d9e Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 11 May 2019 12:44:17 -0700 Subject: [PATCH 07/13] Don't use MagicMock() as a dummy logger in pytest --- tests/test_metadata.py | 11 ++++++----- tests/test_unpaper.py | 5 +++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/test_metadata.py b/tests/test_metadata.py index be1d952c..442c71a1 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -285,7 +285,7 @@ def test_kodak_toc(resources, outpdf, spoof_tesseract_noop): assert isinstance(p.root.Outlines.First, pikepdf.Dictionary) -def test_metadata_fixup_warning(resources, outdir): +def test_metadata_fixup_warning(resources, outdir, caplog): from ocrmypdf._pipeline import metadata_fixup input_files = [ @@ -296,7 +296,7 @@ def test_metadata_fixup_warning(resources, outdir): for f in input_files: copyfile(resources / 'graph.pdf', f) - log = MagicMock() + log = logging.getLogger() context = MagicMock() metadata_fixup( input_files_groups=input_files, @@ -304,7 +304,8 @@ def test_metadata_fixup_warning(resources, outdir): log=log, context=context, ) - log.warning.assert_not_called() + for record in caplog.records: + assert record.levelname != 'WARNING' # Now add some metadata that will not be copyable graph = pikepdf.open(outdir / 'graph.repaired.pdf') @@ -312,7 +313,7 @@ def test_metadata_fixup_warning(resources, outdir): meta['prism2:publicationName'] = 'OCRmyPDF Test' graph.save(outdir / 'graph.repaired.pdf') - log = MagicMock() + log = logging.getLogger() context = MagicMock() metadata_fixup( input_files_groups=input_files, @@ -320,7 +321,7 @@ def test_metadata_fixup_warning(resources, outdir): log=log, context=context, ) - log.warning.assert_called_once() + assert any(record.levelname == 'WARNING' for record in caplog.records) def test_prevent_gs_invalid_xml(resources, outdir): diff --git a/tests/test_unpaper.py b/tests/test_unpaper.py index 23f6d698..3133f63c 100644 --- a/tests/test_unpaper.py +++ b/tests/test_unpaper.py @@ -16,9 +16,10 @@ # along with OCRmyPDF. If not, see . import argparse +import logging from os import fspath from pathlib import Path -from unittest.mock import MagicMock, patch +from unittest.mock import patch import pytest @@ -57,7 +58,7 @@ def test_no_unpaper(resources, no_outpdf): with patch("ocrmypdf.exec.unpaper.version") as mock_unpaper_version: mock_unpaper_version.side_effect = FileNotFoundError("unpaper") with pytest.raises(SystemExit): - main.check_options(options, log=MagicMock()) + main.check_options(options, log=logging.getLogger()) def test_old_unpaper(spoof_unpaper_oldversion, resources, no_outpdf): From 7dea0a836259741dab7242d669655ba9456605de Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 11 May 2019 12:50:44 -0700 Subject: [PATCH 08/13] v8.3.0 release notes in progress --- docs/release_notes.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 26d62161..46634f79 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -13,6 +13,21 @@ Note that it is licensed under GPLv3, so scripts that ``import ocrmypdf`` and ar find: [^`]\#([0-9]{1,3})[^0-9] replace: `#$1 `_ +v8.3.0 +------ + +- Improved the strategy for replacing pages, emplacing the contents in an existing page. This preserves any types of references to the original page, and eliminates the need to manually fix the table of contents. + +- For PDFs with more than 100 pages and a sequence where one PDF page was replaced and one or more subsequent ones were skipped, an intermediate file would be corrupted while grafting OCR text, causing processing to fail. + +- Previously, we resized the images produced by Ghostscript by a small number of pixels to ensure the output image size was an exactly what we wanted. Having discovered a way to get Ghostscript to produce the exact image sizes we require, we eliminated the resizing step. + +- Command line completions for ``bash`` are now available, in addition to ``fish``, both in ``misc/``. Package maintainers, please install these so users can take advantage. + +- Updated requirements. + +- pikepdf 1.3.0 is now required. + v8.2.4 ------ @@ -22,7 +37,7 @@ v8.2.4 - Minor optimization: we no longer traverse the table of contents to ensure all references in it are resolved, as changes to libqpdf have made this unnecessary. -- pikepdf 1.2.0 is now required +- pikepdf 1.2.0 is now required. v8.2.3 ------ From c2fecffdb4f406f2572cb065eac5da213c016da6 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sun, 12 May 2019 02:16:05 -0700 Subject: [PATCH 09/13] Require pikepdf 1.3.0 --- requirements/main.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/main.txt b/requirements/main.txt index 95dfc51b..383d7189 100644 --- a/requirements/main.txt +++ b/requirements/main.txt @@ -5,7 +5,7 @@ chardet == 3.0.4 cffi == 1.12.2 img2pdf == 0.3.3 pdfminer.six == 20181108 -pikepdf == 1.2.0 +pikepdf == 1.3.0 Pillow >= 5.0.0, != 5.1.0 ; sys_platform == "darwin" pycparser == 2.19 python-xmp-toolkit == 2.0.1 diff --git a/setup.py b/setup.py index 81003662..b5c959ea 100644 --- a/setup.py +++ b/setup.py @@ -99,7 +99,7 @@ setup( 'cffi >= 1.9.1', # must be a setup and install requirement 'img2pdf >= 0.3.0, < 0.4', # pure Python, so track HEAD closely 'pdfminer.six == 20181108 ; sys_platform != "darwin"', - 'pikepdf >= 1.2.0, < 2', + 'pikepdf >= 1.3.0, < 2', 'Pillow >= 4.0.0, != 5.1.0 ; sys_platform == "darwin"', # Pillow < 4 has BytesIO/TIFF bug w/img2pdf 0.2.3 # block 5.1.0, broken wheels From 5adbddd1f9c2fe979b3786ba106ac0cee1a0c86c Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sun, 12 May 2019 03:36:07 -0700 Subject: [PATCH 10/13] ghostscript: rendering threads has no effect on pdfwrite, so remove it See https://www.ghostscript.com/doc/current/Language.htm --- src/ocrmypdf/exec/ghostscript.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ocrmypdf/exec/ghostscript.py b/src/ocrmypdf/exec/ghostscript.py index 7973885a..70497092 100644 --- a/src/ocrmypdf/exec/ghostscript.py +++ b/src/ocrmypdf/exec/ghostscript.py @@ -253,7 +253,6 @@ def generate_pdfa( "-dBATCH", "-dNOPAUSE", "-dCompatibilityLevel=" + str(pdf_version), - "-dNumRenderingThreads=" + str(threads), "-sDEVICE=pdfwrite", "-dAutoRotatePages=/None", "-sColorConversionStrategy=" + strategy, From 0a72c12ff00e8328f7bfcb488d7c2a5d5b7453f1 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sun, 12 May 2019 03:36:33 -0700 Subject: [PATCH 11/13] weave: add new test for link consistency --- tests/resources/link.pdf | Bin 0 -> 72954 bytes tests/test_weave.py | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 tests/resources/link.pdf diff --git a/tests/resources/link.pdf b/tests/resources/link.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2633d975066f3f5a50cbbfb228d57f5290a4ad59 GIT binary patch literal 72954 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
WF<-_yI7LOh{ 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΅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 Date: Sun, 12 May 2019 03:36:41 -0700 Subject: [PATCH 12/13] v8.3.0 notes: clarify --- docs/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 46634f79..e646d038 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -16,7 +16,7 @@ Note that it is licensed under GPLv3, so scripts that ``import ocrmypdf`` and ar v8.3.0 ------ -- Improved the strategy for replacing pages, emplacing the contents in an existing page. This preserves any types of references to the original page, and eliminates the need to manually fix the table of contents. +- Improved the strategy for updating pages when a new image of the page was produced. We know attempt to preserve more content from the original file, for annotations in particular. - For PDFs with more than 100 pages and a sequence where one PDF page was replaced and one or more subsequent ones were skipped, an intermediate file would be corrupted while grafting OCR text, causing processing to fail. From 7e388f59af13aa5907233e7b9b84d9d0c7cdf021 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Mon, 13 May 2019 00:22:52 -0700 Subject: [PATCH 13/13] Move completions to better location/Homebrew compat --- docs/installation.rst | 13 +++++++------ docs/release_notes.rst | 2 +- misc/{completions.bash => completion/ocrmypdf.bash} | 0 misc/{completions.fish => completion/ocrmypdf.fish} | 0 4 files changed, 8 insertions(+), 7 deletions(-) rename misc/{completions.bash => completion/ocrmypdf.bash} (100%) rename misc/{completions.fish => completion/ocrmypdf.fish} (100%) diff --git a/docs/installation.rst b/docs/installation.rst index 014f769f..59f9d58e 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -494,12 +494,13 @@ To add JBIG2 encoding, see :ref:`jbig2`. Shell completions ----------------- -Completions for ``bash`` and ``fish`` are available in the project's ``misc/`` folder. -The ``bash`` completions are likely ``zsh`` compatible but this has not been confirmed. -Package maintainers, please install these at the appropriate locations for your system. +Completions for ``bash`` and ``fish`` are available in the project's +``misc/completion`` folder. The ``bash`` completions are likely ``zsh`` +compatible but this has not been confirmed. Package maintainers, please install +these at the appropriate locations for your system. -To manually install the ``bash`` completion, copy ``misc/ocrmypdf`` to -``/etc/bash_completion.d/``. +To manually install the ``bash`` completion, copy ``misc/completion/ocrmypdf.bash`` to +``/etc/bash_completion.d/ocrmypdf`` (rename the file). -To manually install the ``fish`` completion, copy ``misc/completions.fish`` to +To manually install the ``fish`` completion, copy ``misc/completion/ocrmypdf.fish`` to ``~/.config/fish/completions/ocrmypdf.fish``. diff --git a/docs/release_notes.rst b/docs/release_notes.rst index e646d038..6af0f263 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -22,7 +22,7 @@ v8.3.0 - Previously, we resized the images produced by Ghostscript by a small number of pixels to ensure the output image size was an exactly what we wanted. Having discovered a way to get Ghostscript to produce the exact image sizes we require, we eliminated the resizing step. -- Command line completions for ``bash`` are now available, in addition to ``fish``, both in ``misc/``. Package maintainers, please install these so users can take advantage. +- Command line completions for ``bash`` are now available, in addition to ``fish``, both in ``misc/completion``. Package maintainers, please install these so users can take advantage. - Updated requirements. diff --git a/misc/completions.bash b/misc/completion/ocrmypdf.bash similarity index 100% rename from misc/completions.bash rename to misc/completion/ocrmypdf.bash diff --git a/misc/completions.fish b/misc/completion/ocrmypdf.fish similarity index 100% rename from misc/completions.fish rename to misc/completion/ocrmypdf.fish