Compare commits

...
82 Commits
Author SHA1 Message Date
James R. Barlow 1d09061130 Revert previous commit amd reject input images with alpha channel
Decided on this for simplicity of old release branch.

Modifies baiona.png by stripping
alpha, adds baiona_alpha which
includes the alpha.
2018-07-31 23:45:28 -07:00
James R. Barlow a2203b2447 Discard alpha channel when triaging images 2018-07-25 22:23:41 -04:00
James R. Barlow 6a302fdb88 Travis: nevermind xenial, then
Gave a weird build error
2018-07-12 03:27:40 -07:00
James R. Barlow 1d9cc239ee Travis: Fix v6 build failures 2018-07-12 03:22:03 -07:00
James R. Barlow d240fc1ea6 Update release notes for v6.2.2 2018-07-12 03:07:47 -07:00
James R. Barlow e7d21dd826 Skip locale check on Python 3.7 2018-07-12 03:03:34 -07:00
James R. Barlow e774b4650b ocrmypdf.exec: trap FileNotFoundError too 2018-07-12 03:01:01 -07:00
James R. Barlow 8f8e6dcdd4 Fix problem iterating ruffus exceptions and rotate-pages-threshold parameter validation 2018-07-12 02:59:38 -07:00
James R. Barlow 5252b88f0f Travis: modernize with v7.0.0 updates
Travis: add 3.7 testing
Travis: remove deploy to testpypi since it's broken
Travis: cherry-pick change to declarative APT
From efb9572
Removed pngquant
Travis: Remove linux_before_install.sh
Eliminate Homebrew autobrewing
2018-07-12 02:47:29 -07:00
James R. Barlow ea69883386 Tests: Speed up a slow test (cherry-picked from v7) 2018-07-12 02:47:15 -07:00
James R. Barlow eb343b1e37 Tests: Add ability to disable use of cache (cherrypicked from v7) 2018-07-12 02:46:53 -07:00
James R. Barlow 9f02de55be main: do better parameter validation 2018-07-12 02:46:52 -07:00
James R. Barlow 7394a4cf49 Cherrypick warning about --user-words not having any effect
Might be available in full release of Tess4
2018-07-12 02:46:34 -07:00
James R. Barlow ed9fb110b1 Fix a comment about Tesseract behavior in certain versions 2018-07-12 02:46:34 -07:00
James R. Barlow 4650074428 Cherrypick Python 3.7 documentation updates from v7.0.0
From b0eacd6
2018-07-12 02:45:51 -07:00
James R. Barlow 70aa644c10 Backport Python 3.7 fix for ruffus 2.7.0 from ocrmypdf v7.0.0 2018-07-12 02:45:51 -07:00
James R. Barlow 2ccb3edc58 Ignore masks when deciding what color to rasterize at 2018-07-12 02:45:51 -07:00
James R. Barlow 1f40a70554 Use qpdf 8.0.2 backport, force old pytest-timeout to fix build 2018-06-23 03:14:18 -07:00
James R. Barlow e14ffbf03f v6.2.1 release notes 2018-06-23 03:01:54 -07:00
James R. Barlow 25a1dde57c Fix recent versions of tesseract not registering as textonly_pdf
This change happened sometime after the 4.0.0-beta1 release in
Ubuntu 18.04
2018-06-23 02:59:22 -07:00
jbarlow83andGitHub 1d10eac764 Add wiki link to issue template
[ci skip]
2018-06-06 12:59:59 -07:00
jbarlow83andGitHub 3f868118cd Remove gpg
[ci skip]
2018-06-06 12:58:02 -07:00
Fabian Rodriguezandjbarlow83 c7cf041e4a Fixed language option example (French) (#266)
Replace fre to fra.
2018-05-10 00:10:27 -07:00
James R. Barlow 38ab03655b Restore unpaper
It's a suggested/recommended dep not required in Deb/Ubu.
2018-05-06 21:36:12 -07:00
James R. Barlow 9226f8a5d1 Trap PDF/A-3 errors on old Ghostscript 2018-05-04 15:29:43 -07:00
James R. Barlow 5c8a007f3e Fix failure to prevent use of Ghostscript on /UserUnit files 2018-05-04 13:34:34 -07:00
James R. Barlow b3ad3e297d v6.2.0 fixes 2018-05-03 17:04:23 -07:00
James R. Barlow d607553e48 v6.2.0 Release notes 2018-05-03 16:47:21 -07:00
James R. Barlow 7cf83c77ca Merge branch 'feature/pdfa3' 2018-05-03 16:45:57 -07:00
James R. Barlow 8a9f174f63 Fix XMP validation issue with /CreationDate
Related to previous validation issue. If the /CreationDate had no
timezone, Ghostscript also creates invalid metadata. Work around this.
Also fix up PDF date decoding, and transcode dates to standardize them.
2018-05-03 16:30:20 -07:00
James R. Barlow 98a0786c32 Add 18.04 update procedure 2018-05-03 13:55:16 -07:00
James R. Barlow df1129724c Update Dockerfile for Ubuntu 18.04 2018-05-03 01:27:13 -07:00
James R. Barlow 383e726d65 Expand size growth reasons to other arguments that trigger transcoding 2018-04-27 19:34:57 -07:00
James R. Barlow 2131ad4670 Fix --remove-background error on PDFs with colormapped images
It's unclear how exactly a
colormapped image gets to this
spot given the tendency of other
image processing tools to flatten
such images, but someone made it happen, so now we make sure
the image is okay.

Closes #262
2018-04-27 17:21:01 -07:00
James R. Barlow 219fe2155b test_pageinfo: remove duplicate import 2018-04-27 17:16:42 -07:00
James R. Barlow 4209034d20 Add gpg key to issue template 2018-04-27 15:51:26 -07:00
James R. Barlow abcae0c2a4 Fix helpers.py again 2018-04-25 22:10:51 -07:00
James R. Barlow 0934905493 Don't suppress error message from config_notfound
Since it showed up in s390x bionic
2018-04-25 21:58:18 -07:00
James R. Barlow 11cd6201d9 helpers: fix missing call to complain()
In practice this is probably unreachable.
2018-04-25 21:57:50 -07:00
James R. Barlow df87e21c85 Add support for PDF/A-3
No ability to attach files however
2018-04-20 00:06:55 -07:00
Hugoandjbarlow83 d761d80750 Use more standard __version__ rather than PILLOW_VERSION (#257) 2018-04-19 23:35:32 -07:00
James R. Barlow 0b10db91be Fix regression: Disable Ghostscript JPEG passthrough entirely 2018-04-17 17:00:24 -07:00
James R. Barlow 1a516b2af9 Fix regression: time stamp test suite failures 2018-04-17 16:59:21 -07:00
James R. Barlow 076363d78e Disable JPEG passthrough for Ghostscript 9.23
Seems to corrupt JPEGs involved in image masks?
2018-04-17 16:31:03 -07:00
James R. Barlow 5fde214290 Update notes for v6.1.5 2018-04-17 15:23:35 -07:00
James R. Barlow a620724d6a Fix PDF/A validation failure due to timezone being omitted from /ModDate 2018-04-17 15:16:48 -07:00
James R. Barlow 7368399f8b Clarify license of two test files - https://github.com/jbarlow83/OCRmyPDF/issues/254 2018-04-17 11:56:36 -07:00
James R. Barlow 34c78a892a Fix list table for tests/resources
[ci skip]
2018-04-15 23:52:19 -07:00
James R. Barlow 9d28879505 Update Ubuntu 14.04 instructions
Closes #252
2018-04-14 17:30:33 -07:00
James R. Barlow 2482296e2b hocr: avoid division by zero
Issue #253 - PDF that produces the error is not available, but if font_width
is zero, chances are the text is nonprinting characters, so suppress it.
2018-04-14 17:24:21 -07:00
James R. Barlow 7fc897e6dc Fix NameError 'ghostscript' 2018-04-12 21:24:05 -07:00
James R. Barlow 9b731d63b8 Set Ghostscript -sColorConversionStrategy the way old/new versions expect 2018-04-12 16:28:48 -07:00
James R. Barlow 10aa59f674 v6.1.4 fix test suite regression with Ghostscript 9.23 2018-04-12 15:16:54 -07:00
James R. Barlow 1f7837e7b1 v6.1.4 release notes update 2018-04-12 00:55:45 -07:00
James R. Barlow ba0535e3fb Update test cache to account for unpaper --layout none change 2018-04-12 00:48:21 -07:00
James R. Barlow 49fa7f6b5c tesseract_cache: don't reveal host system file paths in manifest file 2018-04-12 00:47:28 -07:00
James R. Barlow c95db246d4 v6.1.4 merge 2018-04-11 15:58:00 -07:00
James R. Barlow 1ba93371ce docs: Update installation to reflect qpdf 7.0.0 requirement 2018-04-11 15:40:50 -07:00
James R. Barlow fedbbdb575 Travis: compile qpdf from source
The older version in Travis's Ubuntu 14.04 can't pass the test suite anymore.
2018-04-11 15:40:45 -07:00
James R. Barlow 85ebba72bc Fix setup.py syntax 2018-04-10 18:30:48 -07:00
James R. Barlow b6cd436d5d setup: Blacklist Pillow 5.1.0 on macos
https://github.com/python-pillow/Pillow/issues/3068
2018-04-10 18:15:37 -07:00
James R. Barlow ec170c7e1e Travis: use setup.py for requirements, don't override with .txt 2018-04-10 17:52:19 -07:00
James R. Barlow 3d69b46fca Release notes 2018-04-10 15:53:02 -07:00
James R. Barlow 4b6153ad18 Use defusedxml for XML parsing when reading XMP 2018-04-10 14:25:13 -07:00
James R. Barlow 75d37eb103 docs: expand ocr of image usage 2018-04-09 13:06:09 -07:00
James R. Barlow 11b6f77df0 unpaper: close images on error paths 2018-04-09 13:05:12 -07:00
James R. Barlow db8b0319dd get_version: repeat system error messages if the process exists with a signal 2018-04-09 13:04:51 -07:00
James R. Barlow d1d4f1e198 Add issue links to release notes 2018-04-06 14:52:40 -07:00
James R. Barlow be41ff6d54 Update flowchart
[ci skip]
2018-04-05 21:26:37 -07:00
James R. Barlow 1dbb6f1746 Notes on relevant envvars, repology 2018-04-05 02:15:01 -07:00
James R. Barlow 753e6274ab Tell unpaper to use --layout none so it won't blank out multi column text 2018-04-05 02:14:33 -07:00
James R. Barlow 7f462c618b v6.1.3 notes 2018-04-03 00:11:20 -07:00
James R. Barlow 1b01d45dd2 Warn about Python 3.5 page count issue 2018-04-02 19:29:17 -07:00
James R. Barlow 7a1cd39b21 Fix creation date metadata lost from input
Closes #247
2018-04-02 17:53:39 -07:00
James R. Barlow 1c1fd9616a Don't depend on pytest-xdist in setup.cfg 2018-04-02 11:45:03 -07:00
Sean Whittonandjbarlow83 11e19e4085 remove addopts key from tool:pytest section of setup.cfg (#246)
The '-n' command line argument is not supported by recent pytest.
2018-04-02 14:43:38 -04:00
James R. Barlow 2a43f73228 Update installation.rst, further info on fitz 2018-04-02 11:32:57 -07:00
James R. Barlow b1d1310a75 Dockerfile: use fitz 2018-04-02 11:08:03 -07:00
James R. Barlow 0e7fa78e65 Remove inaccurate statement from setup.py 2018-04-01 13:20:17 -07:00
James R. Barlow 4032570d97 Change docs for fitz/PyMuPDF 2018-04-01 13:19:57 -07:00
James R. Barlow 90644a3017 pipeline: refactoring, use with block for images 2018-03-31 13:26:40 -07:00
James R. Barlow 4f6bffb477 Update copyrights 2018-03-31 11:54:38 -07:00
93 changed files with 2216 additions and 1040 deletions
+8 -12
View File
@@ -1,22 +1,18 @@
# OCRmyPDF
#
FROM ubuntu:17.10
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y --no-install-recommends \
software-properties-common python-software-properties \
python3-wheel \
python3-reportlab \
python3-venv \
ghostscript \
qpdf \
poppler-utils \
ocrmypdf \
unpaper \
libffi-dev \
tesseract-ocr \
tesseract-ocr-eng \
tesseract-ocr-fra \
tesseract-ocr-deu \
tesseract-ocr-spa \
tesseract-ocr-deu
tesseract-ocr-por \
tesseract-ocr-chi-sim \
python3-venv \
python3-pip
ENV LANG=C.UTF-8
@@ -28,7 +24,7 @@ RUN python3 -m venv --system-site-packages /appenv
# (i.e. "pip install ."). It's unclear to me why this is the case.
RUN . /appenv/bin/activate; \
pip install --upgrade pip \
&& pip install ocrmypdf
&& pip install ocrmypdf[fitz]
# Now copy the application in, mainly to get the test suite.
# Do this now to make the best use of Docker cache.
-64
View File
@@ -1,64 +0,0 @@
# OCRmyPDF
#
FROM ubuntu:17.10
RUN apt-get update && apt-get install -y --no-install-recommends \
software-properties-common python-software-properties \
python3-wheel \
python3-reportlab \
python3-venv \
ghostscript \
qpdf \
poppler-utils \
unpaper \
libffi-dev
RUN add-apt-repository ppa:alex-p/tesseract-ocr
RUN apt-get update \
&& apt-get autoremove -y \
&& apt-get install -y --no-install-recommends \
tesseract-ocr \
tesseract-ocr-eng \
tesseract-ocr-fra \
tesseract-ocr-deu \
tesseract-ocr-spa \
tesseract-ocr-por \
tesseract-ocr-ara \
tesseract-ocr-rus \
tesseract-ocr-chi-sim
ENV LANG=C.UTF-8
RUN python3 -m venv --system-site-packages /appenv
# This installs the latest binary wheel instead of the code in the current
# folder. Installing from source will fail, apparently because cffi needs
# build-essentials (gcc) to do a source installation
# (i.e. "pip install ."). It's unclear to me why this is the case.
RUN . /appenv/bin/activate; \
pip install --upgrade pip \
&& pip install ocrmypdf
# Now copy the application in, mainly to get the test suite.
# Do this now to make the best use of Docker cache.
COPY . /application
RUN . /appenv/bin/activate; \
pip install -r /application/test_requirements.txt
# Remove the junk, including the source version of application since it was
# already installed
RUN rm -rf /tmp/* /var/tmp/* /root/* /application/ocrmypdf \
&& apt-get autoremove -y \
&& apt-get autoclean -y
RUN useradd docker \
&& mkdir /home/docker \
&& chown docker:docker /home/docker
USER docker
WORKDIR /home/docker
# Must use array form of ENTRYPOINT
# Non-array form does not append other arguments, because that is "intuitive"
ENTRYPOINT ["/application/.docker/docker-wrapper.sh"]
+3 -1
View File
@@ -1,3 +1,5 @@
Please include the command line and (if needed) a test file with your issue report.
Please include the command line and a test file with your issue report.
If possible, please use a test file that we can include in future test cases (no personal information, no copyrighted material).
If you wish to encrypt a test file for the OCRmyPDF maintainer only, see the [Wiki](https://github.com/jbarlow83/OCRmyPDF/wiki).
+4 -1
View File
@@ -2,12 +2,14 @@
*.pyc
*.sublime-*
venv*/
.venv/
pyvenv.cfg
tasks.py
.bash_history
.ruffus_history.sqlite
.idea/
.pytest_cache/
.pylintrc
# Package building
*.egg-info/
@@ -41,4 +43,5 @@ tmp/
pdfbox-app*.jar
.vscode/
IDEAS
_Dockerfile.local
_Dockerfile.local
/scratch.py
+33 -38
View File
@@ -3,30 +3,49 @@ language: python
cache:
pip: true
directories:
- packages
- $HOME/Library/Caches/Homebrew
env:
global:
- secure: "hsf6MT+n2x3OiDM2fQyJZdV0/PWYmv81LdVqC6cfnHBE/8N3DloJRqQ7WfO14TxhiK9PEC7MpyCj0lSabUHEO7gSH6Vks6I1asoSkt8S9/bSMlhT4hei+pwVpeGEiU5xHVATNjY+D919VC3IFvc3XmjT74h/2SLhaZ+jhEmDggM=" # HOMEBREW_OCRMYPDF_TOKEN
addons:
apt:
update: true
sources:
- sourceline: 'ppa:alex-p/tesseract-ocr'
- sourceline: 'ppa:heyarje/libav-11'
- sourceline: 'ppa:vshn/ghostscript'
packages:
- ghostscript
- libavcodec56
- libavformat56
- libavutil54
- libffi-dev
- poppler-utils
- qpdf
- tesseract-ocr
- tesseract-ocr-deu
- tesseract-ocr-eng
- tesseract-ocr-fra
matrix:
include:
- os: linux
sudo: required
language: python
python: 3.5
python: "3.5"
env: EXTRAS=
- os: linux
sudo: required
language: python
python: 3.6
python: "3.6"
env: EXTRAS=
- os: linux
sudo: required
language: python
python: 3.6
python: "3.6"
env: EXTRAS=[fitz]
- os: linux
sudo: required
language: python
python: "3.7-dev"
- os: osx
osx_image: xcode8
language: generic
@@ -41,7 +60,10 @@ before_cache:
before_install: |
if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
bash .travis/linux_before_install.sh
pip install --upgrade pip
mkdir -p packages
wget -q 'https://www.dropbox.com/s/vaq0kbwi6e6au80/unpaper_6.1-1.deb?raw=1' -O packages/unpaper_6.1-1.deb
sudo dpkg -i packages/unpaper_6.1-1.deb
elif [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
brew update && brew bundle --file=.travis/Brewfile
pip3 install --upgrade pip
@@ -49,13 +71,14 @@ before_install: |
fi
install:
- pip3 install pycparser # py3.7 workaround for https://github.com/eliben/pycparser/issues/251
- pip3 install ".$EXTRAS"
- pip3 install -r requirements.txt -r test_requirements.txt
- pip3 install -r test_requirements.txt
script:
- tesseract --version
- qpdf --version
- pytest
- pytest -n auto
deploy:
# release for main pypi
@@ -73,31 +96,3 @@ deploy:
tags: true
condition: $TRAVIS_PYTHON_VERSION == "3.6" && $TRAVIS_OS_NAME == "linux" && $EXTRAS == ""
skip_upload_docs: true
# test pypi
- provider: pypi
server: https://testpypi.pypi.org/legacy/
user: ocrmypdf-travis
password:
secure: "DTFOmmNL6olA0+yXvp4u9jXZlZeqrJsJ0526jzqf4a3gZ6jnGTq5UI6WzRsslSyoMMfXKtHQebqHM6ogSgCZinyZ3ufHJo8fn9brxbEc2gsiWkbj5o3bGwdWMT1vNNE7XW0VCpw87rZ1EEwjl4FJHFudMlPR1yfU5+uq0k0PACo="
distributions: "sdist"
on:
branch: develop
tags: false
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: /usr/bin/true
on:
branch: master
tags: true
condition: $TRAVIS_OS_NAME == "osx"
after_deploy: |
if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
bash .travis/osx_brew.sh
fi
-93
View File
@@ -1,93 +0,0 @@
#!/usr/bin/env python3
# © 2017-18 James R. Barlow: github.com/jbarlow83
from string import Template
from subprocess import run, PIPE
import re
recipe_template = Template("""
class Ocrmypdf < Formula
include Language::Python::Virtualenv
desc "Adds an OCR text layer to scanned PDF files"
homepage "https://github.com/jbarlow83/OCRmyPDF"
${ocrmypdf_url}
${ocrmypdf_sha256}
depends_on "pkg-config" => :build
depends_on "mupdf-tools" => :build # statically links libmupdf.a
depends_on "freetype"
depends_on "ghostscript"
depends_on "jpeg"
depends_on "libpng"
depends_on "python"
depends_on "qpdf"
depends_on "tesseract"
depends_on "unpaper"
${resources}
def install
venv = virtualenv_create(libexec, "python3")
resource("Pillow").stage do
inreplace "setup.py" do |s|
sdkprefix = MacOS::CLT.installed? ? "" : MacOS.sdk_path
s.gsub! "openjpeg.h", "probably_not_a_header_called_this_eh.h"
s.gsub! "ZLIB_ROOT = None", "ZLIB_ROOT = ('#{sdkprefix}/usr/lib', '#{sdkprefix}/usr/include')"
s.gsub! "JPEG_ROOT = None", "JPEG_ROOT = ('#{Formula["jpeg"].opt_prefix}/lib', '#{Formula["jpeg"].opt_prefix}/include')"
s.gsub! "FREETYPE_ROOT = None", "FREETYPE_ROOT = ('#{Formula["freetype"].opt_prefix}/lib', '#{Formula["freetype"].opt_prefix}/include')"
end
# avoid triggering "helpful" distutils code that doesn't recognize Xcode 7 .tbd stubs
ENV.append "CFLAGS", "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers" unless MacOS::CLT.installed?
venv.pip_install Pathname.pwd
end
res = resources.map(&:name).to_set - ["Pillow"]
res.each do |r|
venv.pip_install resource(r)
end
venv.pip_install_and_link buildpath
end
test do
# Since we use Python 3, we require a UTF-8 locale
ENV["LC_ALL"] = "en_US.UTF-8"
system "#{bin}/ocrmypdf", "-f", "-q", "--deskew",
test_fixtures("test.pdf"), "ocr.pdf"
assert_predicate testpath/"ocr.pdf", :exist?
end
end
""")
def main():
p = run(['poet', '--single', 'ocrmypdf'],
encoding='utf-8', stdout=PIPE, check=True)
ocrmypdf_lines = p.stdout.splitlines()
ocrmypdf_url = ocrmypdf_lines[1].strip()
ocrmypdf_sha256 = ocrmypdf_lines[2].strip()
ocrmypdf_version = re.search(
r'ocrmypdf-(.+)\.tar.*', ocrmypdf_url).group(1)
print(f"Autobrewing {ocrmypdf_version}")
p = run(['poet', '--resources', 'ocrmypdf'],
encoding='utf-8', stdout=PIPE, check=True)
poet_resources = p.stdout
# Remove the duplicate "ocrmypdf" resource block
all_resources = poet_resources.split('resource')
kept_resources = [block for block in all_resources if 'ocrmypdf' not in block]
resources = 'resource'.join(kept_resources)
with open('ocrmypdf.rb', 'w') as out:
out.write(recipe_template.substitute(**locals()))
if __name__ == '__main__':
main()
-31
View File
@@ -1,31 +0,0 @@
#!/bin/bash
# © 2017 James R. Barlow: github.com/jbarlow83
set -euo pipefail
set -x
sudo add-apt-repository ppa:vshn/ghostscript -y
sudo add-apt-repository ppa:heyarje/libav-11 -y
sudo apt-get update -qq
sudo apt-get install -y \
ghostscript \
qpdf \
poppler-utils \
libavformat56 \
libavcodec56 \
libavutil54 \
libffi-dev
sudo add-apt-repository ppa:alex-p/tesseract-ocr -y
sudo apt-get update
sudo apt-get autoremove -y
sudo apt-get install -y --no-install-recommends \
tesseract-ocr \
tesseract-ocr-eng \
tesseract-ocr-fra \
tesseract-ocr-deu
pip install --upgrade pip
mkdir -p packages
[ -f packages/unpaper_6.1-1.deb ] || wget -q 'https://www.dropbox.com/s/vaq0kbwi6e6au80/unpaper_6.1-1.deb?raw=1' -O packages/unpaper_6.1-1.deb
sudo dpkg -i packages/unpaper_6.1-1.deb
-23
View File
@@ -1,23 +0,0 @@
#!/bin/bash
# © 2017 James R. Barlow: github.com/jbarlow83
set -uo pipefail
set -x
pip3 install homebrew-pypi-poet
python3 .travis/autobrew.py
cat ocrmypdf.rb
# brew audit crashes Travis
#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
+7 -9
View File
@@ -4,10 +4,10 @@ OCRmyPDF
.. image:: https://travis-ci.org/jbarlow83/OCRmyPDF.svg?branch=master
:target: https://travis-ci.org/jbarlow83/OCRmyPDF
.. image:: https://img.shields.io/pypi/v/ocrmypdf.svg
.. image:: https://img.shields.io/pypi/v/ocrmypdf.svg
:target: https://pypi.org/project/ocrmypdf/
.. image:: https://img.shields.io/homebrew/v/ocrmypdf.svg
.. image:: https://img.shields.io/homebrew/v/ocrmypdf.svg
:alt: homebrew
:target: http://brewformulas.org/Ocrmypdf
@@ -54,7 +54,7 @@ Motivation
I searched the web for a free command line tool to OCR PDF files on
Linux/UNIX: I found many, but none of them were really satisfying.
- Either they produced PDF files with misplaced text under the image (making copy/paste impossible)
- Either they produced PDF files with misplaced text under the image (making copy/paste impossible)
- Or they did not handle accents and multilingual characters
- Or they changed the resolution of the embedded images
- Or they generated ridiculously large PDF files
@@ -63,7 +63,7 @@ Linux/UNIX: I found many, but none of them were really satisfying.
- On top of that none of them produced PDF/A files (format dedicated for long time storage)
...so I decided to develop my own tool (using various existing scripts
as an inspiration).
as an inspiration).
Installation
------------
@@ -97,7 +97,7 @@ you can often find packages that provide language packs:
# Debian/Ubuntu users
apt-get install tesseract-ocr-chi-sim # Example: Install Chinese Simplified language back
You can then pass the ``-l LANG`` argument to OCRmyPDF to give a hint as to what languages it should search for. Multiple
languages can be requested.
@@ -126,9 +126,7 @@ If you detect an issue, please:
Requirements
------------
Runs on CPython 3.6, and requires external program installations of Ghostscript, Tesseract OCR, QPDF, and Leptonica. ocrmypdf is pure Python, but uses CFFI to portably generate library bindings.
Python 3.5 is also supported.
Runs on CPython 3.5, 3.6 and 3.7. Requires external program installations of Ghostscript, Tesseract OCR, QPDF, and Leptonica. ocrmypdf is pure Python, but uses CFFI to portably generate library bindings.
Press & Media
-------------
@@ -142,7 +140,7 @@ Press & Media
License
-------
The OCRmyPDF software is licensed under the GNU GPLv3. Certain files are covered by other licenses, as noted in their source files.
The OCRmyPDF software is licensed under the GNU GPLv3. Certain files are covered by other licenses, as noted in their source files.
The license for each test file varies, and is noted in tests/resources/README.rst. The documentation is licensed under Creative Commons Attribution-ShareAlike 4.0 (CC-BY-SA 4.0).
+16 -4
View File
@@ -19,7 +19,7 @@ If ``--force-ocr`` is issued, then all pages will be rasterized to images, disca
Time and image size limits
""""""""""""""""""""""""""
By default, OCRmyPDF permits tesseract to run for only three minutes (180 seconds) per page. This is usually more than enough time to find all text on a reasonably sized page with modern hardware.
By default, OCRmyPDF permits tesseract to run for three minutes (180 seconds) per page. This is usually more than enough time to find all text on a reasonably sized page with modern hardware.
If a page is skipped, it will be inserted without OCR. If preprocessing was requested, the preprocessed image layer will be inserted.
@@ -33,11 +33,17 @@ If you want to adjust the amount of time spent on OCR, change ``--tesseract-time
Overriding default tesseract
""""""""""""""""""""""""""""
OCRmyPDF checks the system ``PATH`` for the ``tesseract`` binary.
OCRmyPDF checks the system ``PATH`` for the ``tesseract`` binary.
Some relevant environment variables that influence Tesseract's behavior include:
.. envvar:: TESSDATA_PREFIX
A Tesseract environment variable that overrides the path to Tesseract's data files.
Overrides the path to Tesseract's data files. This can allow simultaneous installation of the "best" and "fast" training data sets. OCRmyPDF does not manage this environment variable.
.. envvar:: OMP_THREAD_LIMIT
Controls the number of threads Tesseract will use. OCRmyPDF will manage this environment if it is not already set. (Currently, it will set it to 1 because this gives the best results in testing.)
For example, if you are testing tesseract 4.00 and don't wish to use an existing tesseract 3.04 installation, you can launch OCRmyPDF as follows:
@@ -106,6 +112,8 @@ The ``sandwich`` renderer
The ``sandwich`` renderer uses Tesseract's new text-only PDF feature, which produces a PDF page that lays out the OCR in invisible text. This page is then "sandwiched" onto the original PDF page, allowing lossless application of OCR even to PDF pages that contain other vector objects.
Currently this is the best renderer for most uses, however it is implemented in Tesseract so OCRmyPDF cannot influence it. Currently some problematic PDF viewers like Mozilla PDF.js and macOS Preview have problems with segmenting its text output, and mightrunseveralwordstogether.
When image preprocessing features like ``--deskew`` are used, the original PDF will be rendered as a full page and the OCR layer will be placed on top.
This renderer requires Tesseract 3.05.01 or newer.
@@ -115,6 +123,10 @@ The ``hocr`` renderer
The ``hocr`` renderer works with older versions of Tesseract. The image layer is copied from the original PDF page if possible, avoiding potentially lossy transcoding or loss of other PDF information. If preprocessing is specified, then the image layer is a new PDF.
Unlike ``sandwich`` this renderer is implemented within OCRmyPDF; anyone looking to customize how OCR is presented should look here. A major disadvantage of this renderer is it not capable of correctly handling text outside the Latin alphabet. Pull requests to improve the situation are welcome.
Currently, this renderer has the best compatibility with Mozilla's PDF.js viewer.
This works in all versions of Tesseract.
The ``tesseract`` renderer
@@ -124,4 +136,4 @@ The ``tesseract`` renderer creates a PDF with the image and text layers precompo
If a PDF created with this renderer using Tesseract versions older than 3.05.00 is then passed through Ghostscript's pdfwrite feature, the OCR text *may* be corrupted. The ``--output-type=pdfa`` argument will produce a warning in this situation.
*This renderer is deprecated and will be removed whenever support for older versions of Tesseract is dropped.*
*This renderer is deprecated and will be removed whenever support for older versions of Tesseract is dropped.*
+1 -1
View File
@@ -18,7 +18,7 @@ The ``--tag`` argument tells parallel to print the filename as a prefix whenever
parallel --tag -j 2 ocrmypdf '{}' 'output/{}' ::: *.pdf
OCRmyPDF automaticaly repairs PDFs before parsing and gathering information from them. If you are already repairing PDFs with ``qpdf`` prior to attempting OCR, or you can use ``--skip-repair`` to skip this step. It may improve performance for large files, since repairing PDFs is single-threaded.
OCRmyPDF automatically repairs PDFs before parsing and gathering information from them. If you are already repairing PDFs with ``qpdf`` prior to attempting OCR, or you can use ``--skip-repair`` to skip this step. It may improve performance for large files, since repairing PDFs is single-threaded.
Directory trees
---------------
+20 -10
View File
@@ -55,6 +55,8 @@ OCR will attempt to automatic correct the rotation of each page. This can help f
You can increase (decrease) the parameter ``--rotate-pages-threshold`` to make page rotation more (less) aggressive.
If the page is "just a little off horizontal", like a crooked picture, then you want ``--deskew``. ``--rotate-pages`` is for when the cardinal angle is wrong.
OCR languages other than English
""""""""""""""""""""""""""""""""
@@ -63,8 +65,8 @@ By default OCRmyPDF assumes the document is English.
.. code-block:: bash
ocrmypdf -l fre LeParisien.pdf LeParisien.pdf
ocrmypdf -l eng+fre Bilingual-English-French.pdf Bilingual-English-French.pdf
ocrmypdf -l fra LeParisien.pdf LeParisien.pdf
ocrmypdf -l eng+fra Bilingual-English-French.pdf Bilingual-English-French.pdf
Language packs must be installed for all languages specified. See :ref:`Installing additional language packs <lang-packs>`.
@@ -81,15 +83,28 @@ This produces a file named "output.pdf" and a companion text file named "output.
OCR images, not PDFs
--------------------
Use a program like `img2pdf <https://gitlab.mister-muffin.de/josch/img2pdf>`_ to convert your images to PDFs, and then pipe the results to run ocrmypdf:
If you are starting with images, you can just use Tesseract 3.04 or later directly to convert images to PDFs:
.. code-block:: bash
tesseract my-image.jpg output-prefix pdf
.. code-block:: bash
# When there are multiple images
tesseract text-file-containing-list-of-image-filenames.txt output-prefix pdf
Tesseract's PDF output is quite good  OCRmyPDF uses it by internally by default. However, OCRmyPDF has many features not available in Tesseract like like image processing, metadata control, and PDF/A generation.
Use a program like `img2pdf <https://gitlab.mister-muffin.de/josch/img2pdf>`_ to convert your images to PDFs, and then pipe the results to run ocrmypdf. The `-` tells ocrmypdf to read standard input.
.. code-block:: bash
img2pdf my-images*.jpg | ocrmypdf - myfile.pdf
``img2pdf`` also has features to control the position of images on a page, if desired.
``img2pdf`` is recommended because it does an excellent job at generating PDFs without transcoding images.
For convenience, OCRmyPDF can convert single images to PDFs on its own. If the resolution (dots per inch, DPI) of an image is not set or is incorrect, it can be overridden with ``--image-dpi``. (As 1 inch is 2.54 cm, 1 dpi = 0.39 dpcm).
For convenience, OCRmyPDF can also convert single images to PDFs on its own. If the resolution (dots per inch, DPI) of an image is not set or is incorrect, it can be overridden with ``--image-dpi``. (As 1 inch is 2.54 cm, 1 dpi = 0.39 dpcm).
.. code-block:: bash
@@ -101,11 +116,6 @@ If you have multiple images, you must use ``img2pdf`` to convert the images to P
ImageMagick ``convert`` can also convert a group of images to PDF, but in the author's experience it takes a long time, transcodes unnecessarily and gives poor results.
You can also use Tesseract 3.04+ directly to convert single page images or multi-page TIFFs to PDF:
.. code-block:: bash
tesseract my-image.jpg output-prefix pdf
Image processing
----------------
+131 -54
View File
@@ -1,7 +1,13 @@
Installation
============
OCRmyPDF requires Python 3.5 (or newer) and Tesseract 3.04 (or newer).
The easiest way to install OCRmyPDF to follow the steps for your operating system/platform.
If you want to use the latest version of OCRmyPDF, your best bet is to install the most recent version your platform provides, and then upgrade that version by installing the Python binary wheels.
.. contents:: Platform-specific steps
:depth: 1
:local:
Installing on Debian and Ubuntu 16.10 or newer
----------------------------------------------
@@ -12,8 +18,14 @@ Users of Debian 9 ("stretch") or later or Ubuntu 16.10 or later may simply
apt-get install ocrmypdf
Installing on macOS
-------------------
To see what versions are available, check the `Debian Package Tracker <https://tracker.debian.org/pkg/ocrmypdf>`_ or `Ubuntu launchpad.net <https://launchpad.net/ocrmypdf>`_.
Installing on macOS with Homebrew
---------------------------------
.. image:: https://img.shields.io/homebrew/v/ocrmypdf.svg
:alt: homebrew
:target: http://brewformulas.org/Ocrmypdf
OCRmyPDF is now a standard `Homebrew <https://brew.sh>`_ formula. To install on macOS:
@@ -36,16 +48,14 @@ Installing the Docker image
For many users, installing the Docker image will be easier than installing all of OCRmyPDF's dependencies. For Windows, it is the only option.
If you have `Docker <https://docs.docker.com/>`_ installed on your system, you can install
a Docker image of the latest release.
If you have `Docker <https://docs.docker.com/>`_ installed on your system, you can install a Docker image of the latest release.
Follow the Docker installation instructions for your platform. If you can run this command
successfully, your system is ready to download and execute the image:
Follow the Docker installation instructions for your platform. If you can run this command successfully, your system is ready to download and execute the image:
.. code-block:: bash
docker run hello-world
OCRmyPDF will use all available CPU cores. By default, the VirtualBox machine instance on Windows and macOS has only a single CPU core enabled. Use the VirtualBox Manager to determine the name of your Docker engine host, and then follow these optional steps to enable multiple CPUs:
.. code-block:: bash
@@ -58,28 +68,31 @@ OCRmyPDF will use all available CPU cores. By default, the VirtualBox machine i
Assuming you have a Docker engine running, you can download one of the three available images:
+-----------------------------+---------------------------------------------+---------------------------------------------------------------------------------+
| Image name | Download command | Notes |
+-----------------------------+---------------------------------------------+---------------------------------------------------------------------------------+
| ocrmypdf | ``docker pull jbarlow83/ocrmypdf`` | Latest ocrmypdf with Tesseract 3.04. Includes English, French, German, Spanish. |
+-----------------------------+---------------------------------------------+---------------------------------------------------------------------------------+
| ocrmypdf-polyglot | ``docker pull jbarlow83/ocrmypdf-polyglot`` | As above, with all available language packs. |
+-----------------------------+---------------------------------------------+---------------------------------------------------------------------------------+
| ocrmypdf-tess4 | ``docker pull jbarlow83/ocrmypdf-tess4`` | Latest ocrmypdf with Tesseract 4.00.00alpha and English, French, German, |
| | | Spanish, Portuguese, Chinese Simplified, Arabic and Russian (the top 8). |
+-----------------------------+---------------------------------------------+---------------------------------------------------------------------------------+
.. list-table::
:widths: auto
:header-rows: 1
* - Image name
- Download command
- Notes
* - ocrmypdf
- ``docker pull jbarlow83/ocrmypdf``
- Latest ocrmypdf with Tesseract 4.0.0-beta1 on Ubuntu 18.04. Includes English, French, German, Spanish, Portugeuse and Simplified Chinese.
* - ocrmypdf-polyglot
- ``docker pull jbarlow83/ocrmypdf-polyglot``
- As above, with all available language packs.
For example:
.. code-block:: bash
docker pull jbarlow83/ocrmypdf-tess4
docker pull jbarlow83/ocrmypdf
Then tag it to give a more convenient name, just ocrmypdf:
.. code-block:: bash
docker tag jbarlow83/ocrmypdf-tess4 ocrmypdf
docker tag jbarlow83/ocrmypdf ocrmypdf
.. _docker-polyglot:
@@ -90,14 +103,14 @@ You can then run ocrmypdf using the command:
.. code-block:: bash
docker run --rm ocrmypdf --help
To execute the OCRmyPDF on a local file, you must `provide a writable volume to the Docker image <https://docs.docker.com/userguide/dockervolumes/>`_, and both the input and output file must be inside the writable volume. This example command uses the current working directory as the writable volume:
.. code-block:: bash
docker run --rm -v "$(pwd):/home/docker" <other docker arguments> ocrmypdf <your arguments to ocrmypdf>
In this worked example, the current working directory contains an input file called ``test.pdf`` and the output will go to ``output.pdf``:
In this worked example, the current working directory contains an input file called ``test.pdf`` and the output will go to ``output.pdf``:
.. code-block:: bash
@@ -154,11 +167,11 @@ Install or upgrade the required Homebrew packages, if any are missing:
brew install python3
brew install libxml2 libffi leptonica
brew install unpaper # optional
Python 3.5 and 3.6 are supported.
Python 3.5, 3.6 and 3.7 are supported.
Install the required Tesseract OCR engine with the language packs you plan to use:
.. code-block:: bash
brew install tesseract # Option 1: for English, French, German, Spanish
@@ -169,24 +182,25 @@ Install the required Tesseract OCR engine with the language packs you plan to us
brew install tesseract --with-all-languages # Option 2: for all language packs
Update the homebrew pip and install Pillow:
Update the homebrew pip:
.. code-block:: bash
pip3 install --upgrade pip
pip3 install --upgrade pillow
You can then install OCRmyPDF from PyPI, for the current user:
.. code-block:: bash
pip3 install --user ocrmypdf
pip3 install --user ocrmypdf[fitz]
or system-wide:
.. code-block:: bash
pip3 install ocrmypdf
pip3 install ocrmypdf[fitz]
``[fitz]`` includes the optional dependency on PyMuPDF, which improves OCRmyPDF's output in many cases.
The command line program should now be available:
@@ -194,6 +208,26 @@ The command line program should now be available:
ocrmypdf --help
Installing the latest version on Ubuntu 18.04 LTS
-------------------------------------------------
Ubuntu 18.04 includes ocrmypdf 6.1.2. To install a more recent version, first
install the system version to get all the dependencies:
.. code-block:: bash
sudo apt-get update
sudo apt-get install \
ocrmypdf \
python3-pip
Then install ocrmypdf 6.1.5 for the local user and set the user's ``PATH`` to check for the user's Python packages.
.. code-block:: bash
export PATH=$HOME/.local/bin:$PATH
pip3 install --user ocrmypdf[fitz]
Installing on Ubuntu 16.04 LTS
------------------------------
@@ -215,29 +249,29 @@ If you wish install OCRmyPDF for the current user:
.. code-block:: bash
pip3 install --user ocrmypdf
pip3 install --user ocrmypdf[fitz]
Alternately, system-wide. Note that this may modify the system Python environment:
.. code-block:: bash
sudo pip3 install ocrmypdf
sudo pip3 install ocrmypdf[fitz]
If you wish to install OCRmyPDF to a virtual environment to isolate the system Python, you can
follow these steps.
If you wish to install OCRmyPDF to a virtual environment to isolate the system Python, you can follow these steps.
.. code-block:: bash
python3 -m venv venv-ocrmypdf
source venv-ocrmypdf/bin/activate
pip3 install ocrmypdf
pip3 install ocrmypdf[fitz]
``[fitz]`` includes the optional dependency on PyMuPDF, which improves OCRmyPDF's output in many cases.
Installing on Ubuntu 14.04 LTS
------------------------------
Installing on Ubuntu 14.04 LTS (trusty) is more difficult than some other options,
because it is older and does not provide ``pip``.
Installing on Ubuntu 14.04 LTS (trusty) is more difficult than some other options, because it is older and does not provide ``pip``.
Update apt-get:
@@ -256,10 +290,7 @@ Install system dependencies:
libffi-dev \
qpdf
We will need backports of Ghostscript 9.16, libav-11 (for unpaper 6.1),
Tesseract 4.00 (alpha), and Python 3.6. This will replace Ghostscript and
Tesseract 3.x on your system. Python 3.6 will be installed alongside the system
Python 3.
We will need backports of Ghostscript 9.16, libav-11 (for unpaper 6.1), Tesseract 4.00 (alpha), and Python 3.6. This will replace Ghostscript and Tesseract 3.x on your system. Python 3.6 will be installed alongside the system Python 3.
If you prefer to not modify your system in this matter, consider using a Docker container.
@@ -273,7 +304,7 @@ If you prefer to not modify your system in this matter, consider using a Docker
sudo apt-get update
sudo apt-get install \
python3.6 \
python3.6-dev \
ghostscript \
tesseract-ocr \
tesseract-ocr-eng \
@@ -284,8 +315,8 @@ Now we need to install ``pip`` and let it install ocrmypdf:
.. code-block:: bash
wget -O - -o /dev/null https://bootstrap.pypa.io/get-pip.py | python3.6
pip3.6 install ocrmypdf
curl https://bootstrap.pypa.io/ez_setup.py -o - | python3.6 && python3.6 -m easy_install pip
pip3.6 install ocrmypdf[fitz]
The ``wget`` command will download a program and run it.
@@ -312,6 +343,9 @@ Installing on Windows
Direct installation on Windows is not possible. Install the _`Docker` container as described above. Ensure that your command prompt can run the docker "hello world" container.
It would probably not be too difficult to run on Windows. The main reason this has been avoided is the difficulty of packaging and installing the various non-Python dependencies: Tesseract, QPDF, Ghostscript, Leptonica. Pull requests to add or improve Windows support would be quite welcome.
Running on Windows
~~~~~~~~~~~~~~~~~~
@@ -325,11 +359,56 @@ where /c/Users/sampleuser is a Unix representation of the Windows path C:\\Users
`Bash on Ubuntu on Windows <https://github.com/Microsoft/BashOnWindows>`_ should also be a viable route for running the OCRmyPDF Docker container.
Installing with Python pip
--------------------------
First, install `your platform's version <https://repology.org/metapackage/ocrmypdf/versions>`_ of ``ocrmypdf``, if available, as a way of ensuring that external dependencies are (mostly) satisified, even though the platform version may be out of date. Use ``ocrmypdf --version`` to confirm what version was installed.
Then you can install the latest OCRmyPDF from the Python wheels. First try:
.. code-block:: bash
pip3 install --user ocrmypdf
You should then be able to run ``ocrmypdf --version`` and see that the latest version was located.
Since ``pip3 install --user`` does not work correctly on some platforms, notably Ubuntu 16.04 and older, and the Homebrew version of Python, instead use this for a system wide installation:
.. code-block:: bash
pip3 install ocrmypdf
Requirements for pip and HEAD install
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OCRmyPDF currently requires these external programs to be installed:
- Python 3.5 or newer
- Tesseract 3.04 or newer
- Ghostscript 9.15 or newer
- qpdf 7.0.0 or newer
The following dependencies are recommended:
- Python 3.6
- Tesseract 4.00 or newer
- Ghostscript 9.22 or newer
- qpdf 8.0.2 or newer
- unpaper 6.1
- PyMuPDF 1.12.5 or newer
These are in addition to the Python packaging dependencies, meaning that unfortunately, the ``pip install`` command cannot satisfy all of them.
Python 3.6 and Tesseract 4.0.0-beta.1 are recommended for best OCR results and best performance.
The library PyMuPDF is not widely available in platform distributions, and it improves OCRmyPDF in certain conditions. Consider installing OCRmyPDF from the Python binary wheels, which include a precompiled version of this library.
Installing HEAD revision from sources
-------------------------------------
If you have ``git`` and Python 3.5 or newer installed, you can install from source. When the ``pip`` installer runs,
it will alert you if dependencies are missing.
If you have ``git`` and Python 3.5 or newer installed, you can install from source. When the ``pip`` installer runs, it will alert you if dependencies are missing.
To install the HEAD revision from sources in the current Python 3 environment:
@@ -343,15 +422,7 @@ Or, to install in `development mode <https://pythonhosted.org/setuptools/setupto
pip3 install -e git+https://github.com/jbarlow83/OCRmyPDF.git
On certain Linux distributions such as Ubuntu, you may need to use
run the install command as superuser:
.. code-block:: bash
sudo pip3 install [-e] git+https://github.com/jbarlow83/OCRmyPDF.git
Note that this will alter your system's Python distribution. If you prefer
to not install as superuser, you can install the package in a Python virtual environment:
You may find it easiest to install in a virtual environment, rather than system-wide:
.. code-block:: bash
@@ -374,3 +445,9 @@ If not yet installed, the script will notify you about dependencies that
need to be installed. The script requires specific versions of the
dependencies. Older version than the ones mentioned in the release notes
are likely not to be compatible to OCRmyPDF.
Other Linux packages
--------------------
See the `Repology <https://repology.org/metapackage/ocrmypdf/versions>`_ page.
+2 -1
View File
@@ -79,7 +79,8 @@ OCRmyPDF is limited by the Tesseract OCR engine. As such it experiences these l
* 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.
* It does not expose information about what font family text belongs to.
OCRmyPDF is also limited by the PDF specification:
* PDF encodes the position of text glyphs but does not encode document structure. There is no markup that divides a document in sections, paragraphs, sentences, or even words (since blank spaces are not represented). As such all elements of document structure including the spaces between words must be derived heuristically. Some PDF viewers do a better job of this than others.
+518 -357
View File
@@ -1,392 +1,553 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: Pipeline: Pages: 1 -->
<svg width="1544pt" height="1089pt"
viewBox="0.00 0.00 1544.00 1089.14" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1085.14)">
<svg width="1952pt" height="1277pt"
viewBox="0.00 0.00 1952.00 1277.18" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1273.1825)">
<title>Pipeline:</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-1085.14 1540,-1085.14 1540,4 -4,4"/>
<g id="clust1" class="cluster"><title>clustertasks</title>
<polygon fill="none" stroke="black" points="8,-8 8,-1073.14 1528,-1073.14 1528,-8 8,-8"/>
<text text-anchor="middle" x="768" y="-1045.14" font-family="Times,serif" font-size="30.00" fill="#ff3232">Pipeline:</text>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1273.1825 1948,-1273.1825 1948,4 -4,4"/>
<g id="clust1" class="cluster">
<title>clustertasks</title>
<polygon fill="none" stroke="#000000" points="8,-8 8,-1261.1825 1936,-1261.1825 1936,-8 8,-8"/>
<text text-anchor="middle" x="972" y="-1233.1825" font-family="Times,serif" font-size="30.00" fill="#ff3232">Pipeline:</text>
</g>
<!-- t0 -->
<g id="node1" class="node"><title>t0</title>
<polygon fill="#efa03b" stroke="black" points="750.705,-1027.14 541.295,-1027.14 537.295,-1023.14 537.295,-991.141 746.705,-991.141 750.705,-995.141 750.705,-1027.14"/>
<polyline fill="none" stroke="black" points="746.705,-1023.14 537.295,-1023.14 "/>
<polyline fill="none" stroke="black" points="746.705,-1023.14 746.705,-991.141 "/>
<polyline fill="none" stroke="black" points="746.705,-1023.14 750.705,-1027.14 "/>
<text text-anchor="middle" x="644" y="-1003.14" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.triage</text>
<g id="node1" class="node">
<title>t0</title>
<polygon fill="#efa03b" stroke="#000000" points="876.7053,-1215.1825 667.2947,-1215.1825 663.2947,-1211.1825 663.2947,-1179.1825 872.7053,-1179.1825 876.7053,-1183.1825 876.7053,-1215.1825"/>
<polyline fill="none" stroke="#000000" points="872.7053,-1211.1825 663.2947,-1211.1825 "/>
<polyline fill="none" stroke="#000000" points="872.7053,-1211.1825 872.7053,-1179.1825 "/>
<polyline fill="none" stroke="#000000" points="872.7053,-1211.1825 876.7053,-1215.1825 "/>
<text text-anchor="middle" x="770" y="-1191.1825" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.triage</text>
</g>
<!-- t1 -->
<g id="node2" class="node"><title>t1</title>
<polygon fill="#efa03b" stroke="black" points="769.969,-969.141 522.031,-969.141 518.031,-965.141 518.031,-933.141 765.969,-933.141 769.969,-937.141 769.969,-969.141"/>
<polyline fill="none" stroke="black" points="765.969,-965.141 518.031,-965.141 "/>
<polyline fill="none" stroke="black" points="765.969,-965.141 765.969,-933.141 "/>
<polyline fill="none" stroke="black" points="765.969,-965.141 769.969,-969.141 "/>
<text text-anchor="middle" x="644" y="-945.141" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.repair_pdf</text>
<g id="node2" class="node">
<title>t1</title>
<polygon fill="#efa03b" stroke="#000000" points="941.0433,-1157.1825 602.9567,-1157.1825 598.9567,-1153.1825 598.9567,-1121.1825 937.0433,-1121.1825 941.0433,-1125.1825 941.0433,-1157.1825"/>
<polyline fill="none" stroke="#000000" points="937.0433,-1153.1825 598.9567,-1153.1825 "/>
<polyline fill="none" stroke="#000000" points="937.0433,-1153.1825 937.0433,-1121.1825 "/>
<polyline fill="none" stroke="#000000" points="937.0433,-1153.1825 941.0433,-1157.1825 "/>
<text text-anchor="middle" x="770" y="-1133.1825" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.repair_and_parse_pdf</text>
</g>
<!-- t0&#45;&gt;t1 -->
<g id="edge1" class="edge"><title>t0&#45;&gt;t1</title>
<path fill="none" stroke="#0044a0" d="M644,-991.035C644,-987.344 644,-983.354 644,-979.384"/>
<polygon fill="#0044a0" stroke="#0044a0" points="647.5,-979.142 644,-969.142 640.5,-979.142 647.5,-979.142"/>
<g id="edge1" class="edge">
<title>t0&#45;&gt;t1</title>
<path fill="none" stroke="#0044a0" d="M770,-1179.1488C770,-1175.4743 770,-1171.5242 770,-1167.5888"/>
<polygon fill="#0044a0" stroke="#0044a0" points="773.5001,-1167.4047 770,-1157.4047 766.5001,-1167.4047 773.5001,-1167.4047"/>
</g>
<!-- t2 -->
<g id="node3" class="node"><title>t2</title>
<polygon fill="#efa03b" stroke="black" points="869.82,-890.215 644,-907.116 418.18,-890.215 418.391,-862.869 869.609,-862.869 869.82,-890.215"/>
<polygon fill="none" stroke="black" points="873.852,-893.922 644,-911.125 414.148,-893.922 414.419,-858.871 873.581,-858.871 873.852,-893.922"/>
<text text-anchor="middle" x="644" y="-876.657" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.split_pages</text>
<g id="node3" class="node">
<title>t2</title>
<polygon fill="#efa03b" stroke="#000000" points="1043.9447,-1078.2585 787,-1095.158 530.0553,-1078.2585 530.2951,-1050.9147 1043.7049,-1050.9147 1043.9447,-1078.2585"/>
<polygon fill="none" stroke="#000000" points="1047.9814,-1081.9991 787,-1099.164 526.0186,-1081.9991 526.3263,-1046.9173 1047.6737,-1046.9173 1047.9814,-1081.9991"/>
<text text-anchor="middle" x="787" y="-1064.7009" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.pre_split_pages</text>
</g>
<!-- t1&#45;&gt;t2 -->
<g id="edge2" class="edge"><title>t1&#45;&gt;t2</title>
<path fill="none" stroke="#0044a0" d="M644,-933.019C644,-929.4 644,-925.445 644,-921.399"/>
<polygon fill="#0044a0" stroke="#0044a0" points="647.5,-921.295 644,-911.295 640.5,-921.295 647.5,-921.295"/>
</g>
<!-- t18 -->
<g id="node20" class="node"><title>t18</title>
<polygon fill="#efa03b" stroke="black" points="383.516,-832.173 20.4844,-832.173 16.4844,-828.173 16.4844,-796.173 379.516,-796.173 383.516,-800.173 383.516,-832.173"/>
<polyline fill="none" stroke="black" points="379.516,-828.173 16.4844,-828.173 "/>
<polyline fill="none" stroke="black" points="379.516,-828.173 379.516,-796.173 "/>
<polyline fill="none" stroke="black" points="379.516,-828.173 383.516,-832.173 "/>
<text text-anchor="middle" x="200" y="-808.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.generate_postscript_stub</text>
</g>
<!-- t1&#45;&gt;t18 -->
<g id="edge29" class="edge"><title>t1&#45;&gt;t18</title>
<path fill="none" stroke="#0044a0" d="M518.14,-936.259C481.198,-930.408 441.05,-922.284 405,-911.141 344.394,-892.407 278.709,-859.14 238.448,-837.118"/>
<polygon fill="#0044a0" stroke="#0044a0" points="239.963,-833.956 229.517,-832.188 236.581,-840.085 239.963,-833.956"/>
</g>
<!-- t21 -->
<g id="node22" class="node"><title>t21</title>
<polygon fill="#efa03b" stroke="black" points="751.49,-156.424 963,-129.109 1174.51,-156.424 1174.31,-200.62 751.688,-200.62 751.49,-156.424"/>
<polygon fill="none" stroke="black" points="747.474,-152.906 963,-125.073 1178.53,-152.906 1178.29,-204.623 747.705,-204.623 747.474,-152.906"/>
<text text-anchor="middle" x="963" y="-162.639" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.merge_pages_qpdf</text>
</g>
<!-- t1&#45;&gt;t21 -->
<g id="edge39" class="edge"><title>t1&#45;&gt;t21</title>
<path fill="none" stroke="#0044a0" d="M769.832,-943.539C1011.96,-929.143 1519,-890.056 1519,-815.173 1519,-815.173 1519,-815.173 1519,-309.173 1519,-237.474 1342.87,-202.283 1188.87,-185.216"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1189.08,-181.719 1178.76,-184.118 1188.32,-188.678 1189.08,-181.719"/>
</g>
<!-- t3 -->
<g id="node4" class="node"><title>t3</title>
<polygon fill="#efa03b" stroke="black" points="712.317,-832.173 405.683,-832.173 401.683,-828.173 401.683,-796.173 708.317,-796.173 712.317,-800.173 712.317,-832.173"/>
<polyline fill="none" stroke="black" points="708.317,-828.173 401.683,-828.173 "/>
<polyline fill="none" stroke="black" points="708.317,-828.173 708.317,-796.173 "/>
<polyline fill="none" stroke="black" points="708.317,-828.173 712.317,-832.173 "/>
<text text-anchor="middle" x="557" y="-808.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.rasterize_preview</text>
</g>
<!-- t2&#45;&gt;t3 -->
<g id="edge3" class="edge"><title>t2&#45;&gt;t3</title>
<path fill="none" stroke="#0044a0" d="M614.06,-858.777C605.418,-852.173 595.983,-844.963 587.319,-838.342"/>
<polygon fill="#0044a0" stroke="#0044a0" points="589.37,-835.504 579.299,-832.213 585.119,-841.066 589.37,-835.504"/>
</g>
<!-- t4 -->
<g id="node5" class="node"><title>t4</title>
<polygon fill="#efa03b" stroke="black" points="688.082,-774.173 429.918,-774.173 425.918,-770.173 425.918,-738.173 684.082,-738.173 688.082,-742.173 688.082,-774.173"/>
<polyline fill="none" stroke="black" points="684.082,-770.173 425.918,-770.173 "/>
<polyline fill="none" stroke="black" points="684.082,-770.173 684.082,-738.173 "/>
<polyline fill="none" stroke="black" points="684.082,-770.173 688.082,-774.173 "/>
<text text-anchor="middle" x="557" y="-750.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.orient_page</text>
</g>
<!-- t2&#45;&gt;t4 -->
<g id="edge5" class="edge"><title>t2&#45;&gt;t4</title>
<path fill="none" stroke="#0044a0" d="M695.691,-858.661C705.833,-851.667 715.136,-842.912 721,-832.173 728.668,-818.13 730.919,-808.727 721,-796.173 714.915,-788.471 700.759,-782.127 683.18,-776.959"/>
<polygon fill="#0044a0" stroke="#0044a0" points="683.659,-773.462 673.091,-774.208 681.817,-780.216 683.659,-773.462"/>
</g>
<!-- t3&#45;&gt;t4 -->
<g id="edge4" class="edge"><title>t3&#45;&gt;t4</title>
<path fill="none" stroke="#0044a0" d="M557,-796.066C557,-792.375 557,-788.385 557,-784.415"/>
<polygon fill="#0044a0" stroke="#0044a0" points="560.5,-784.174 557,-774.174 553.5,-784.174 560.5,-784.174"/>
</g>
<!-- t5 -->
<g id="node6" class="node"><title>t5</title>
<polygon fill="#efa03b" stroke="black" points="1064.73,-716.173 689.268,-716.173 685.268,-712.173 685.268,-680.173 1060.73,-680.173 1064.73,-684.173 1064.73,-716.173"/>
<polyline fill="none" stroke="black" points="1060.73,-712.173 685.268,-712.173 "/>
<polyline fill="none" stroke="black" points="1060.73,-712.173 1060.73,-680.173 "/>
<polyline fill="none" stroke="black" points="1060.73,-712.173 1064.73,-716.173 "/>
<text text-anchor="middle" x="875" y="-692.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.rasterize_with_ghostscript</text>
</g>
<!-- t4&#45;&gt;t5 -->
<g id="edge6" class="edge"><title>t4&#45;&gt;t5</title>
<path fill="none" stroke="#0044a0" d="M653.706,-738.143C689.783,-731.789 730.943,-724.541 767.902,-718.033"/>
<polygon fill="#0044a0" stroke="#0044a0" points="768.965,-721.399 778.206,-716.218 767.751,-714.505 768.965,-721.399"/>
</g>
<!-- t15 -->
<g id="node13" class="node"><title>t15</title>
<polygon fill="#ff69b4" stroke="black" points="440.27,-396.173 59.7304,-396.173 55.7304,-392.173 55.7304,-360.173 436.27,-360.173 440.27,-364.173 440.27,-396.173"/>
<polyline fill="none" stroke="black" points="436.27,-392.173 55.7304,-392.173 "/>
<polyline fill="none" stroke="black" points="436.27,-392.173 436.27,-360.173 "/>
<polyline fill="none" stroke="black" points="436.27,-392.173 440.27,-396.173 "/>
<text text-anchor="middle" x="248" y="-372.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.ocr_tesseract_textonly_pdf</text>
</g>
<!-- t4&#45;&gt;t15 -->
<g id="edge14" class="edge"><title>t4&#45;&gt;t15</title>
<path fill="none" stroke="#0044a0" d="M425.857,-745.263C361.241,-732.425 297,-703.891 297,-641.173 297,-641.173 297,-641.173 297,-523.173 297,-480.18 277.182,-433.63 262.754,-405.436"/>
<polygon fill="#0044a0" stroke="#0044a0" points="265.677,-403.477 257.916,-396.265 259.486,-406.743 265.677,-403.477"/>
</g>
<!-- t12 -->
<g id="node15" class="node"><title>t12</title>
<polygon fill="#00cc66" stroke="black" points="781,-406.173 458.414,-378.173 781,-350.173 1103.59,-378.173 781,-406.173"/>
<text text-anchor="middle" x="781" y="-372.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.select_image_layer</text>
</g>
<!-- t4&#45;&gt;t12 -->
<g id="edge20" class="edge"><title>t4&#45;&gt;t12</title>
<path fill="none" stroke="#0044a0" d="M471.449,-738.167C421.018,-722.605 367,-693.681 367,-641.173 367,-641.173 367,-641.173 367,-523.173 367,-480.717 347.218,-458.43 377,-428.173 392.917,-412.001 494.592,-399.721 591.948,-391.499"/>
<polygon fill="#0044a0" stroke="#0044a0" points="592.284,-394.983 601.96,-390.666 591.704,-388.007 592.284,-394.983"/>
</g>
<!-- t19 -->
<g id="node18" class="node"><title>t19</title>
<polygon fill="#efa03b" stroke="black" points="323.772,-270.173 78.2284,-270.173 74.2284,-266.173 74.2284,-234.173 319.772,-234.173 323.772,-238.173 323.772,-270.173"/>
<polyline fill="none" stroke="black" points="319.772,-266.173 74.2284,-266.173 "/>
<polyline fill="none" stroke="black" points="319.772,-266.173 319.772,-234.173 "/>
<polyline fill="none" stroke="black" points="319.772,-266.173 323.772,-270.173 "/>
<text text-anchor="middle" x="199" y="-246.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.skip_page</text>
</g>
<!-- t4&#45;&gt;t19 -->
<g id="edge26" class="edge"><title>t4&#45;&gt;t19</title>
<path fill="none" stroke="#0044a0" d="M425.782,-752.078C271.736,-744.795 37,-720.655 37,-641.173 37,-641.173 37,-641.173 37,-377.173 37,-325.92 88.7624,-292.989 133.769,-274.043"/>
<polygon fill="#0044a0" stroke="#0044a0" points="135.289,-277.203 143.249,-270.211 132.666,-270.713 135.289,-277.203"/>
</g>
<!-- t17 -->
<g id="node19" class="node"><title>t17</title>
<polygon fill="#66ccff" stroke="black" points="1499.67,-328.173 1094.33,-328.173 1090.33,-324.173 1090.33,-292.173 1495.67,-292.173 1499.67,-296.173 1499.67,-328.173"/>
<polyline fill="none" stroke="black" points="1495.67,-324.173 1090.33,-324.173 "/>
<polyline fill="none" stroke="black" points="1495.67,-324.173 1495.67,-292.173 "/>
<polyline fill="none" stroke="black" points="1495.67,-324.173 1499.67,-328.173 "/>
<text text-anchor="middle" x="1295" y="-304.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.ocr_tesseract_and_render_pdf</text>
</g>
<!-- t4&#45;&gt;t17 -->
<g id="edge28" class="edge"><title>t4&#45;&gt;t17</title>
<path fill="none" stroke="#0044a0" d="M688.477,-752.611C947.521,-745.804 1499,-721.841 1499,-641.173 1499,-641.173 1499,-641.173 1499,-455.173 1499,-407.201 1508.25,-383.766 1474,-350.173 1465.98,-342.302 1448.74,-335.804 1427.99,-330.522"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1428.77,-327.11 1418.23,-328.18 1427.14,-333.917 1428.77,-327.11"/>
</g>
<!-- t6 -->
<g id="node7" class="node"><title>t6</title>
<polygon fill="#efa03b" stroke="black" points="1089.08,-658.173 664.92,-658.173 660.92,-654.173 660.92,-622.173 1085.08,-622.173 1089.08,-626.173 1089.08,-658.173"/>
<polyline fill="none" stroke="black" points="1085.08,-654.173 660.92,-654.173 "/>
<polyline fill="none" stroke="black" points="1085.08,-654.173 1085.08,-622.173 "/>
<polyline fill="none" stroke="black" points="1085.08,-654.173 1089.08,-658.173 "/>
<text text-anchor="middle" x="875" y="-634.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.preprocess_remove_background</text>
</g>
<!-- t5&#45;&gt;t6 -->
<g id="edge7" class="edge"><title>t5&#45;&gt;t6</title>
<path fill="none" stroke="#0044a0" d="M875,-680.066C875,-676.375 875,-672.385 875,-668.415"/>
<polygon fill="#0044a0" stroke="#0044a0" points="878.5,-668.174 875,-658.174 871.5,-668.174 878.5,-668.174"/>
</g>
<!-- t11 -->
<g id="node14" class="node"><title>t11</title>
<polygon fill="#efa03b" stroke="black" points="1096,-484.173 712.187,-456.173 1096,-428.173 1479.81,-456.173 1096,-484.173"/>
<text text-anchor="middle" x="1096" y="-450.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.select_visible_page_image</text>
</g>
<!-- t5&#45;&gt;t11 -->
<g id="edge18" class="edge"><title>t5&#45;&gt;t11</title>
<path fill="none" stroke="#0044a0" d="M1051.07,-680.0px8C1072.76,-674.712 1090.1,-667.576 1098,-658.173 1136.53,-612.317 1122.5,-537.602 1109.06,-493.335"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1112.33,-492.043 1105.96,-483.573 1105.65,-494.164 1112.33,-492.043"/>
</g>
<!-- t7 -->
<g id="node8" class="node"><title>t7</title>
<polygon fill="#efa03b" stroke="black" points="1039.68,-600.173 720.324,-600.173 716.324,-596.173 716.324,-564.173 1035.68,-564.173 1039.68,-568.173 1039.68,-600.173"/>
<polyline fill="none" stroke="black" points="1035.68,-596.173 716.324,-596.173 "/>
<polyline fill="none" stroke="black" points="1035.68,-596.173 1035.68,-564.173 "/>
<polyline fill="none" stroke="black" points="1035.68,-596.173 1039.68,-600.173 "/>
<text text-anchor="middle" x="878" y="-576.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.preprocess_deskew</text>
</g>
<!-- t6&#45;&gt;t7 -->
<g id="edge8" class="edge"><title>t6&#45;&gt;t7</title>
<path fill="none" stroke="#0044a0" d="M875.916,-622.066C876.114,-618.375 876.328,-614.385 876.541,-610.415"/>
<polygon fill="#0044a0" stroke="#0044a0" points="880.049,-610.347 877.089,-600.174 873.059,-609.972 880.049,-610.347"/>
</g>
<!-- t6&#45;&gt;t11 -->
<g id="edge17" class="edge"><title>t6&#45;&gt;t11</title>
<path fill="none" stroke="#0044a0" d="M990.695,-622.152C1016.54,-616.369 1039.2,-609.066 1049,-600.173 1078.78,-573.156 1089.74,-526.964 1093.74,-494.403"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1097.24,-494.666 1094.82,-484.351 1090.28,-493.924 1097.24,-494.666"/>
</g>
<!-- t8 -->
<g id="node9" class="node"><title>t8</title>
<polygon fill="#efa03b" stroke="black" points="1030.88,-542.173 729.117,-542.173 725.117,-538.173 725.117,-506.173 1026.88,-506.173 1030.88,-510.173 1030.88,-542.173"/>
<polyline fill="none" stroke="black" points="1026.88,-538.173 725.117,-538.173 "/>
<polyline fill="none" stroke="black" points="1026.88,-538.173 1026.88,-506.173 "/>
<polyline fill="none" stroke="black" points="1026.88,-538.173 1030.88,-542.173 "/>
<text text-anchor="middle" x="878" y="-518.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.preprocess_clean</text>
</g>
<!-- t7&#45;&gt;t8 -->
<g id="edge9" class="edge"><title>t7&#45;&gt;t8</title>
<path fill="none" stroke="#0044a0" d="M878,-564.066C878,-560.375 878,-556.385 878,-552.415"/>
<polygon fill="#0044a0" stroke="#0044a0" points="881.5,-552.174 878,-542.174 874.5,-552.174 881.5,-552.174"/>
</g>
<!-- t7&#45;&gt;t11 -->
<g id="edge16" class="edge"><title>t7&#45;&gt;t11</title>
<path fill="none" stroke="#0044a0" d="M995.441,-564.147C1011.26,-558.713 1026.62,-551.566 1040,-542.173 1057.45,-529.919 1070.89,-510.334 1080.22,-493.051"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1083.55,-494.243 1084.99,-483.747 1077.31,-491.053 1083.55,-494.243"/>
</g>
<!-- t9 -->
<g id="node10" class="node"><title>t9</title>
<polygon fill="#efa03b" stroke="black" points="694.109,-474.173 389.891,-474.173 385.891,-470.173 385.891,-438.173 690.109,-438.173 694.109,-442.173 694.109,-474.173"/>
<polyline fill="none" stroke="black" points="690.109,-470.173 385.891,-470.173 "/>
<polyline fill="none" stroke="black" points="690.109,-470.173 690.109,-438.173 "/>
<polyline fill="none" stroke="black" points="690.109,-470.173 694.109,-474.173 "/>
<text text-anchor="middle" x="540" y="-450.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.select_ocr_image</text>
</g>
<!-- t8&#45;&gt;t9 -->
<g id="edge10" class="edge"><title>t8&#45;&gt;t9</title>
<path fill="none" stroke="#0044a0" d="M790.517,-506.09C743.487,-496.907 685.383,-485.561 636.976,-476.109"/>
<polygon fill="#0044a0" stroke="#0044a0" points="637.602,-472.665 627.116,-474.183 636.26,-479.535 637.602,-472.665"/>
</g>
<!-- t8&#45;&gt;t11 -->
<g id="edge15" class="edge"><title>t8&#45;&gt;t11</title>
<path fill="none" stroke="#0044a0" d="M934.424,-506.09C958.693,-498.742 987.536,-490.01 1014.09,-481.971"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1015.2,-485.293 1023.75,-479.045 1013.17,-478.593 1015.2,-485.293"/>
</g>
<!-- t10 -->
<g id="node11" class="node"><title>t10</title>
<polygon fill="#00cc66" stroke="black" points="1440.1,-396.173 1125.9,-396.173 1121.9,-392.173 1121.9,-360.173 1436.1,-360.173 1440.1,-364.173 1440.1,-396.173"/>
<polyline fill="none" stroke="black" points="1436.1,-392.173 1121.9,-392.173 "/>
<polyline fill="none" stroke="black" points="1436.1,-392.173 1436.1,-360.173 "/>
<polyline fill="none" stroke="black" points="1436.1,-392.173 1440.1,-396.173 "/>
<text text-anchor="middle" x="1281" y="-372.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.ocr_tesseract_hocr</text>
</g>
<!-- t9&#45;&gt;t10 -->
<g id="edge11" class="edge"><title>t9&#45;&gt;t10</title>
<path fill="none" stroke="#0044a0" d="M631.992,-438.111C655.104,-434.327 679.903,-430.697 703,-428.173 884.404,-408.343 931.549,-425.567 1113,-406.173 1133.45,-403.987 1155.2,-400.994 1176.03,-397.794"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1176.83,-401.211 1186.17,-396.209 1175.75,-394.295 1176.83,-401.211"/>
</g>
<!-- t9&#45;&gt;t15 -->
<g id="edge13" class="edge"><title>t9&#45;&gt;t15</title>
<path fill="none" stroke="#0044a0" d="M474.47,-438.117C429.651,-426.452 370.0px1,-410.957 323.342,-398.782"/>
<polygon fill="#0044a0" stroke="#0044a0" points="324.123,-395.369 313.564,-396.237 322.36,-402.143 324.123,-395.369"/>
</g>
<!-- t13 -->
<g id="node12" class="node"><title>t13</title>
<polygon fill="#00cc66" stroke="black" points="683.043,-328.173 374.957,-328.173 370.957,-324.173 370.957,-292.173 679.043,-292.173 683.043,-296.173 683.043,-328.173"/>
<polyline fill="none" stroke="black" points="679.043,-324.173 370.957,-324.173 "/>
<polyline fill="none" stroke="black" points="679.043,-324.173 679.043,-292.173 "/>
<polyline fill="none" stroke="black" points="679.043,-324.173 683.043,-328.173 "/>
<text text-anchor="middle" x="527" y="-304.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.render_hocr_page</text>
</g>
<!-- t10&#45;&gt;t13 -->
<g id="edge12" class="edge"><title>t10&#45;&gt;t13</title>
<path fill="none" stroke="#0044a0" d="M1186.17,-360.113C1162.35,-356.33 1136.79,-352.699 1113,-350.173 929.956,-330.738 880.531,-342.246 693.485,-328.255"/>
<polygon fill="#0044a0" stroke="#0044a0" points="693.548,-324.75 683.311,-327.48 693.016,-331.73 693.548,-324.75"/>
</g>
<!-- t14 -->
<g id="node17" class="node"><title>t14</title>
<polygon fill="#00cc66" stroke="black" points="1072.92,-328.173 705.08,-328.173 701.08,-324.173 701.08,-292.173 1068.92,-292.173 1072.92,-296.173 1072.92,-328.173"/>
<polyline fill="none" stroke="black" points="1068.92,-324.173 701.08,-324.173 "/>
<polyline fill="none" stroke="black" points="1068.92,-324.173 1068.92,-292.173 "/>
<polyline fill="none" stroke="black" points="1068.92,-324.173 1072.92,-328.173 "/>
<text text-anchor="middle" x="887" y="-304.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.render_hocr_debug_page</text>
</g>
<!-- t10&#45;&gt;t14 -->
<g id="edge25" class="edge"><title>t10&#45;&gt;t14</title>
<path fill="none" stroke="#0044a0" d="M1179.28,-360.133C1124,-350.873 1055.54,-339.405 998.77,-329.896"/>
<polygon fill="#0044a0" stroke="#0044a0" points="999.118,-326.405 988.677,-328.205 997.962,-333.309 999.118,-326.405"/>
</g>
<!-- t16 -->
<g id="node16" class="node"><title>t16</title>
<polygon fill="#00cc66" stroke="black" points="636.299,-270.173 345.701,-270.173 341.701,-266.173 341.701,-234.173 632.299,-234.173 636.299,-238.173 636.299,-270.173"/>
<polyline fill="none" stroke="black" points="632.299,-266.173 341.701,-266.173 "/>
<polyline fill="none" stroke="black" points="632.299,-266.173 632.299,-234.173 "/>
<polyline fill="none" stroke="black" points="632.299,-266.173 636.299,-270.173 "/>
<text text-anchor="middle" x="489" y="-246.173" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.combine_layers</text>
</g>
<!-- t13&#45;&gt;t16 -->
<g id="edge22" class="edge"><title>t13&#45;&gt;t16</title>
<path fill="none" stroke="#0044a0" d="M515.392,-292.066C512.519,-287.833 509.379,-283.205 506.299,-278.666"/>
<polygon fill="#0044a0" stroke="#0044a0" points="509.048,-276.483 500.537,-270.174 503.256,-280.414 509.048,-276.483"/>
</g>
<!-- t15&#45;&gt;t16 -->
<g id="edge21" class="edge"><title>t15&#45;&gt;t16</title>
<path fill="none" stroke="#0044a0" d="M263.466,-359.936C281.645,-340.695 313.598,-309.935 347,-292.173 361.3,-284.568 377.219,-278.339 393.079,-273.27"/>
<polygon fill="#0044a0" stroke="#0044a0" points="394.389,-276.53 402.932,-270.262 392.345,-269.835 394.389,-276.53"/>
</g>
<!-- t11&#45;&gt;t12 -->
<g id="edge19" class="edge"><title>t11&#45;&gt;t12</title>
<path fill="none" stroke="#0044a0" d="M1009.92,-434.405C967.591,-424.191 916.524,-411.87 873.373,-401.459"/>
<polygon fill="#0044a0" stroke="#0044a0" points="873.983,-398.006 863.441,-399.063 872.341,-404.811 873.983,-398.006"/>
</g>
<!-- t11&#45;&gt;t14 -->
<g id="edge24" class="edge"><title>t11&#45;&gt;t14</title>
<path fill="none" stroke="#0044a0" d="M1334.06,-445.464C1386.49,-438.209 1431.63,-426.12 1449,-406.173 1465.34,-387.403 1466.07,-368.289 1449,-350.173 1422.45,-321.987 1153.75,-330.0px 1083.05,-328.037"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1083,-324.531 1072.85,-327.564 1082.68,-331.524 1083,-324.531"/>
</g>
<!-- t11&#45;&gt;t17 -->
<g id="edge27" class="edge"><title>t11&#45;&gt;t17</title>
<path fill="none" stroke="#0044a0" d="M1278.64,-441.463C1364.44,-433.122 1450.86,-421.174 1464,-406.173 1480.4,-387.448 1479.49,-369.65 1464,-350.173 1457.83,-342.418 1443.67,-336.074 1426.02,-330.926"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1426.46,-327.418 1415.89,-328.188 1424.63,-334.176 1426.46,-327.418"/>
</g>
<!-- t12&#45;&gt;t16 -->
<g id="edge23" class="edge"><title>t12&#45;&gt;t16</title>
<path fill="none" stroke="#0044a0" d="M624.426,-363.718C509.174,-353.04 370.992,-338.277 362,-328.173 351.364,-316.22 352.491,-305.04 362,-292.173 366.819,-285.651 372.71,-280.186 379.287,-275.609"/>
<polygon fill="#0044a0" stroke="#0044a0" points="381.274,-278.496 387.956,-270.274 377.605,-272.534 381.274,-278.496"/>
<g id="edge2" class="edge">
<title>t1&#45;&gt;t2</title>
<path fill="none" stroke="#0044a0" d="M774.5557,-1120.8306C775.4962,-1117.0421 776.5194,-1112.92 777.5618,-1108.7212"/>
<polygon fill="#0044a0" stroke="#0044a0" points="780.986,-1109.4542 779.9984,-1098.9055 774.1922,-1107.7677 780.986,-1109.4542"/>
</g>
<!-- t20 -->
<g id="node21" class="node"><title>t20</title>
<polygon fill="#efa03b" stroke="black" points="234.918,-156.426 480,-129.117 725.082,-156.426 724.853,-200.614 235.147,-200.614 234.918,-156.426"/>
<polygon fill="none" stroke="black" points="230.903,-152.847 480,-125.09 729.097,-152.847 728.829,-204.616 231.171,-204.616 230.903,-152.847"/>
<text text-anchor="middle" x="480" y="-162.639" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.merge_pages_ghostscript</text>
<g id="node22" class="node">
<title>t20</title>
<polygon fill="#efa03b" stroke="#000000" points="649.5156,-1020.2193 286.4844,-1020.2193 282.4844,-1016.2193 282.4844,-984.2193 645.5156,-984.2193 649.5156,-988.2193 649.5156,-1020.2193"/>
<polyline fill="none" stroke="#000000" points="645.5156,-1016.2193 282.4844,-1016.2193 "/>
<polyline fill="none" stroke="#000000" points="645.5156,-1016.2193 645.5156,-984.2193 "/>
<polyline fill="none" stroke="#000000" points="645.5156,-1016.2193 649.5156,-1020.2193 "/>
<text text-anchor="middle" x="466" y="-996.2193" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.generate_postscript_stub</text>
</g>
<!-- t16&#45;&gt;t20 -->
<g id="edge33" class="edge"><title>t16&#45;&gt;t20</title>
<path fill="none" stroke="#0044a0" d="M487.091,-233.881C486.46,-228.165 485.726,-221.515 484.974,-214.703"/>
<polygon fill="#0044a0" stroke="#0044a0" points="488.446,-214.253 483.87,-204.697 481.488,-215.021 488.446,-214.253"/>
<!-- t1&#45;&gt;t20 -->
<g id="edge31" class="edge">
<title>t1&#45;&gt;t20</title>
<path fill="none" stroke="#0044a0" d="M598.785,-1123.5822C563.105,-1117.7214 531.8209,-1109.8012 517,-1099.1825 493.9382,-1082.6593 480.4369,-1052.4741 473.1842,-1030.1561"/>
<polygon fill="#0044a0" stroke="#0044a0" points="476.5199,-1029.095 470.2797,-1020.5329 469.8185,-1031.1177 476.5199,-1029.095"/>
</g>
<!-- t16&#45;&gt;t21 -->
<g id="edge37" class="edge"><title>t16&#45;&gt;t21</title>
<path fill="none" stroke="#0044a0" d="M602.543,-234.159C645.082,-227.582 693.805,-219.809 738,-212.173 748.572,-210.346 759.416,-208.431 770.357,-206.468"/>
<polygon fill="#0044a0" stroke="#0044a0" points="771.206,-209.872 780.427,-204.653 769.964,-202.983 771.206,-209.872"/>
<!-- t24 -->
<g id="node24" class="node">
<title>t24</title>
<polygon fill="#efa03b" stroke="#000000" points="20.4213,-156.4247 242,-129.112 463.5787,-156.4247 463.3719,-200.6177 20.6281,-200.6177 20.4213,-156.4247"/>
<polygon fill="none" stroke="#000000" points="16.4083,-152.8864 242,-125.079 467.5917,-152.8864 467.3496,-204.6205 16.6504,-204.6205 16.4083,-152.8864"/>
<text text-anchor="middle" x="242" y="-162.6394" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.merge_pages_mupdf</text>
</g>
<!-- t14&#45;&gt;t20 -->
<g id="edge34" class="edge"><title>t14&#45;&gt;t20</title>
<path fill="none" stroke="#0044a0" d="M837.094,-292.063C776.411,-271.259 672.165,-235.52 591.922,-208.01"/>
<polygon fill="#0044a0" stroke="#0044a0" points="592.855,-204.63 582.26,-204.697 590.584,-211.251 592.855,-204.63"/>
<!-- t1&#45;&gt;t24 -->
<g id="edge41" class="edge">
<title>t1&#45;&gt;t24</title>
<path fill="none" stroke="#0044a0" d="M598.6617,-1124.8567C376.4578,-1103.9215 17,-1060.9746 17,-1002.2193 17,-1002.2193 17,-1002.2193 17,-335.7123 17,-276.266 68.2524,-235.5065 121.8346,-209.1377"/>
<polygon fill="#0044a0" stroke="#0044a0" points="123.6227,-212.1629 131.1479,-204.7049 120.6143,-205.8423 123.6227,-212.1629"/>
</g>
<!-- t14&#45;&gt;t21 -->
<g id="edge38" class="edge"><title>t14&#45;&gt;t21</title>
<path fill="none" stroke="#0044a0" d="M896.319,-292.063C906.85,-272.729 924.406,-240.497 938.861,-213.958"/>
<polygon fill="#0044a0" stroke="#0044a0" points="942.118,-215.294 943.828,-204.838 935.971,-211.946 942.118,-215.294"/>
<!-- t23 -->
<g id="node25" class="node">
<title>t23</title>
<polygon fill="#efa03b" stroke="#000000" points="1006.4902,-156.4239 1218,-129.1092 1429.5098,-156.4239 1429.3124,-200.6199 1006.6876,-200.6199 1006.4902,-156.4239"/>
<polygon fill="none" stroke="#000000" points="1002.4742,-152.9063 1218,-125.073 1433.5258,-152.9063 1433.2948,-204.623 1002.7052,-204.623 1002.4742,-152.9063"/>
<text text-anchor="middle" x="1218" y="-162.6394" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.merge_pages_qpdf</text>
</g>
<!-- t19&#45;&gt;t20 -->
<g id="edge30" class="edge"><title>t19&#45;&gt;t20</title>
<path fill="none" stroke="#0044a0" d="M257.907,-234.081C284.597,-226.336 317.298,-216.848 349.316,-207.558"/>
<polygon fill="#0044a0" stroke="#0044a0" points="350.595,-210.831 359.224,-204.683 348.645,-204.108 350.595,-210.831"/>
<!-- t1&#45;&gt;t23 -->
<g id="edge46" class="edge">
<title>t1&#45;&gt;t23</title>
<path fill="none" stroke="#0044a0" d="M941.3419,-1136.2202C1263.4143,-1128.3561 1927,-1100.2573 1927,-1002.2193 1927,-1002.2193 1927,-1002.2193 1927,-335.7123 1927,-234.7734 1651.3069,-194.7548 1443.7522,-178.9295"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1443.8443,-175.4267 1433.6111,-178.1712 1443.3223,-182.4072 1443.8443,-175.4267"/>
</g>
<!-- t19&#45;&gt;t21 -->
<g id="edge35" class="edge"><title>t19&#45;&gt;t21</title>
<path fill="none" stroke="#0044a0" d="M323.792,-235.042C326.891,-234.738 329.964,-234.447 333,-234.173 512.532,-217.929 559.043,-233.851 738,-212.173 751.869,-210.493 766.169,-208.472 780.522,-206.237"/>
<polygon fill="#0044a0" stroke="#0044a0" points="781.136,-209.683 790.462,-204.657 780.037,-202.77 781.136,-209.683"/>
<!-- t3 -->
<g id="node4" class="node">
<title>t3</title>
<polygon fill="#efa03b" stroke="#000000" points="1055.3851,-1020.2193 808.6149,-1020.2193 804.6149,-1016.2193 804.6149,-984.2193 1051.3851,-984.2193 1055.3851,-988.2193 1055.3851,-1020.2193"/>
<polyline fill="none" stroke="#000000" points="1051.3851,-1016.2193 804.6149,-1016.2193 "/>
<polyline fill="none" stroke="#000000" points="1051.3851,-1016.2193 1051.3851,-984.2193 "/>
<polyline fill="none" stroke="#000000" points="1051.3851,-1016.2193 1055.3851,-1020.2193 "/>
<text text-anchor="middle" x="930" y="-996.2193" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.split_page</text>
</g>
<!-- t17&#45;&gt;t20 -->
<g id="edge32" class="edge"><title>t17&#45;&gt;t20</title>
<path fill="none" stroke="#0044a0" d="M1195.47,-292.133C1071.63,-270.93 856.728,-234.138 694.688,-206.395"/>
<polygon fill="#0044a0" stroke="#0044a0" points="695.028,-202.903 684.581,-204.665 693.846,-209.802 695.028,-202.903"/>
<!-- t2&#45;&gt;t3 -->
<g id="edge3" class="edge">
<title>t2&#45;&gt;t3</title>
<path fill="none" stroke="#0044a0" d="M837.0145,-1046.7494C851.946,-1039.5987 868.2558,-1031.7881 882.9879,-1024.733"/>
<polygon fill="#0044a0" stroke="#0044a0" points="884.9035,-1027.6964 892.4109,-1020.2204 881.88,-1021.383 884.9035,-1027.6964"/>
</g>
<!-- t17&#45;&gt;t21 -->
<g id="edge36" class="edge"><title>t17&#45;&gt;t21</title>
<path fill="none" stroke="#0044a0" d="M1254.29,-292.063C1205.19,-271.428 1121.13,-236.1 1055.9,-208.683"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1056.99,-205.345 1046.42,-204.697 1054.28,-211.799 1056.99,-205.345"/>
<!-- t4 -->
<g id="node5" class="node">
<title>t4</title>
<polygon fill="#efa03b" stroke="#000000" points="1194.5194,-941.2939 964,-958.1945 733.4806,-941.2939 733.6958,-913.948 1194.3042,-913.948 1194.5194,-941.2939"/>
<polygon fill="none" stroke="#000000" points="1198.5491,-945.0069 964,-962.203 729.4509,-945.0069 729.7267,-909.9503 1198.2733,-909.9503 1198.5491,-945.0069"/>
<text text-anchor="middle" x="964" y="-927.7357" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.ocr_or_skip</text>
</g>
<!-- t18&#45;&gt;t20 -->
<g id="edge31" class="edge"><title>t18&#45;&gt;t20</title>
<path fill="none" stroke="#0044a0" d="M120.266,-796.105C70.9512,-780.34 17,-751.202 17,-699.173 17,-699.173 17,-699.173 17,-309.173 17,-269.597 31.8505,-255.79 65,-234.173 92.9782,-215.927 154.085,-202.475 221.024,-192.724"/>
<polygon fill="#0044a0" stroke="#0044a0" points="221.533,-196.187 230.939,-191.311 220.546,-189.256 221.533,-196.187"/>
<!-- t3&#45;&gt;t4 -->
<g id="edge4" class="edge">
<title>t3&#45;&gt;t4</title>
<path fill="none" stroke="#0044a0" d="M939.1114,-983.867C941.197,-979.6659 943.4863,-975.0549 945.8053,-970.3839"/>
<polygon fill="#0044a0" stroke="#0044a0" points="948.9439,-971.9327 950.2559,-961.4194 942.6741,-968.8199 948.9439,-971.9327"/>
</g>
<!-- t5 -->
<g id="node6" class="node">
<title>t5</title>
<polygon fill="#efa03b" stroke="#000000" points="1119.3166,-883.252 812.6834,-883.252 808.6834,-879.252 808.6834,-847.252 1115.3166,-847.252 1119.3166,-851.252 1119.3166,-883.252"/>
<polyline fill="none" stroke="#000000" points="1115.3166,-879.252 808.6834,-879.252 "/>
<polyline fill="none" stroke="#000000" points="1115.3166,-879.252 1115.3166,-847.252 "/>
<polyline fill="none" stroke="#000000" points="1115.3166,-879.252 1119.3166,-883.252 "/>
<text text-anchor="middle" x="964" y="-859.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.rasterize_preview</text>
</g>
<!-- t4&#45;&gt;t5 -->
<g id="edge5" class="edge">
<title>t4&#45;&gt;t5</title>
<path fill="none" stroke="#0044a0" d="M964,-909.7834C964,-904.5184 964,-898.8955 964,-893.4799"/>
<polygon fill="#0044a0" stroke="#0044a0" points="967.5001,-893.4695 964,-883.4695 960.5001,-893.4695 967.5001,-893.4695"/>
</g>
<!-- t6 -->
<g id="node7" class="node">
<title>t6</title>
<polygon fill="#efa03b" stroke="#000000" points="1269.0824,-825.252 1010.9176,-825.252 1006.9176,-821.252 1006.9176,-789.252 1265.0824,-789.252 1269.0824,-793.252 1269.0824,-825.252"/>
<polyline fill="none" stroke="#000000" points="1265.0824,-821.252 1006.9176,-821.252 "/>
<polyline fill="none" stroke="#000000" points="1265.0824,-821.252 1265.0824,-789.252 "/>
<polyline fill="none" stroke="#000000" points="1265.0824,-821.252 1269.0824,-825.252 "/>
<text text-anchor="middle" x="1138" y="-801.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.orient_page</text>
</g>
<!-- t4&#45;&gt;t6 -->
<g id="edge7" class="edge">
<title>t4&#45;&gt;t6</title>
<path fill="none" stroke="#0044a0" d="M1072.6871,-909.8532C1097.768,-902.2558 1119.5887,-893.2079 1128,-883.252 1138.9559,-870.2843 1141.4763,-851.3696 1141.2475,-835.6545"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1144.7291,-835.2052 1140.7199,-825.3983 1137.7384,-835.5649 1144.7291,-835.2052"/>
</g>
<!-- t5&#45;&gt;t6 -->
<g id="edge6" class="edge">
<title>t5&#45;&gt;t6</title>
<path fill="none" stroke="#0044a0" d="M1018.1009,-847.2184C1035.9411,-841.2716 1055.9459,-834.6034 1074.4267,-828.4431"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1075.5526,-831.7572 1083.9326,-825.2745 1073.3389,-825.1165 1075.5526,-831.7572"/>
</g>
<!-- t7 -->
<g id="node8" class="node">
<title>t7</title>
<polygon fill="#efa03b" stroke="#000000" points="917.7325,-767.252 542.2675,-767.252 538.2675,-763.252 538.2675,-731.252 913.7325,-731.252 917.7325,-735.252 917.7325,-767.252"/>
<polyline fill="none" stroke="#000000" points="913.7325,-763.252 538.2675,-763.252 "/>
<polyline fill="none" stroke="#000000" points="913.7325,-763.252 913.7325,-731.252 "/>
<polyline fill="none" stroke="#000000" points="913.7325,-763.252 917.7325,-767.252 "/>
<text text-anchor="middle" x="728" y="-743.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.rasterize_with_ghostscript</text>
</g>
<!-- t6&#45;&gt;t7 -->
<g id="edge8" class="edge">
<title>t6&#45;&gt;t7</title>
<path fill="none" stroke="#0044a0" d="M1010.5209,-789.2184C964.4341,-782.6988 912.2171,-775.312 865.3222,-768.6781"/>
<polygon fill="#0044a0" stroke="#0044a0" points="865.792,-765.2098 855.4003,-767.2745 864.8114,-772.1408 865.792,-765.2098"/>
</g>
<!-- t17 -->
<g id="node15" class="node">
<title>t17</title>
<polygon fill="#ff69b4" stroke="#000000" points="1224.2696,-447.252 843.7304,-447.252 839.7304,-443.252 839.7304,-411.252 1220.2696,-411.252 1224.2696,-415.252 1224.2696,-447.252"/>
<polyline fill="none" stroke="#000000" points="1220.2696,-443.252 839.7304,-443.252 "/>
<polyline fill="none" stroke="#000000" points="1220.2696,-443.252 1220.2696,-411.252 "/>
<polyline fill="none" stroke="#000000" points="1220.2696,-443.252 1224.2696,-447.252 "/>
<text text-anchor="middle" x="1032" y="-423.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.ocr_tesseract_textonly_pdf</text>
</g>
<!-- t6&#45;&gt;t17 -->
<g id="edge16" class="edge">
<title>t6&#45;&gt;t17</title>
<path fill="none" stroke="#0044a0" d="M1158.4397,-788.9107C1179.7261,-767.6923 1210,-730.5987 1210,-691.252 1210,-691.252 1210,-691.252 1210,-575.252 1210,-532.3545 1227.3937,-512.2638 1200,-479.252 1190.5284,-467.8379 1163.9108,-457.8666 1134.5783,-449.8944"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1135.1079,-446.4151 1124.5475,-447.2681 1133.3349,-453.1869 1135.1079,-446.4151"/>
</g>
<!-- t14 -->
<g id="node17" class="node">
<title>t14</title>
<polygon fill="#00cc66" stroke="#000000" points="1565,-457.252 1242.4141,-429.252 1565,-401.252 1887.5859,-429.252 1565,-457.252"/>
<text text-anchor="middle" x="1565" y="-423.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.select_image_layer</text>
</g>
<!-- t6&#45;&gt;t14 -->
<g id="edge22" class="edge">
<title>t6&#45;&gt;t14</title>
<path fill="none" stroke="#0044a0" d="M1211.6459,-789.1984C1287.5889,-768.3738 1395,-731.7602 1395,-691.252 1395,-691.252 1395,-691.252 1395,-575.252 1395,-519.4485 1448.3697,-480.3436 1495.3026,-456.7437"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1497.1229,-459.7505 1504.5857,-452.2301 1494.0619,-453.4552 1497.1229,-459.7505"/>
</g>
<!-- t21 -->
<g id="node20" class="node">
<title>t21</title>
<polygon fill="#efa03b" stroke="#000000" points="1414.7716,-270.1725 1169.2284,-270.1725 1165.2284,-266.1725 1165.2284,-234.1725 1410.7716,-234.1725 1414.7716,-238.1725 1414.7716,-270.1725"/>
<polyline fill="none" stroke="#000000" points="1410.7716,-266.1725 1165.2284,-266.1725 "/>
<polyline fill="none" stroke="#000000" points="1410.7716,-266.1725 1410.7716,-234.1725 "/>
<polyline fill="none" stroke="#000000" points="1410.7716,-266.1725 1414.7716,-270.1725 "/>
<text text-anchor="middle" x="1290" y="-246.1725" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.skip_page</text>
</g>
<!-- t6&#45;&gt;t21 -->
<g id="edge28" class="edge">
<title>t6&#45;&gt;t21</title>
<path fill="none" stroke="#0044a0" d="M1269.322,-800.6326C1488.9576,-787.7851 1907,-754.9633 1907,-691.252 1907,-691.252 1907,-691.252 1907,-429.252 1907,-329.7211 1606.6136,-282.8737 1425.0278,-263.647"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1425.1684,-260.1428 1414.8592,-262.586 1424.4419,-267.105 1425.1684,-260.1428"/>
</g>
<!-- t19 -->
<g id="node21" class="node">
<title>t19</title>
<polygon fill="#66ccff" stroke="#000000" points="465.6739,-447.252 60.3261,-447.252 56.3261,-443.252 56.3261,-411.252 461.6739,-411.252 465.6739,-415.252 465.6739,-447.252"/>
<polyline fill="none" stroke="#000000" points="461.6739,-443.252 56.3261,-443.252 "/>
<polyline fill="none" stroke="#000000" points="461.6739,-443.252 461.6739,-411.252 "/>
<polyline fill="none" stroke="#000000" points="461.6739,-443.252 465.6739,-447.252 "/>
<text text-anchor="middle" x="261" y="-423.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.ocr_tesseract_and_render_pdf</text>
</g>
<!-- t6&#45;&gt;t19 -->
<g id="edge30" class="edge">
<title>t6&#45;&gt;t19</title>
<path fill="none" stroke="#0044a0" d="M1006.6775,-802.4744C883.1032,-797.0687 693.0454,-786.4114 529,-767.252 327.1018,-743.6717 78,-894.5226 78,-691.252 78,-691.252 78,-691.252 78,-575.252 78,-532.3545 60.4757,-512.1551 88,-479.252 97.684,-467.6756 124.6714,-457.7191 154.5327,-449.8074"/>
<polygon fill="#0044a0" stroke="#0044a0" points="155.4872,-453.176 164.3106,-447.311 153.7556,-446.3936 155.4872,-453.176"/>
</g>
<!-- t8 -->
<g id="node9" class="node">
<title>t8</title>
<polygon fill="#efa03b" stroke="#000000" points="942.0801,-709.252 517.9199,-709.252 513.9199,-705.252 513.9199,-673.252 938.0801,-673.252 942.0801,-677.252 942.0801,-709.252"/>
<polyline fill="none" stroke="#000000" points="938.0801,-705.252 513.9199,-705.252 "/>
<polyline fill="none" stroke="#000000" points="938.0801,-705.252 938.0801,-673.252 "/>
<polyline fill="none" stroke="#000000" points="938.0801,-705.252 942.0801,-709.252 "/>
<text text-anchor="middle" x="728" y="-685.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.preprocess_remove_background</text>
</g>
<!-- t7&#45;&gt;t8 -->
<g id="edge9" class="edge">
<title>t7&#45;&gt;t8</title>
<path fill="none" stroke="#0044a0" d="M728,-731.2184C728,-727.5438 728,-723.5938 728,-719.6583"/>
<polygon fill="#0044a0" stroke="#0044a0" points="731.5001,-719.4742 728,-709.4743 724.5001,-719.4743 731.5001,-719.4742"/>
</g>
<!-- t13 -->
<g id="node16" class="node">
<title>t13</title>
<polygon fill="#efa03b" stroke="#000000" points="481,-535.252 97.1874,-507.252 481,-479.252 864.8126,-507.252 481,-535.252"/>
<text text-anchor="middle" x="481" y="-501.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.select_visible_page_image</text>
</g>
<!-- t7&#45;&gt;t13 -->
<g id="edge20" class="edge">
<title>t7&#45;&gt;t13</title>
<path fill="none" stroke="#0044a0" d="M592.7552,-731.2177C555.8805,-724.9263 521.5464,-717.3855 505,-709.252 470.5499,-692.3178 456.557,-686.3456 441,-651.252 425.2764,-615.7827 441.5685,-572.6191 457.8398,-542.8513"/>
<polygon fill="#0044a0" stroke="#0044a0" points="460.9365,-544.4864 462.8533,-534.0664 454.8568,-541.0167 460.9365,-544.4864"/>
</g>
<!-- t9 -->
<g id="node10" class="node">
<title>t9</title>
<polygon fill="#efa03b" stroke="#000000" points="773.6759,-651.252 454.3241,-651.252 450.3241,-647.252 450.3241,-615.252 769.6759,-615.252 773.6759,-619.252 773.6759,-651.252"/>
<polyline fill="none" stroke="#000000" points="769.6759,-647.252 450.3241,-647.252 "/>
<polyline fill="none" stroke="#000000" points="769.6759,-647.252 769.6759,-615.252 "/>
<polyline fill="none" stroke="#000000" points="769.6759,-647.252 773.6759,-651.252 "/>
<text text-anchor="middle" x="612" y="-627.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.preprocess_deskew</text>
</g>
<!-- t8&#45;&gt;t9 -->
<g id="edge10" class="edge">
<title>t8&#45;&gt;t9</title>
<path fill="none" stroke="#0044a0" d="M691.9327,-673.2184C680.9122,-667.7081 668.6526,-661.5783 657.1104,-655.8072"/>
<polygon fill="#0044a0" stroke="#0044a0" points="658.5545,-652.6162 648.045,-651.2745 655.424,-658.8772 658.5545,-652.6162"/>
</g>
<!-- t8&#45;&gt;t13 -->
<g id="edge19" class="edge">
<title>t8&#45;&gt;t13</title>
<path fill="none" stroke="#0044a0" d="M763.3121,-673.1037C771.2083,-667.2594 778.5531,-659.9847 783,-651.252 790.2604,-636.9942 792.214,-628.3326 783,-615.252 759.3602,-581.6921 662.7714,-550.9641 585.1057,-530.9385"/>
<polygon fill="#0044a0" stroke="#0044a0" points="585.806,-527.5052 575.2515,-528.4283 584.078,-534.2886 585.806,-527.5052"/>
</g>
<!-- t10 -->
<g id="node11" class="node">
<title>t10</title>
<polygon fill="#efa03b" stroke="#000000" points="1117.8828,-593.252 816.1172,-593.252 812.1172,-589.252 812.1172,-557.252 1113.8828,-557.252 1117.8828,-561.252 1117.8828,-593.252"/>
<polyline fill="none" stroke="#000000" points="1113.8828,-589.252 812.1172,-589.252 "/>
<polyline fill="none" stroke="#000000" points="1113.8828,-589.252 1113.8828,-557.252 "/>
<polyline fill="none" stroke="#000000" points="1113.8828,-589.252 1117.8828,-593.252 "/>
<text text-anchor="middle" x="965" y="-569.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.preprocess_clean</text>
</g>
<!-- t9&#45;&gt;t10 -->
<g id="edge11" class="edge">
<title>t9&#45;&gt;t10</title>
<path fill="none" stroke="#0044a0" d="M721.7564,-615.2184C760.9379,-608.7806 805.2658,-601.4973 845.2464,-594.9283"/>
<polygon fill="#0044a0" stroke="#0044a0" points="846.0113,-598.3496 855.3115,-593.2745 844.8763,-591.4422 846.0113,-598.3496"/>
</g>
<!-- t9&#45;&gt;t13 -->
<g id="edge18" class="edge">
<title>t9&#45;&gt;t13</title>
<path fill="none" stroke="#0044a0" d="M593.2309,-615.1993C573.0988,-595.8356 540.6771,-564.6514 515.8453,-540.7673"/>
<polygon fill="#0044a0" stroke="#0044a0" points="518.0381,-538.0203 508.4046,-533.6106 513.1856,-543.0654 518.0381,-538.0203"/>
</g>
<!-- t11 -->
<g id="node12" class="node">
<title>t11</title>
<polygon fill="#efa03b" stroke="#000000" points="1191.1094,-525.252 886.8906,-525.252 882.8906,-521.252 882.8906,-489.252 1187.1094,-489.252 1191.1094,-493.252 1191.1094,-525.252"/>
<polyline fill="none" stroke="#000000" points="1187.1094,-521.252 882.8906,-521.252 "/>
<polyline fill="none" stroke="#000000" points="1187.1094,-521.252 1187.1094,-489.252 "/>
<polyline fill="none" stroke="#000000" points="1187.1094,-521.252 1191.1094,-525.252 "/>
<text text-anchor="middle" x="1037" y="-501.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.select_ocr_image</text>
</g>
<!-- t10&#45;&gt;t11 -->
<g id="edge12" class="edge">
<title>t10&#45;&gt;t11</title>
<path fill="none" stroke="#0044a0" d="M984.2947,-557.0293C992.2846,-549.4832 1001.6851,-540.6049 1010.318,-532.4517"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1012.7851,-534.9359 1017.6521,-525.5251 1007.9787,-529.8468 1012.7851,-534.9359"/>
</g>
<!-- t10&#45;&gt;t13 -->
<g id="edge17" class="edge">
<title>t10&#45;&gt;t13</title>
<path fill="none" stroke="#0044a0" d="M836.5676,-557.2078C770.772,-547.9638 690.4915,-536.6847 622.8731,-527.1846"/>
<polygon fill="#0044a0" stroke="#0044a0" points="622.9531,-523.6616 612.5634,-525.7361 621.9792,-530.5935 622.9531,-523.6616"/>
</g>
<!-- t12 -->
<g id="node13" class="node">
<title>t12</title>
<polygon fill="#00cc66" stroke="#000000" points="822.0996,-447.252 507.9004,-447.252 503.9004,-443.252 503.9004,-411.252 818.0996,-411.252 822.0996,-415.252 822.0996,-447.252"/>
<polyline fill="none" stroke="#000000" points="818.0996,-443.252 503.9004,-443.252 "/>
<polyline fill="none" stroke="#000000" points="818.0996,-443.252 818.0996,-411.252 "/>
<polyline fill="none" stroke="#000000" points="818.0996,-443.252 822.0996,-447.252 "/>
<text text-anchor="middle" x="663" y="-423.252" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.ocr_tesseract_hocr</text>
</g>
<!-- t11&#45;&gt;t12 -->
<g id="edge13" class="edge">
<title>t11&#45;&gt;t12</title>
<path fill="none" stroke="#0044a0" d="M950.2568,-489.1612C893.2425,-477.2705 818.5749,-461.6981 759.6569,-449.4104"/>
<polygon fill="#0044a0" stroke="#0044a0" points="760.1,-445.9276 749.5961,-447.3122 758.6708,-452.7802 760.1,-445.9276"/>
</g>
<!-- t11&#45;&gt;t17 -->
<g id="edge15" class="edge">
<title>t11&#45;&gt;t17</title>
<path fill="none" stroke="#0044a0" d="M1035.8403,-489.1612C1035.2388,-479.7779 1034.4904,-468.1019 1033.8144,-457.5566"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1037.3033,-457.2705 1033.1707,-447.5149 1030.3177,-457.7184 1037.3033,-457.2705"/>
</g>
<!-- t15 -->
<g id="node14" class="node">
<title>t15</title>
<polygon fill="#00cc66" stroke="#000000" points="1229.0433,-353.7123 920.9567,-353.7123 916.9567,-349.7123 916.9567,-317.7123 1225.0433,-317.7123 1229.0433,-321.7123 1229.0433,-353.7123"/>
<polyline fill="none" stroke="#000000" points="1225.0433,-349.7123 916.9567,-349.7123 "/>
<polyline fill="none" stroke="#000000" points="1225.0433,-349.7123 1225.0433,-317.7123 "/>
<polyline fill="none" stroke="#000000" points="1225.0433,-349.7123 1229.0433,-353.7123 "/>
<text text-anchor="middle" x="1073" y="-329.7123" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.render_hocr_page</text>
</g>
<!-- t12&#45;&gt;t15 -->
<g id="edge14" class="edge">
<title>t12&#45;&gt;t15</title>
<path fill="none" stroke="#0044a0" d="M754.3855,-411.2269C799.2649,-402.117 854.0781,-390.6067 903,-379.252 933.2642,-372.2277 966.3927,-363.8908 995.3012,-356.4015"/>
<polygon fill="#0044a0" stroke="#0044a0" points="996.5416,-359.6955 1005.3389,-353.7914 994.7799,-352.9208 996.5416,-359.6955"/>
</g>
<!-- t16 -->
<g id="node19" class="node">
<title>t16</title>
<polygon fill="#00cc66" stroke="#000000" points="651.9202,-270.1725 284.0798,-270.1725 280.0798,-266.1725 280.0798,-234.1725 647.9202,-234.1725 651.9202,-238.1725 651.9202,-270.1725"/>
<polyline fill="none" stroke="#000000" points="647.9202,-266.1725 280.0798,-266.1725 "/>
<polyline fill="none" stroke="#000000" points="647.9202,-266.1725 647.9202,-234.1725 "/>
<polyline fill="none" stroke="#000000" points="647.9202,-266.1725 651.9202,-270.1725 "/>
<text text-anchor="middle" x="466" y="-246.1725" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.render_hocr_debug_page</text>
</g>
<!-- t12&#45;&gt;t16 -->
<g id="edge27" class="edge">
<title>t12&#45;&gt;t16</title>
<path fill="none" stroke="#0044a0" d="M772.353,-411.2135C825.7002,-401.3017 880.0px85,-389.0648 888,-379.252 912.2169,-349.0628 914.0433,-320.8011 888,-292.1725 871.9898,-274.5731 764.4698,-264.5473 661.9779,-258.9344"/>
<polygon fill="#0044a0" stroke="#0044a0" points="661.9319,-255.4271 651.7593,-258.3883 661.5583,-262.4171 661.9319,-255.4271"/>
</g>
<!-- t25 -->
<g id="node27" class="node">
<title>t25</title>
<polygon fill="#efa03b" stroke="#000000" points="488.7205,-323.495 682,-296.1762 875.2795,-323.495 875.0991,-367.6976 488.9009,-367.6976 488.7205,-323.495"/>
<polygon fill="none" stroke="#000000" points="484.7033,-320.0193 682,-292.1327 879.2967,-320.0193 879.0858,-371.7013 484.9142,-371.7013 484.7033,-320.0193"/>
<text text-anchor="middle" x="682" y="-329.7123" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.merge_sidecars</text>
</g>
<!-- t12&#45;&gt;t25 -->
<g id="edge52" class="edge">
<title>t12&#45;&gt;t25</title>
<path fill="none" stroke="#0044a0" d="M666.6634,-411.2166C668.3795,-402.768 670.5105,-392.2769 672.6326,-381.8293"/>
<polygon fill="#0044a0" stroke="#0044a0" points="676.09,-382.3905 674.6507,-371.8939 669.2301,-380.9971 676.09,-382.3905"/>
</g>
<!-- t18 -->
<g id="node18" class="node">
<title>t18</title>
<polygon fill="#00cc66" stroke="#000000" points="1147.2989,-270.1725 856.7011,-270.1725 852.7011,-266.1725 852.7011,-234.1725 1143.2989,-234.1725 1147.2989,-238.1725 1147.2989,-270.1725"/>
<polyline fill="none" stroke="#000000" points="1143.2989,-266.1725 852.7011,-266.1725 "/>
<polyline fill="none" stroke="#000000" points="1143.2989,-266.1725 1143.2989,-234.1725 "/>
<polyline fill="none" stroke="#000000" points="1143.2989,-266.1725 1147.2989,-270.1725 "/>
<text text-anchor="middle" x="1000" y="-246.1725" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.combine_layers</text>
</g>
<!-- t15&#45;&gt;t18 -->
<g id="edge24" class="edge">
<title>t15&#45;&gt;t18</title>
<path fill="none" stroke="#0044a0" d="M1057.1601,-317.5854C1047.0201,-305.9814 1033.7081,-290.7474 1022.4822,-277.9007"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1025.0247,-275.4911 1015.809,-270.264 1019.7536,-280.0972 1025.0247,-275.4911"/>
</g>
<!-- t17&#45;&gt;t18 -->
<g id="edge23" class="edge">
<title>t17&#45;&gt;t18</title>
<path fill="none" stroke="#0044a0" d="M1160.5767,-411.2248C1195.7121,-403.5317 1227.1378,-393.066 1238,-379.252 1261.9222,-348.8288 1262.9959,-321.72 1238,-292.1725 1231.6408,-284.6553 1197.8632,-277.2656 1157.6598,-270.9231"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1158.0117,-267.4362 1147.596,-269.3761 1156.9481,-274.3549 1158.0117,-267.4362"/>
</g>
<!-- t17&#45;&gt;t25 -->
<g id="edge51" class="edge">
<title>t17&#45;&gt;t25</title>
<path fill="none" stroke="#0044a0" d="M964.5165,-411.2166C925.304,-400.7368 874.3329,-387.1145 826.4989,-374.3305"/>
<polygon fill="#0044a0" stroke="#0044a0" points="827.2267,-370.9023 816.6621,-371.7016 825.4193,-377.6649 827.2267,-370.9023"/>
</g>
<!-- t13&#45;&gt;t14 -->
<g id="edge21" class="edge">
<title>t13&#45;&gt;t14</title>
<path fill="none" stroke="#0044a0" d="M672.8683,-493.1993C736.8314,-488.6166 808.4777,-483.5937 874,-479.252 1033.5051,-468.6828 1073.5671,-468.8587 1233,-457.252 1285.8429,-453.4051 1343.3743,-448.7264 1395.4741,-444.3037"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1395.81,-447.7879 1405.477,-443.4521 1395.2161,-440.8131 1395.81,-447.7879"/>
</g>
<!-- t13&#45;&gt;t16 -->
<g id="edge26" class="edge">
<title>t13&#45;&gt;t16</title>
<path fill="none" stroke="#0044a0" d="M479.4495,-479.3529C478.2545,-457.9761 476.5497,-427.7492 475,-401.252 472.546,-359.2945 469.5914,-310.7019 467.754,-280.6981"/>
<polygon fill="#0044a0" stroke="#0044a0" points="471.2362,-280.2988 467.1306,-270.5318 464.2493,-280.7273 471.2362,-280.2988"/>
</g>
<!-- t13&#45;&gt;t19 -->
<g id="edge29" class="edge">
<title>t13&#45;&gt;t19</title>
<path fill="none" stroke="#0044a0" d="M415.2907,-483.9551C385.6007,-473.4286 350.7427,-461.0699 321.6782,-450.7652"/>
<polygon fill="#0044a0" stroke="#0044a0" points="322.6542,-447.3978 312.0595,-447.3549 320.315,-453.9954 322.6542,-447.3978"/>
</g>
<!-- t14&#45;&gt;t18 -->
<g id="edge25" class="edge">
<title>t14&#45;&gt;t18</title>
<path fill="none" stroke="#0044a0" d="M1519.9776,-405.138C1460.3688,-374.2505 1351.1978,-321.2463 1252,-292.1725 1221.8888,-283.3473 1189.1477,-276.3434 1157.5373,-270.8287"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1157.7641,-267.3171 1147.3187,-269.0901 1156.59,-274.2179 1157.7641,-267.3171"/>
</g>
<!-- t22 -->
<g id="node23" class="node"><title>t22</title>
<polygon fill="#efa03b" stroke="black" points="554.065,-47.332 721,-20.0049 887.935,-47.332 887.779,-91.5483 554.221,-91.5483 554.065,-47.332"/>
<polygon fill="none" stroke="black" points="550.054,-43.9306 721,-15.9468 891.946,-43.9306 891.764,-95.5532 550.236,-95.5532 550.054,-43.9306"/>
<text text-anchor="middle" x="721" y="-53.5531" font-family="Times,serif" font-size="20.00">ocrmypdf.pipeline.copy_final</text>
<g id="node23" class="node">
<title>t22</title>
<polygon fill="#efa03b" stroke="#000000" points="489.918,-156.4263 735,-129.1169 980.082,-156.4263 979.8532,-200.6137 490.1468,-200.6137 489.918,-156.4263"/>
<polygon fill="none" stroke="#000000" points="485.9027,-152.8467 735,-125.09 984.0973,-152.8467 983.8293,-204.6159 486.1707,-204.6159 485.9027,-152.8467"/>
<text text-anchor="middle" x="735" y="-162.6394" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.merge_pages_ghostscript</text>
</g>
<!-- t20&#45;&gt;t22 -->
<g id="edge41" class="edge"><title>t20&#45;&gt;t22</title>
<path fill="none" stroke="#0044a0" d="M556.585,-133.609C580.784,-122.857 607.72,-110.888 632.67,-99.8018"/>
<polygon fill="#0044a0" stroke="#0044a0" points="634.408,-102.859 642.125,-95.6004 631.566,-96.4625 634.408,-102.859"/>
<!-- t18&#45;&gt;t22 -->
<g id="edge35" class="edge">
<title>t18&#45;&gt;t22</title>
<path fill="none" stroke="#0044a0" d="M942.8252,-234.1499C918.2191,-226.3936 888.4232,-217.0013 859.1708,-207.7804"/>
<polygon fill="#0044a0" stroke="#0044a0" points="859.8692,-204.3309 849.2796,-204.6625 857.7647,-211.007 859.8692,-204.3309"/>
</g>
<!-- t18&#45;&gt;t24 -->
<g id="edge39" class="edge">
<title>t18&#45;&gt;t24</title>
<path fill="none" stroke="#0044a0" d="M852.4716,-245.1051C747.4645,-239.0474 603.1919,-228.6387 477,-212.1725 463.5912,-210.4229 449.788,-208.4132 435.908,-206.238"/>
<polygon fill="#0044a0" stroke="#0044a0" points="436.2183,-202.7434 425.7921,-204.6263 435.1168,-209.6562 436.2183,-202.7434"/>
</g>
<!-- t18&#45;&gt;t23 -->
<g id="edge44" class="edge">
<title>t18&#45;&gt;t23</title>
<path fill="none" stroke="#0044a0" d="M1047.0344,-234.1499C1066.9243,-226.5285 1090.9364,-217.3275 1114.596,-208.2617"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1115.9033,-211.509 1123.9889,-204.6625 1113.3986,-204.9724 1115.9033,-211.509"/>
</g>
<!-- t16&#45;&gt;t22 -->
<g id="edge36" class="edge">
<title>t16&#45;&gt;t22</title>
<path fill="none" stroke="#0044a0" d="M524.0378,-234.1499C549.1239,-226.3599 579.5241,-216.9196 609.3422,-207.6602"/>
<polygon fill="#0044a0" stroke="#0044a0" points="610.4833,-210.9707 618.9955,-204.6625 608.4073,-204.2857 610.4833,-210.9707"/>
</g>
<!-- t16&#45;&gt;t24 -->
<g id="edge40" class="edge">
<title>t16&#45;&gt;t24</title>
<path fill="none" stroke="#0044a0" d="M417.6711,-234.1499C397.2337,-226.5285 372.5607,-217.3275 348.2499,-208.2617"/>
<polygon fill="#0044a0" stroke="#0044a0" points="349.1912,-204.8773 338.5986,-204.6625 346.7453,-211.4361 349.1912,-204.8773"/>
</g>
<!-- t16&#45;&gt;t23 -->
<g id="edge45" class="edge">
<title>t16&#45;&gt;t23</title>
<path fill="none" stroke="#0044a0" d="M651.7596,-235.3105C656.5547,-234.9215 661.308,-234.5415 666,-234.1725 811.2137,-222.7545 848.5512,-230.9322 993,-212.1725 1006.176,-210.4614 1019.7432,-208.4558 1033.3753,-206.2619"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1034.0068,-209.7051 1043.3083,-204.6325 1032.8736,-202.7974 1034.0068,-209.7051"/>
</g>
<!-- t21&#45;&gt;t22 -->
<g id="edge40" class="edge"><title>t21&#45;&gt;t22</title>
<path fill="none" stroke="#0044a0" d="M888.417,-134.636C863.556,-123.635 835.613,-111.27 809.783,-99.8401"/>
<polygon fill="#0044a0" stroke="#0044a0" points="810.933,-96.5216 800.372,-95.6756 808.1,-102.923 810.933,-96.5216"/>
<g id="edge32" class="edge">
<title>t21&#45;&gt;t22</title>
<path fill="none" stroke="#0044a0" d="M1165.0941,-235.3973C1085.9035,-224.7541 997.501,-212.8552 993,-212.1725 980.474,-210.2728 967.615,-208.2703 954.6442,-206.2099"/>
<polygon fill="#0044a0" stroke="#0044a0" points="955.1339,-202.7439 944.7072,-204.6238 954.0305,-209.6564 955.1339,-202.7439"/>
</g>
<!-- t21&#45;&gt;t24 -->
<g id="edge37" class="edge">
<title>t21&#45;&gt;t24</title>
<path fill="none" stroke="#0044a0" d="M1165.2215,-234.9906C1162.1187,-234.699 1159.041,-234.4254 1156,-234.1725 855.1023,-209.1529 777.1841,-244.6523 477,-212.1725 462.026,-210.5524 446.5737,-208.5164 431.0798,-206.2151"/>
<polygon fill="#0044a0" stroke="#0044a0" points="431.3094,-202.7099 420.8968,-204.6663 430.2567,-209.6303 431.3094,-202.7099"/>
</g>
<!-- t21&#45;&gt;t23 -->
<g id="edge42" class="edge">
<title>t21&#45;&gt;t23</title>
<path fill="none" stroke="#0044a0" d="M1274.3771,-234.0471C1268.8557,-227.6412 1262.3807,-220.0px91 1255.8248,-212.5231"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1258.4543,-210.2128 1249.2743,-204.9233 1253.152,-214.783 1258.4543,-210.2128"/>
</g>
<!-- t19&#45;&gt;t22 -->
<g id="edge34" class="edge">
<title>t19&#45;&gt;t22</title>
<path fill="none" stroke="#0044a0" d="M260.6159,-410.9505C259.8316,-364.871 259.0249,-246.8273 271,-234.1725 302.6435,-200.7331 431.3919,-218.4498 477,-212.1725 490.4888,-210.316 504.3558,-208.2974 518.3278,-206.1801"/>
<polygon fill="#0044a0" stroke="#0044a0" points="519.1602,-209.5936 528.5161,-204.6219 518.1019,-202.6741 519.1602,-209.5936"/>
</g>
<!-- t19&#45;&gt;t24 -->
<g id="edge38" class="edge">
<title>t19&#45;&gt;t24</title>
<path fill="none" stroke="#0044a0" d="M259.0498,-411.2136C258.0595,-401.7112 256.8826,-389.8585 256,-379.252 251.2976,-322.7418 247.1648,-257.5963 244.6312,-214.9019"/>
<polygon fill="#0044a0" stroke="#0044a0" points="248.1192,-214.5935 244.0377,-204.8165 241.1313,-215.0048 248.1192,-214.5935"/>
</g>
<!-- t19&#45;&gt;t23 -->
<g id="edge43" class="edge">
<title>t19&#45;&gt;t23</title>
<path fill="none" stroke="#0044a0" d="M282.1528,-411.0561C318.8331,-380.6455 397.8323,-320.0855 476,-292.1725 553.979,-264.3269 579.2078,-283.062 661,-270.1725 742.8817,-257.269 762.3086,-248.2304 844,-234.1725 909.9705,-222.82 927.0119,-223.4221 993,-212.1725 1003.5851,-210.368 1014.439,-208.4601 1025.3874,-206.4907"/>
<polygon fill="#0044a0" stroke="#0044a0" points="1026.2474,-209.892 1035.4637,-204.666 1025,-203.004 1026.2474,-209.892"/>
</g>
<!-- t19&#45;&gt;t25 -->
<g id="edge50" class="edge">
<title>t19&#45;&gt;t25</title>
<path fill="none" stroke="#0044a0" d="M342.173,-411.2166C389.8324,-400.6274 451.9326,-386.8297 509.989,-373.9305"/>
<polygon fill="#0044a0" stroke="#0044a0" points="511.0179,-377.2873 520.0207,-371.7016 509.4996,-370.4539 511.0179,-377.2873"/>
</g>
<!-- t20&#45;&gt;t22 -->
<g id="edge33" class="edge">
<title>t20&#45;&gt;t22</title>
<path fill="none" stroke="#0044a0" d="M323.4472,-984.1943C198.6099,-964.2959 37,-926.6746 37,-865.252 37,-865.252 37,-865.252 37,-429.252 37,-211.1917 260.8906,-241.2767 477,-212.1725 490.808,-210.313 505.0108,-208.2741 519.3157,-206.1255"/>
<polygon fill="#0044a0" stroke="#0044a0" points="519.8697,-209.5816 529.2317,-204.6214 518.8199,-202.6608 519.8697,-209.5816"/>
</g>
<!-- t26 -->
<g id="node26" class="node">
<title>t26</title>
<polygon fill="#efa03b" stroke="#000000" points="568.0652,-47.332 735,-20.0049 901.9348,-47.332 901.779,-91.5483 568.221,-91.5483 568.0652,-47.332"/>
<polygon fill="none" stroke="#000000" points="564.0538,-43.9306 735,-15.9468 905.9462,-43.9306 905.7643,-95.5532 564.2357,-95.5532 564.0538,-43.9306"/>
<text text-anchor="middle" x="735" y="-53.5531" font-family="Times,serif" font-size="20.00" fill="#000000">ocrmypdf.pipeline.copy_final</text>
</g>
<!-- t22&#45;&gt;t26 -->
<g id="edge49" class="edge">
<title>t22&#45;&gt;t26</title>
<path fill="none" stroke="#0044a0" d="M735,-124.8984C735,-118.6708 735,-112.2475 735,-105.9711"/>
<polygon fill="#0044a0" stroke="#0044a0" points="738.5001,-105.6074 735,-95.6074 731.5001,-105.6075 738.5001,-105.6074"/>
</g>
<!-- t24&#45;&gt;t26 -->
<g id="edge47" class="edge">
<title>t24&#45;&gt;t26</title>
<path fill="none" stroke="#0044a0" d="M368.6395,-140.6178C427.4047,-127.6148 498.1821,-111.9539 561.7955,-97.8781"/>
<polygon fill="#0044a0" stroke="#0044a0" points="562.9329,-101.2112 571.9406,-95.6333 561.4205,-94.3765 562.9329,-101.2112"/>
</g>
<!-- t23&#45;&gt;t26 -->
<g id="edge48" class="edge">
<title>t23&#45;&gt;t26</title>
<path fill="none" stroke="#0044a0" d="M1095.1818,-140.9007C1037.3475,-127.8387 967.4279,-112.0473 904.6388,-97.8663"/>
<polygon fill="#0044a0" stroke="#0044a0" points="905.1511,-94.3939 894.6256,-95.6048 903.6089,-101.2219 905.1511,-94.3939"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 36 KiB

+139 -64
View File
@@ -5,10 +5,85 @@ OCRmyPDF uses `semantic versioning <http://semver.org/>`_ for its command line i
The OCRmyPDF package itself does not contain a public API, although it is fairly stable and breaking changes are usually timed with a major release. A future release will clearly define the stable public API.
.. Issue regex
find: [^`]\#([0-9]{1,3})[^0-9]
replace: `#$1 <https://github.com/jbarlow83/OCRmyPDF/issues/$1>`_
v6.2.3
------
- Fix compatibility with img2pdf >= 0.3.0 by rejecting input images that have an alpha channel
v6.2.2
------
- Backport compatibility fixes for Python 3.7 and ruffus 2.7.0 from v7.0.0
- Backport fix to ignore masks when deciding what colors are on a page
- Backport some minor improvements from v7.0.0: better argument validation and warnings about the Tesseract 4.0.0 ``--user-words`` regression
v6.2.1
------
- Fix recent versions of Tesseract (after 4.0.0-beta1) not being detected as supporting the ``sandwich`` renderer (`#271 <https://github.com/ppjbarlow83/OCRmyPDF/issues/271>`_).
v6.2.0
------
- **Docker**: The Docker image ``ocrmypdf-tess4`` has been removed. The main Docker images, ``ocrmypdf`` and ``ocrmypdf-polyglot`` now use Ubuntu 18.04 as a base image, and as such Tesseract 4.0.0-beta1 is now the Tesseract version they use. There is no Docker image based on Tesseract 3.05 anymore.
- Creation of PDF/A-3 is now supported. However, there is no ability to attach files to PDF/A-3.
- List more reasons why the file size might grow.
- Fix issue `#262 <https://github.com/ppjbarlow83/OCRmyPDF/issues/262>`_, ``--remove-background`` error on PDFs contained colormapped (paletted) images.
- Fix another XMP metadata validation issue, in cases where the input file's creation date has no timezone and the creation date is not overridden.
v6.1.5
------
- Fix issue `#253 <https://github.com/jbarlow83/OCRmyPDF/issues/253>`_, a possible division by zero when using the ``hocr`` renderer.
- Fix incorrectly formatted ``<xmp:ModifyDate>`` field inside XMP metadata for PDF/As. veraPDF flags this as a PDF/A validation failure. The error is caused the timezone and final digit of the seconds of modified time to be omitted, so at worst the modification time stamp is rounded to the nearest 10 seconds.
v6.1.4
------
- Fix issue `#248 <https://github.com/jbarlow83/OCRmyPDF/issues/248>`_ ``--clean`` argument may remove OCR from left column of text on certain documents. We now set ``--layout none`` to suppress this.
- The test cache was updated to reflect the change above.
- Change test suite to accommodate Ghostscript 9.23's new ability to insert JPEGs into PDFs without transcoding.
- XMP metadata in PDFs is now examined using ``defusedxml`` for safety.
- If an external process exits with a signal when asked to report its version, we now print the system error message instead of suppressing it. This occurred when the required executable was found but was missing a shared library.
- qpdf 7.0.0 or newer is now required as the test suite can no longer pass without it.
Notes
~~~~~
- An apparent `regression in Ghostscript 9.23 <https://bugs.ghostscript.com/show_bug.cgi?id=699216>`_ will cause some ocrmypdf output files to become invalid in rare cases; the workaround for the moment is to set ``--force-ocr``.
v6.1.3
------
- Fix issue `#247 <https://github.com/jbarlow83/OCRmyPDF/issues/247>`_, ``/CreationDate`` metadata not copied from input to output.
- A warning is now issued when Python 3.5 is used on files with a large page count, as this case is known to regress to single core performance. The cause of this problem is unknown.
v6.1.2
------
- Upgrade to PyMuPDF v1.12.5 which includes a more complete fix to #239.
- Upgrade to PyMuPDF v1.12.5 which includes a more complete fix to `#239 <https://github.com/jbarlow83/OCRmyPDF/issues/239>`_.
- Add ``defusedxml`` dependency.
@@ -24,11 +99,11 @@ v6.1.0
- PyMuPDF is now an optional but recommended dependency, to alleviate installation difficulties on platforms that have less access to PyMuPDF than the author anticipated. Install OCRmyPDF with ``pip install ocrmypdf[fitz]`` to use it to its full potential.
- Fix ``FileExistsError`` that could occur if OCR timed out while it was generating the output file. (#218)
- Fix ``FileExistsError`` that could occur if OCR timed out while it was generating the output file. (`#218 <https://github.com/jbarlow83/OCRmyPDF/issues/218>`_)
- Fix table of contents/bookmarks all being redirected to page 1 when generating a PDF/A (with PyMuPDF). (Without PyMuPDF the table of contents is removed in PDF/A mode.)
- Fix "RuntimeError: invalid key in dict" when table of contents/bookmarks titles contained the character ``)``. (#239)
- Fix "RuntimeError: invalid key in dict" when table of contents/bookmarks titles contained the character ``)``. (`#239 <https://github.com/jbarlow83/OCRmyPDF/issues/239>`_)
- Added a new argument ``--skip-repair`` to skip the initial PDF repair step if the PDF is already well-formed (because another program repaired it).
@@ -52,21 +127,21 @@ v6.0.0
+ The ``--pdf-renderer tess4`` alias for ``sandwich`` was removed.
- Fixed an issue where OCRmyPDF failed to detect existing text on pages, depending on how the text and fonts were encoded within the PDF. (#233, #232)
- Fixed an issue where OCRmyPDF failed to detect existing text on pages, depending on how the text and fonts were encoded within the PDF. (`#233 <https://github.com/jbarlow83/OCRmyPDF/issues/233>`_, `#232 <https://github.com/jbarlow83/OCRmyPDF/issues/232>`_)
- Fixed an issue that caused dramatic inflation of file sizes when ``--skip-text --output-type pdf`` was used. OCRmyPDF now removes duplicate resources such as fonts, images and other objects that it generates. (#237)
- Fixed an issue that caused dramatic inflation of file sizes when ``--skip-text --output-type pdf`` was used. OCRmyPDF now removes duplicate resources such as fonts, images and other objects that it generates. (`#237 <https://github.com/jbarlow83/OCRmyPDF/issues/237>`_)
- Improved performance of the initial page splitting step. Originally this step was not believed to be expensive and ran in a process. Large file testing revealed it to be a bottleneck, so it is now parallelized. On a 700 page file with quad core machine, this change saves about 2 minutes. (#234)
- Improved performance of the initial page splitting step. Originally this step was not believed to be expensive and ran in a process. Large file testing revealed it to be a bottleneck, so it is now parallelized. On a 700 page file with quad core machine, this change saves about 2 minutes. (`#234 <https://github.com/jbarlow83/OCRmyPDF/issues/234>`_)
- The test suite now includes a cache that can be used to speed up test runs across platforms. This also does not require computing checksums, so it's faster. (#217)
- The test suite now includes a cache that can be used to speed up test runs across platforms. This also does not require computing checksums, so it's faster. (`#217 <https://github.com/jbarlow83/OCRmyPDF/issues/217>`_)
v5.7.0
------
- Fixed an issue that caused poor CPU utilization on machines more than 4 cores when running Tesseract 4. (Related to issue #217.)
- Fixed an issue that caused poor CPU utilization on machines more than 4 cores when running Tesseract 4. (Related to issue `#217 <https://github.com/jbarlow83/OCRmyPDF/issues/217>`_.)
- The 'hocr' renderer has been improved. The 'sandwich' and 'tesseract' renderers are still better for most use cases, but 'hocr' may be useful for people who work with the PDF.js renderer in English/ASCII languages. (#225)
- The 'hocr' renderer has been improved. The 'sandwich' and 'tesseract' renderers are still better for most use cases, but 'hocr' may be useful for people who work with the PDF.js renderer in English/ASCII languages. (`#225 <https://github.com/jbarlow83/OCRmyPDF/issues/225>`_)
+ It now formats text in a matter that is easier for certain PDF viewers to select and extract copy and paste text. This should help macOS Preview and PDF.js in particular.
+ The appearance of selected text and behavior of selecting text is improved.
@@ -89,7 +164,7 @@ v5.6.2
v5.6.1
------
- Fix issue #219: change how the final output file is created to avoid triggering permission errors when the output is a special file such as ``/dev/null``
- Fix issue `#219 <https://github.com/jbarlow83/OCRmyPDF/issues/219>`_: change how the final output file is created to avoid triggering permission errors when the output is a special file such as ``/dev/null``
- Fix test suite failures due to a qpdf 8.0.0 regression and Python 3.5's handling of symlink
- The "encrypted PDF" error message was different depending on the type of PDF encryption. Now a single clear message appears for all types of PDF encryption.
- ocrmypdf is now in Homebrew. Homebrew users are advised to the version of ocrmypdf in the official homebrew-core formulas rather than the private tap.
@@ -99,7 +174,7 @@ v5.6.1
v5.6.0
------
- Fix issue #216: preserve "text as curves" PDFs without rasterizing file
- Fix issue `#216 <https://github.com/jbarlow83/OCRmyPDF/issues/216>`_: preserve "text as curves" PDFs without rasterizing file
- Related to the above, messages about rasterizing are more consistent
- For consistency versions minor releases will now get the trailing .0 they always should have had.
@@ -110,17 +185,17 @@ v5.5
- Add new argument ``--max-image-mpixels``. Pillow 5.0 now raises an exception when images may be decompression bombs. This argument can be used to override the limit Pillow sets.
- Fix output page cropped when using the sandwich renderer and OCR is skipped on a rotated and image-processed page
- A warning is now issued when old versions of Ghostscript are used in cases known to cause issues with non-Latin characters
- Fix a few parameter validation checks for ``-output-type pdfa-1`` and ``pdfa-2``
- Fix a few parameter validation checks for ``-output-type pdfa-1`` and ``pdfa-2``
v5.4.4
------
- Fix issue #181: fix final merge failure for PDFs with more pages than the system file handle limit (``ulimit -n``)
- Fix issue #200: an uncommon syntax for formatting decimal numbers in a PDF would cause qpdf to issue a warning, which ocrmypdf treated as an error. Now this the warning is relayed.
- Fix issue `#181 <https://github.com/jbarlow83/OCRmyPDF/issues/181>`_: fix final merge failure for PDFs with more pages than the system file handle limit (``ulimit -n``)
- Fix issue `#200 <https://github.com/jbarlow83/OCRmyPDF/issues/200>`_: an uncommon syntax for formatting decimal numbers in a PDF would cause qpdf to issue a warning, which ocrmypdf treated as an error. Now this the warning is relayed.
- Fix an issue where intermediate PDFs would be created at version 1.3 instead of the version of the original file. It's possible but unlikely this had side effects.
- A warning is now issued when older versions of qpdf are used since issues like #200 cause qpdf to infinite-loop
- Address issue #140: if Tesseract outputs invalid UTF-8, escape it and print its message instead of aborting with a Unicode error
- A warning is now issued when older versions of qpdf are used since issues like `#200 <https://github.com/jbarlow83/OCRmyPDF/issues/200>`_ cause qpdf to infinite-loop
- Address issue `#140 <https://github.com/jbarlow83/OCRmyPDF/issues/140>`_: if Tesseract outputs invalid UTF-8, escape it and print its message instead of aborting with a Unicode error
- Adding previously unlisted setup requirement, pytest-runner
- Update documentation: fix an error in the example script for Synology with Docker images, improved security guidance, advised ``pip install --user``
@@ -178,9 +253,9 @@ v5.3.1
v5.3
----
- Added ``--user-words`` and ``--user-patterns`` arguments which are forwarded to Tesseract OCR as words and regular expressions respective to use to guide OCR. Supplying a list of subject-domain words should assist Tesseract with resolving words. (#165)
- Using a non Latin-1 language with the "hocr" renderer now warns about possible OCR quality and recommends workarounds (#176)
- Output file path added to error message when that location is not writable (#175)
- Added ``--user-words`` and ``--user-patterns`` arguments which are forwarded to Tesseract OCR as words and regular expressions respective to use to guide OCR. Supplying a list of subject-domain words should assist Tesseract with resolving words. (`#165 <https://github.com/jbarlow83/OCRmyPDF/issues/165>`_)
- Using a non Latin-1 language with the "hocr" renderer now warns about possible OCR quality and recommends workarounds (`#176 <https://github.com/jbarlow83/OCRmyPDF/issues/176>`_)
- Output file path added to error message when that location is not writable (`#175 <https://github.com/jbarlow83/OCRmyPDF/issues/175>`_)
- Otherwise valid PDFs with leading whitespace at the beginning of the file are now accepted
@@ -201,7 +276,7 @@ v5.1
v5.0.1
------
- Fixed issue #169, exception due to failure to create sidecar text files on some versions of Tesseract 3.04, including the jbarlow83/ocrmypdf Docker image
- Fixed issue `#169 <https://github.com/jbarlow83/OCRmyPDF/issues/169>`_, exception due to failure to create sidecar text files on some versions of Tesseract 3.04, including the jbarlow83/ocrmypdf Docker image
v5.0
@@ -213,33 +288,33 @@ v5.0
+ Support for Tesseract 3.02 and 3.03 dropped. Tesseract 3.04 or newer is required. Tesseract 4.00 (alpha) is supported.
+ The OCRmyPDF.sh script was removed.
- Add a new feature, ``--sidecar``, which allows creating "sidecar" text files which contain the OCR results in plain text. These OCR text is more reliable than extracting text from PDFs. Closes #126.
- New feature: ``--pdfa-image-compression``, which allows overriding Ghostscript's lossy-or-lossless image encoding heuristic and making all images JPEG encoded or lossless encoded as desired. Fixes #163.
- Fixed issue #143, added ``--quiet`` to suppress "INFO" messages
- Fixed issue #164, a typo
- Add a new feature, ``--sidecar``, which allows creating "sidecar" text files which contain the OCR results in plain text. These OCR text is more reliable than extracting text from PDFs. Closes `#126 <https://github.com/jbarlow83/OCRmyPDF/issues/126>`_.
- New feature: ``--pdfa-image-compression``, which allows overriding Ghostscript's lossy-or-lossless image encoding heuristic and making all images JPEG encoded or lossless encoded as desired. Fixes `#163 <https://github.com/jbarlow83/OCRmyPDF/issues/163>`_.
- Fixed issue `#143 <https://github.com/jbarlow83/OCRmyPDF/issues/143>`_, added ``--quiet`` to suppress "INFO" messages
- Fixed issue `#164 <https://github.com/jbarlow83/OCRmyPDF/issues/164>`_, a typo
- Removed the command line parameters ``-n`` and ``--just-print`` since they have not worked for some time (reported as Ubuntu bug `#1687308 <https://bugs.launchpad.net/ubuntu/+source/ocrmypdf/+bug/1687308>`_)
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
- Fixed issue `#156 <https://github.com/jbarlow83/OCRmyPDF/issues/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 <https://github.com/jbarlow83/OCRmyPDF/issues/158>`_, ocrmypdf now stops and terminates if Ghostscript fails on an intermediate step, as it is not possible to proceed.
- Fixed issue `#160 <https://github.com/jbarlow83/OCRmyPDF/issues/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. Note: incomplete fix for this issue.
- Fixed issue `#154 <https://github.com/jbarlow83/OCRmyPDF/issues/154>`_, KeyError '/Contents' when searching for text on blank pages that have no /Contents record. Note: incomplete fix for this issue.
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)
- Fix ``--skip-big`` raising an exception if a page contains no images (`#152 <https://github.com/jbarlow83/OCRmyPDF/issues/152>`_) (thanks to @TomRaz)
- Fix an issue where pages with no images might trigger "cannot write mode P as JPEG" (`#151 <https://github.com/jbarlow83/OCRmyPDF/issues/151>`_)
v4.5.3
@@ -254,7 +329,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.
- Fix issue `#147 <https://github.com/jbarlow83/OCRmyPDF/issues/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
- Set up machinery for homebrew OCRmyPDF tap
@@ -262,13 +337,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
- Fix issue `#137 <https://github.com/jbarlow83/OCRmyPDF/issues/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
- Exotic PDFs containing "Form XObjects" are now supported (issue `#134 <https://github.com/jbarlow83/OCRmyPDF/issues/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
@@ -289,7 +364,7 @@ v4.4.1
- To prevent a `TIFF output error <https://github.com/python-pillow/Pillow/issues/2206>`_ 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
- Documentation improvements to describe the ``--tesseract-config`` feature
- Documentation improvements to describe the ``--tesseract-config`` feature
- Added test cases and fixed error handling for ``--tesseract-config``
- Tweaks to setup.py to deal with issues in the v4.4 release
@@ -352,7 +427,7 @@ v4.3
- New feature ``--remove-background`` to detect and erase the background of color and grayscale images
- Better documentation
- Fixed an issue with PDFs that draw images when the raster stack depth is zero
- Fixed an issue with PDFs that draw images when the raster stack depth is zero
- ocrmypdf can now redirect its output to stdout for use in a shell pipeline
+ This does not improve performance since temporary files are still used for buffering
@@ -361,14 +436,14 @@ v4.3
v4.2.5
------
- Fixed an issue (#100) with PDFs that omit the optional /BitsPerComponent parameter on images
- Fixed an issue (`#100 <https://github.com/jbarlow83/OCRmyPDF/issues/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 an error (`#90 <https://github.com/jbarlow83/OCRmyPDF/issues/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
@@ -401,7 +476,7 @@ v4.2.1
v4.2
----
- ocrmypdf will now try to convert single image files to PDFs if they are provided as input (#15)
- ocrmypdf will now try to convert single image files to PDFs if they are provided as input (`#15 <https://github.com/jbarlow83/OCRmyPDF/issues/15>`_)
+ This is a basic convenience feature. It only supports a single image and always makes the image fill the whole page.
+ For better control over image to PDF conversion, use ``img2pdf`` (one of ocrmypdf's dependencies)
@@ -417,10 +492,10 @@ v4.2
+ supports users who want to use OCRmyPDF to reconstruct text information in PDFs with damaged Unicode maps (copy and paste text does not match displayed text)
+ supports reinterpreting PDFs where text was rendered as curves for printing, and text needs to be recovered
+ fixes issue #82
+ fixes issue `#82 <https://github.com/jbarlow83/OCRmyPDF/issues/82>`_
- Fixes an issue where, with certain settings, monochrome images in PDFs would be converted to 8-bit grayscale, increasing file size (#79)
- Support for Ubuntu 12.04 LTS "precise" has been dropped in favor of (roughly) Ubuntu 14.04 LTS "trusty"
- Fixes an issue where, with certain settings, monochrome images in PDFs would be converted to 8-bit grayscale, increasing file size (`#79 <https://github.com/jbarlow83/OCRmyPDF/issues/79>`_)
- Support for Ubuntu 12.04 LTS "precise" has been dropped in favor of (roughly) Ubuntu 14.04 LTS "trusty"
+ Some Ubuntu "PPAs" (backports) are needed to make it work
@@ -535,7 +610,7 @@ 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
fairly reliable but some false positives occur especially if there is not much text to work with. (#4)
fairly reliable but some false positives occur especially if there is not much text to work with. (`#4 <https://github.com/jbarlow83/OCRmyPDF/issues/4>`_)
- Deskewing is now performed using Leptonica instead of unpaper. Leptonica is faster and more reliable
at image deskewing than unpaper.
@@ -546,14 +621,14 @@ 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)
- Fixed an issue where lossless reconstruction could misalign the graphics layer with respect to
text layer if the page had been cropped such that its origin is not (0, 0) (#49)
text layer if the page had been cropped such that its origin is not (0, 0) (`#49 <https://github.com/jbarlow83/OCRmyPDF/issues/49>`_)
Changes
^^^^^^^
- Logging output is now much easier to read
- ``--deskew`` is now performed by Leptonica instead of unpaper (#25)
- ``--deskew`` is now performed by Leptonica instead of unpaper (`#25 <https://github.com/jbarlow83/OCRmyPDF/issues/25>`_)
- libffi is now required
- Some changes were made to the Docker and Travis build environments to support libffi
- ``--pdf-renderer=tesseract`` now displays a warning if the Tesseract version is less than 3.04.01,
@@ -568,7 +643,7 @@ v3.2.1
Changes
^^^^^^^
- Fixed issue #47 "convert() got and unexpected keyword argument 'dpi'" by upgrading to img2pdf 0.2
- Fixed issue `#47 <https://github.com/jbarlow83/OCRmyPDF/issues/47>`_ "convert() got and unexpected keyword argument 'dpi'" by upgrading to img2pdf 0.2
- Tweaked the Dockerfiles
@@ -578,7 +653,7 @@ v3.2
New features
^^^^^^^^^^^^
- Lossless reconstruction: when possible, OCRmyPDF will inject text layers without
- 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
of vector and raster content would see the vector content preserved. Images may still be transcoded
during PDF/A conversion. (``--deskew`` and ``--clean-final`` disable this mode, necessarily.)
@@ -612,11 +687,11 @@ Changes
- Python 3.5 and macOS El Capitan are now supported platforms - no changes were
needed to implement support
- Improved some error messages related to missing input files
- Fixed issue #20 - uppercase .PDF extension not accepted
- Fixed an issue where OCRmyPDF failed to text that certain pages contained previously OCR'ed text,
- Fixed issue `#20 <https://github.com/jbarlow83/OCRmyPDF/issues/20>`_ - uppercase .PDF extension not accepted
- Fixed an issue where OCRmyPDF failed to text that certain pages contained previously OCR'ed text,
such as OCR text produced by Tesseract 3.04
- Inserts /Creator tag into PDFs so that errors can be traced back to this project
- Added new option ``--pdf-renderer=auto``, to let OCRmyPDF pick the best PDF renderer.
- Added new option ``--pdf-renderer=auto``, to let OCRmyPDF pick the best PDF renderer.
Currently it always chooses the 'hocrtransform' renderer but that behavior may change.
- Set up Travis CI automatic integration testing
@@ -626,19 +701,19 @@ v3.0
New features
^^^^^^^^^^^^
- Easier installation with a Docker container or Python's ``pip`` package manager
- Easier installation with a Docker container or Python's ``pip`` package manager
- Eliminated many external dependencies, so it's easier to setup
- Now installs ``ocrmypdf`` to ``/usr/local/bin`` or equivalent for system-wide
access and easier typing
- Improved command line syntax and usage help (``--help``)
- Tesseract 3.03+ PDF page rendering can be used instead for better positioning
of recognized text (``--pdf-renderer tesseract``)
- PDF metadata (title, author, keywords) are now transferred to the
- PDF metadata (title, author, keywords) are now transferred to the
output PDF
- PDF metadata can also be set from the command line (``--title``, etc.)
- Automatic repairs malformed input PDFs if possible
- Added test cases to confirm everything is working
- Added option to skip extremely large pages that take too long to OCR and are
- Added option to skip extremely large pages that take too long to OCR and are
often not OCRable (e.g. large scanned maps or diagrams); other pages are still
processed (``--skip-big``)
- Added option to kill Tesseract OCR process if it seems to be taking too long on
@@ -657,9 +732,9 @@ Changes
available CPUs, increasing performance
- The ``-o DPI`` argument has been phased out, in favor of ``--oversample DPI``, in
case we need ``-o OUTPUTFILE`` in the future
- Removed several dependencies, so it's easier to install. We no
- Removed several dependencies, so it's easier to install. We no
longer use:
- GNU parallel_
- ImageMagick_
- Python 2.7
@@ -675,7 +750,7 @@ Changes
- qpdf_ 5.0.0+
- Unpaper_ 6.1 (optional)
- some automatically managed Python packages
.. _ruffus: http://www.ruffus.org.uk/index.html
.. _parallel: https://www.gnu.org/software/parallel/
.. _ImageMagick: http://www.imagemagick.org/script/index.php
@@ -689,14 +764,14 @@ Release candidates
- rc9:
- fix issue #118: report error if ghostscript iccprofiles are missing
- fixed another issue related to #111: PDF rasterized to palette file
- fix issue `#118 <https://github.com/jbarlow83/OCRmyPDF/issues/118>`_: report error if ghostscript iccprofiles are missing
- fixed another issue related to `#111 <https://github.com/jbarlow83/OCRmyPDF/issues/111>`_: PDF rasterized to palette file
- add support image files with a palette
- don't try to validate PDF file after an exception occurs
- rc8:
- fix issue #111: exception thrown if PDF is missing DocumentInfo dictionary
- fix issue `#111 <https://github.com/jbarlow83/OCRmyPDF/issues/111>`_: exception thrown if PDF is missing DocumentInfo dictionary
- rc7:
@@ -721,7 +796,7 @@ Release candidates
- fixed some installer issues and errors in installation instructions
- improve performance: run Ghostscript with multithreaded rendering
- improve performance: use multiple cores by default
- bug fix: checking for wrong exception on process timeout
- bug fix: checking for wrong exception on process timeout
- rc3: skipping version number intentionally to avoid confusion with Tesseract
- rc2: first release for public testing to test-PyPI, Github
@@ -744,11 +819,11 @@ where ``settings.txt`` contains *one argument per line*, for example:
::
-l
deu
--author
A. Merkel
--pdf-renderer
-l
deu
--author
A. Merkel
--pdf-renderer
tesseract
+4 -3
View File
@@ -1,10 +1,11 @@
# requirements.txt can be used to replicate the developer's build environment
# setup.py lists a separate set of requirements that are looser to simplify
# installation
ruffus == 2.6.3
Pillow == 5.0.0
ruffus == 2.7.0
Pillow == 5.2.0
reportlab == 3.4.0
PyPDF2 == 1.26.0
img2pdf == 0.2.4
cffi == 1.11.5
PyMuPDF == 1.12.4
PyMuPDF == 1.12.5
defusedxml == 0.5.0
-1
View File
@@ -11,7 +11,6 @@ ignore =
[tool:pytest]
norecursedirs = lib .pc .git output cache resources
testpaths = tests
addopts = -n auto
[metadata]
license_file = LICENSE
+6 -6
View File
@@ -186,13 +186,10 @@ if not forced and command.startswith('install') or \
)
check_external_program(
program='qpdf',
need_version='5.1.1', # limited by Travis CI / Ubuntu 14.04 backports
need_version='7.0.0', # test suite known to fail on 5.1.1
package='qpdf',
version_check_args=['--version']
)
else:
print('Skipping external program tests because of --force')
if 'upload' in sys.argv[1:]:
print('Use twine to upload the package - setup.py upload is insecure')
@@ -218,6 +215,7 @@ setup(
classifiers=[
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Intended Audience :: End Users/Desktop",
@@ -246,10 +244,12 @@ setup(
'cffi >= 1.9.1', # must be a setup and install requirement
'defusedxml >= 0.5.0', # pure Python, so track HEAD closely
'img2pdf >= 0.2.4', # pure Python, so track HEAD closely
'Pillow >= 4.0.0', # Pillow < 4 has BytesIO/TIFF bug w/img2pdf 0.2.3
'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
'PyPDF2 >= 1.26', # pure Python, so track HEAD closely
'reportlab >= 3.3.0', # oldest released version with sane image handling
'ruffus == 2.6.3', # pinned - ocrmypdf implements a 2.6.3 workaround
'ruffus >= 2.7.0',
],
extras_require={
'fitz': ['PyMuPDF >= 1.12.5'] # for table of contents bug
+78 -39
View File
@@ -70,7 +70,7 @@ def complain(message):
if 'IDE_PROJECT_ROOTS' in os.environ:
os.environ['PATH'] = '/usr/local/bin:' + os.environ['PATH']
# --------
# --------
# Critical environment tests
verify_python3_env()
@@ -85,6 +85,20 @@ if tesseract.version() < MINIMUM_TESS_VERSION:
# -------------
# Parser
def numeric(basetype, min_=None, max_=None):
"Validator for numeric params"
min_ = basetype(min_) if min_ is not None else None
max_ = basetype(max_) if max_ is not None else None
def _numeric(string):
value = basetype(string)
if (min_ is not None and value < min_
or max_ is not None and value > max_):
msg = "%r not in valid range %r" % (string, (min_, max_))
raise argparse.ArgumentTypeError(msg)
return value
return _numeric
parser = argparse.ArgumentParser(
prog=PROGRAM_NAME,
fromfile_prefix_chars='@',
@@ -156,14 +170,15 @@ parser.add_argument(
'--image-dpi', metavar='DPI', type=int,
help="For input image instead of PDF, use this DPI instead of file's.")
parser.add_argument(
'--output-type', choices=['pdfa', 'pdf', 'pdfa-1', 'pdfa-2'],
'--output-type', choices=['pdfa', 'pdf', 'pdfa-1', 'pdfa-2', 'pdfa-3'],
default='pdfa',
help="Choose output type. 'pdfa' creates a PDF/A-2b compliant file for "
"long term archiving (default, recommended) but may not suitable "
"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. 'pdf-a1' creates a "
"PDF/A1-b file. 'pdf-a2' is equivalent to 'pdfa'."
"PDF/A1-b file. 'pdf-a2' is equivalent to 'pdfa'. 'pdf-a3' creates a "
"PDF/A3-b file."
)
# Use null string '\0' as sentinel to indicate the user supplied no argument,
@@ -232,7 +247,7 @@ preprocessing.add_argument(
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,
'--oversample', metavar='DPI', type=numeric(int, 0, 5000), default=0,
help="Oversample images to at least the specified DPI, to improve OCR "
"results slightly")
@@ -254,7 +269,7 @@ ocrsettings.add_argument(
# "pages")
ocrsettings.add_argument(
'--skip-big', type=float, metavar='MPixels',
'--skip-big', type=numeric(float, 0, 5000), metavar='MPixels',
help="Skip OCR on pages larger than the specified amount of megapixels, "
"but include skipped pages in final output")
@@ -262,7 +277,7 @@ advanced = parser.add_argument_group(
"Advanced",
"Advanced options to control Tesseract's OCR behavior")
advanced.add_argument(
'--max-image-mpixels', action='store', type=float, metavar='MPixels',
'--max-image-mpixels', action='store', type=numeric(float, 0), metavar='MPixels',
help="Set maximum number of pixels to unpack before treating an image as a "
"decompression bomb",
default=128.0)
@@ -295,11 +310,11 @@ advanced.add_argument(
" of Ghostscript; deprecated"
)
advanced.add_argument(
'--tesseract-timeout', default=180.0, type=float, metavar='SECONDS',
'--tesseract-timeout', default=180.0, type=numeric(float, 0), metavar='SECONDS',
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',
'--rotate-pages-threshold', default=14.0, type=numeric(float, max_=1000), metavar='CONFIDENCE',
help="Only rotate pages when confidence is above this value (arbitrary "
"units reported by tesseract)")
advanced.add_argument(
@@ -394,6 +409,14 @@ def check_options_output(options, log):
log.info(
"Ignoring --debug-rendering because it requires --pdf-renderer=hocr")
if options.output_type == 'pdfa':
options.output_type = 'pdfa-2'
if options.output_type == 'pdfa-3' and ghostscript.version() < '9.19':
raise MissingDependencyError(
"--output-type pdfa-3 requires Ghostscript 9.19 or later"
)
lossless_reconstruction = False
if options.pdf_renderer in ('hocr', 'sandwich'):
if not any((options.deskew, options.clean_final, options.force_ocr,
@@ -482,6 +505,10 @@ def check_options_advanced(options, log):
"--output-type is not 'pdfa', 'pdfa-1', or 'pdfa-2'"
)
if tesseract.v4() and (options.user_words or options.user_patterns):
log.warning(
'Tesseract 4.x ignores --user-words, so this has no effect')
def check_options_metadata(options, log):
import unicodedata
@@ -565,7 +592,7 @@ def do_ruffus_exception(ruffus_five_tuple, options, log):
if exc_name == 'builtins.SystemExit':
match = re.search(r"\.(.+?)\)", exc_value)
exit_code_name = match.groups()[0]
exit_code = getattr(ExitCode, exit_code_name, 'other_error')
exit_code = getattr(ExitCode, exit_code_name, 'other_error')
elif exc_name == 'ruffus.ruffus_exceptions.MissingInputFileError':
log.error(cleanup_ruffus_error_message(exc_value))
exit_code = ExitCode.input_file
@@ -589,7 +616,7 @@ def do_ruffus_exception(ruffus_five_tuple, options, log):
(exc_name == 'ocrmypdf.exceptions.EncryptedPdfError'):
log.error(textwrap.dedent("""\
Input PDF is encrypted. The encryption must be removed to
perform OCR.
perform OCR.
For information about this PDF's security use
qpdf --show-encryption infilename
@@ -598,7 +625,7 @@ def do_ruffus_exception(ruffus_five_tuple, options, log):
qpdf --decrypt [--password=[password]] infilename
"""))
exit_code = ExitCode.encrypted_pdf
exit_code = ExitCode.encrypted_pdf
elif exc_name == 'ocrmypdf.exceptions.PdfMergeFailedError':
log.error(textwrap.dedent("""\
Failed to merge PDF image layer with OCR layer
@@ -629,33 +656,31 @@ def do_ruffus_exception(ruffus_five_tuple, options, log):
return ExitCode.other_error
def traverse_ruffus_exception(e_args, options, log):
"""Walk through a RethrownJobError and find the first exception.
def traverse_ruffus_exception(exceptions, options, log):
"""Traverse a RethrownJobError and output the exceptions
Ruffus flattens exception to 5 element tuples. Because of a bug
in <= 2.6.3 it may present either the single:
(task, job, exc, value, stack)
or something like:
[[(task, job, exc, value, stack)]]
Generally cross-process exception marshalling doesn't work well
and ruffus doesn't support because BaseException has its own
implementation of __reduce__ that attempts to reconstruct the
exception based on e.__init__(e.args).
Attempting to log the exception directly marshalls it to the logger
which is probably in another process, so it's better to log only
data from the exception at this point.
Ruffus presents exceptions as 5 element tuples. The RethrownJobException
has a list of exceptions like
e.job_exceptions = [(5-tuple), (5-tuple), ...]
ruffus < 2.7.0 had a bug with exception marshalling that would give
different output whether the main or child process raised the exception.
We no longer support this.
Attempting to log the exception itself will re-marshall it to the logger
which is normally running in another process. It's better to avoid re-
marshalling.
The exit code will be based on this, even if multiple exceptions occurred
at the same time."""
if isinstance(e_args, Sequence) and isinstance(e_args[0], str) and \
len(e_args) == 5:
return do_ruffus_exception(e_args, options, log)
elif is_iterable_notstr(e_args):
for exc in e_args:
return traverse_ruffus_exception(exc, options, log)
exit_codes = []
for exc in exceptions:
exit_code = do_ruffus_exception(exc, options, log)
exit_codes.append(exit_code)
return exit_codes[0] # Multiple codes are rare so take the first one
def check_closed_streams(options):
@@ -740,7 +765,7 @@ def check_environ(options, _log):
for k in old_envvars:
if k in os.environ:
_log.warning(textwrap.dedent("""\
OCRmyPDF no longer uses the environment variable {}.
OCRmyPDF no longer uses the environment variable {}.
Change PATH to select alternate programs.""".format(k)))
@@ -783,12 +808,24 @@ def report_output_file_size(options, _log, input_file, output_file):
ratio = output_size / input_size
if ratio < 1.35 or input_size < 25000:
return # Seems fine
reasons = []
if not fitz:
reasons.append("The optional dependency PyMuPDF is not installed.")
if options.force_ocr:
reasons.append("The argument --force-ocr was issued.")
image_preproc = {
'deskew',
'clean_final',
'remove_background',
'oversample',
'force_ocr'
}
for arg in image_preproc:
attr = getattr(options, arg, None)
if not attr:
continue
reasons.append(
"The argument --{} was issued, causing transcoding.".format(
arg.replace('_', '-')))
if reasons:
explanation = (
@@ -865,7 +902,8 @@ def run_pipeline():
except ruffus_exceptions.RethrownJobError as e:
if options.verbose:
_log.debug(str(e)) # stringify exception so logger doesn't have to
exitcode = traverse_ruffus_exception(e.args, options, _log)
exceptions = e.job_exceptions
exitcode = traverse_ruffus_exception(exceptions, options, _log)
if exitcode is None:
_log.error("Unexpected ruffus exception: " + str(e))
_log.error(repr(e))
@@ -879,6 +917,7 @@ def run_pipeline():
if options.flowchart:
_log.info("Flowchart saved to {}".format(options.flowchart))
return ExitCode.ok
elif options.output_file == '-':
_log.info("Output sent to stdout")
elif os.path.samefile(options.output_file, os.devnull):
@@ -897,7 +936,7 @@ def run_pipeline():
_log.warning('Output file: The generated PDF is INVALID')
return ExitCode.invalid_output_pdf
report_output_file_size(options, _log, start_input_file,
report_output_file_size(options, _log, start_input_file,
options.output_file)
pdfinfo = context.get_pdfinfo()
+5
View File
@@ -40,6 +40,11 @@ import codecs
def verify_python3_env():
"""Ensures that the environment is good for unicode on Python 3."""
# PEP 538 changes in Python 3.7 should make this wrangling unnecessary
if sys.version_info[0:3] >= (3, 7, 0):
return
try:
import locale
fs_enc = codecs.lookup(locale.getpreferredencoding()).name
+10 -1
View File
@@ -24,7 +24,8 @@ from subprocess import run, STDOUT, PIPE, CalledProcessError
from ..exceptions import MissingDependencyError
def get_version(program, *,
def get_version(program, *,
version_arg='--version', regex=r'(\d+(\.\d+)*)'):
"Get the version of the specified program"
args_prog = [
@@ -36,7 +37,15 @@ def get_version(program, *,
args_prog, close_fds=True, universal_newlines=True,
stdout=PIPE, stderr=STDOUT, check=True)
output = proc.stdout
except FileNotFoundError as e:
raise MissingDependencyError(
"Could not find program '{}' on the PATH".format(
program)) from e
except CalledProcessError as e:
if e.returncode < 0:
raise MissingDependencyError(
"Ran program '{}' but it exited with an error:\n{}".format(
program, e.output)) from e
raise MissingDependencyError(
"Could not find program '{}' on the PATH".format(
program)) from e
+24 -1
View File
@@ -32,6 +32,18 @@ def version():
return get_version('gs')
def jpeg_passthrough_available():
"""
Ghostscript 9.23 introduced JPEG passthrough but it seems to corrupt the
last two bytes of certain images, for now we disable it for 9.23 and
do not mention it for < 9.23.
https://bugs.ghostscript.com/show_bug.cgi?id=699216
"""
return False
def _gs_error_reported(stream):
return re.search(r'error', stream, flags=re.IGNORECASE)
@@ -127,6 +139,17 @@ def generate_pdfa(pdf_pages, output_file, compression, log,
"-dAutoFilterGrayImages=true",
]
# Older versions of Ghostscript expect a leading slash in
# sColorConversionStrategy, newer ones should not have it. See Ghostscript
# git commit fe1c025d.
strategy = 'RGB' if version() >= '9.19' else '/RGB'
if version() == '9.23':
# 9.23: new feature JPEG passthrough is broken in some cases, best to
# disable it always
# https://bugs.ghostscript.com/show_bug.cgi?id=699216
compression_args.append('-dPassThroughJPEGImages=false')
with NamedTemporaryFile(delete=True) as gs_pdf:
args_gs = [
"gs",
@@ -137,7 +160,7 @@ def generate_pdfa(pdf_pages, output_file, compression, log,
"-dNumRenderingThreads=" + str(threads),
"-sDEVICE=pdfwrite",
"-dAutoRotatePages=/None",
"-sColorConversionStrategy=/RGB",
"-sColorConversionStrategy=" + strategy,
"-sProcessColorModel=DeviceRGB"
] + compression_args + [
"-dJPEGQ=95",
+3 -2
View File
@@ -73,7 +73,8 @@ def has_textonly_pdf():
"""
args_tess = [
'tesseract',
'--print-parameters'
'--print-parameters',
'pdf'
]
params = ''
try:
@@ -159,7 +160,7 @@ def get_orientation(input_file, language: list, engine_mode, timeout: float,
assert 'Rotate' not in osd
angle = -angle % 360
else:
# Tesseract == 3.04.01, hopefully also Tesseract > 3.04.01
# Tesseract >= 3.04.01
# reports "Orientation in degrees" as a clockwise angle
assert 'Rotate' in osd
+5 -16
View File
@@ -57,15 +57,15 @@ def run(input_file, output_file, dpi, log, mode_args):
else:
im = im.convert(mode='RGB')
except IOError as e:
log.error(
"Could not convert image with type " + im.mode)
log.error("Could not convert image with type " + im.mode)
im.close()
raise MissingDependencyError() from e
try:
suffix = SUFFIXES[im.mode]
except KeyError:
log.error(
"Failed to convert image to a supported format.")
log.error("Failed to convert image to a supported format.")
im.close()
raise MissingDependencyError() from e
with NamedTemporaryFile(suffix=suffix) as input_pnm, \
@@ -90,20 +90,9 @@ def run(input_file, output_file, dpi, log, mode_args):
Image.open(output_pnm.name).save(output_file, dpi=(dpi, dpi))
def deskew(input_file, output_file, dpi, log):
run(input_file, output_file, dpi, log, [
'--mask-scan-size', '100', # don't blank out narrow columns
'--no-border-align', # don't align visible content to borders
'--no-mask-center', # don't center visible content within page
'--no-grayfilter', # don't remove light gray areas
'--no-blackfilter', # don't remove solid black areas
'--no-noisefilter', # don't remove salt and pepper noise
'--no-blurfilter' # don't remove blurry objects/debris
])
def clean(input_file, output_file, dpi, log):
run(input_file, output_file, dpi, log, [
'--layout', 'none',
'--mask-scan-size', '100', # don't blank out narrow columns
'--no-border-align', # don't align visible content to borders
'--no-mask-center', # don't center visible content within page
+6 -3
View File
@@ -15,6 +15,8 @@
# You should have received a copy of the GNU General Public License
# along with OCRmyPDF. If not, see <http://www.gnu.org/licenses/>.
from PIL import Image
from functools import partial
from collections.abc import Iterable
from contextlib import suppress, contextmanager
@@ -22,6 +24,7 @@ from pathlib import Path
import sys
import os
import multiprocessing
import warnings
def re_symlink(input_file, soft_link_name, log=None):
@@ -70,7 +73,7 @@ def is_iterable_notstr(thing):
def page_number(input_file):
"Get one-based page number implied by filename (000002.pdf -> 2)"
return int(os.path.basename(input_file)[0:6])
return int(os.path.basename(fspath(input_file))[0:6])
def available_cpu_count():
@@ -85,7 +88,7 @@ def available_cpu_count():
except (ImportError, AttributeError):
pass
complain(
warnings.warn(
"Could not get CPU count. Assuming one (1) CPU."
"Use -j N to set manually.")
return 1
@@ -102,7 +105,7 @@ def is_file_writable(test_file):
if p.is_symlink():
# Python 3.5 does not accept parameters for Path.resolve() and behaves
# as if strict=True (throws an exception on failure). Python 3.6
# as if strict=True (throws an exception on failure). Python 3.6
# defaults to strict=False. This implements strict=False like behavior
# for Python 3.5.
if sys.version_info[0:2] <= (3, 5):
+5 -2
View File
@@ -322,8 +322,11 @@ class HocrTransform():
dy = baseline_y2 - cursor[1]
text.moveCursor(dx, dy)
text.setHorizScale(100 * box_width / font_width)
text.textOut(elemtxt)
# If reportlab tells us this word is 0 units wide, our best seems
# to be to suppress this text
if font_width > 0:
text.setHorizScale(100 * box_width / font_width)
text.textOut(elemtxt)
pdf.drawText(text)
+16 -17
View File
@@ -108,13 +108,6 @@ class LeptonicaIOError(LeptonicaError):
pass
class RemoveColormap(Enum):
to_binary = 0
to_grayscale = 1
to_full_color = 2
based_on_src = 3
class Pix:
"""Wrapper around leptonica's PIX object.
@@ -141,9 +134,10 @@ class Pix:
def __repr__(self):
if self._pix:
s = "<leptonica.Pix image size={0}x{1} depth={2} at 0x{3:x}>"
s = "<leptonica.Pix image size={0}x{1} depth={2}{4} at 0x{3:x}>"
return s.format(self._pix.w, self._pix.h, self._pix.d,
int(ffi.cast("intptr_t", self._pix)))
int(ffi.cast('intptr_t', self._pix)),
'(colormapped)' if self._pix.colormap else '')
else:
return "<leptonica.Pix image NULL>"
@@ -328,13 +322,16 @@ class Pix:
return None
def remove_colormap(self, removal_type):
"""Remove a palette
"""Remove a palette (colormap); if no colormap, returns a copy of this
image
removal_type - any of lept.REMOVE_CMAP_*
removal_type - RemovalColormap()
"""
with LeptonicaErrorTrap():
return Pix(lept.pixRemoveColormap(self._pix, removal_type))
return self
# with LeptonicaErrorTrap():
# return Pix(lept.pixRemoveColormapGeneral(
# self._pix, removal_type, lept.L_COPY))
def otsu_adaptive_threshold(
self, tile_size=(300, 300), kernel_size=(4, 4), scorefract=0.1):
@@ -426,9 +423,11 @@ class Pix:
def background_norm(
self, mask=None, grayscale=None, tile_size=(10, 15), fg_threshold=60,
min_count=40, bg_val=200, smooth_kernel=(2, 1)):
# Background norm doesn't work on color mapped Pix, so remove colormap
target_pix = self.remove_colormap(lept.REMOVE_CMAP_BASED_ON_SRC)
with LeptonicaErrorTrap():
return Pix(lept.pixBackgroundNorm(
self._pix,
target_pix._pix,
mask or ffi.NULL,
grayscale or ffi.NULL,
tile_size[0],
@@ -450,8 +449,8 @@ class Pix:
if get_leptonica_version() < 'leptonica-1.72':
# Older versions of Leptonica (pre-1.72) have a buggy
# implementation of pixCorrelationBinary that overflows on larger
# images. Ubuntu trusty has 1.70. Ubuntu PPA
# ppa:rebuntu16/avidemux+unofficial has "leptonlib" 1.73.
# images. Ubuntu 14.04/trusty has 1.70. Ubuntu PPA
# ppa:alex-p/tesseract-ocr has leptonlib 1.75.
pix1_count = ffi.new('l_int32 *')
pix2_count = ffi.new('l_int32 *')
pixn_count = ffi.new('l_int32 *')
+5 -4
View File
@@ -3,8 +3,9 @@ import _cffi_backend
ffi = _cffi_backend.FFI('ocrmypdf.lib._leptonica',
_version = 0x2601,
_types = b'\x00\x00\x0F\x0D\x00\x00\xBB\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xBE\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\xBA\x03\x00\x00\x0F\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x02\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x08\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\xC7\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\xBD\x0D\x00\x00\x00\x0F\x00\x00\x49\x0D\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x1F\x03\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x49\x11\x00\x00\x49\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x49\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x01\x03\x00\x00\x9D\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\xC6\x03\x00\x00\x65\x03\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x08\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\xC4\x03\x00\x00\xA3\x11\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\xCA\x0D\x00\x00\x10\x11\x00\x00\x00\x0F\x00\x00\xCA\x0D\x00\x00\x9D\x11\x00\x00\x00\x0F\x00\x00\xCA\x0D\x00\x00\xCA\x03\x00\x00\x00\x0F\x00\x00\x00\x09\x00\x00\x01\x09\x00\x00\x02\x09\x00\x00\xBE\x03\x00\x00\x02\x01\x00\x00\x0E\x01\x00\x00\x0B\x01\x00\x00\x05\x01\x00\x00\x03\x01\x00\x00\xBC\x03\x00\x00\xC5\x03\x00\x00\x04\x01\x00\x00\xC7\x03\x00\x00\x08\x01\x00\x00\x0C\x01\x00\x00\x06\x01\x00\x00\x00\x01',
_globals = (b'\x00\x00\xB1\x23boxDestroy',0,b'\x00\x00\x67\x23getLeptonicaVersion',0,b'\x00\x00\xB7\x23lept_free',0,b'\x00\x00\x69\x23makePixelSumTab8',0,b'\x00\x00\x16\x23pixAnd',0,b'\x00\x00\x23\x23pixBackgroundNorm',0,b'\x00\x00\x1B\x23pixCleanBackgroundToWhite',0,b'\x00\x00\x0D\x23pixClipRectangle',0,b'\x00\x00\x8D\x23pixColorFraction',0,b'\x00\x00\x59\x23pixColorMagnitude',0,b'\x00\x00\x0A\x23pixConvertRGBToLuminance',0,b'\x00\x00\x6B\x23pixCorrelationBinary',0,b'\x00\x00\x80\x23pixCountPixels',0,b'\x00\x00\x63\x23pixDeserializeFromMemory',0,b'\x00\x00\x50\x23pixDeskew',0,b'\x00\x00\xB4\x23pixDestroy',0,b'\x00\x00\x0A\x23pixEndianByteSwapNew',0,b'\x00\x00\x00\x23pixFindPageForeground',0,b'\x00\x00\x7B\x23pixFindSkew',0,b'\x00\x00\x2F\x23pixGammaTRC',0,b'\x00\x00\x70\x23pixGetAverageMaskedRGB',0,b'\x00\x00\x36\x23pixGlobalNormRGB',0,b'\x00\x00\x12\x23pixInvert',0,b'\x00\x00\x54\x23pixMaskOverColorPixels',0,b'\x00\x00\x85\x23pixNumSignificantGrayColors',0,b'\x00\x00\x96\x23pixOtsuAdaptiveThreshold',0,b'\x00\x00\x3E\x23pixOtsuThreshOnBackgroundNorm',0,b'\x00\x00\x60\x23pixRead',0,b'\x00\x00\x50\x23pixRemoveColormap',0,b'\x00\x00\x12\x23pixRotate180',0,b'\x00\x00\x50\x23pixRotateOrth',0,b'\x00\x00\x4B\x23pixScale',0,b'\x00\x00\xA0\x23pixSerializeToMemory',0,b'\x00\x00\xA5\x23pixWriteImpliedFormat',0,b'\x00\x00\xAB\x23pixWriteMemPng',0),
_struct_unions = ((b'\x00\x00\x00\xBA\x00\x00\x00\x02Box',b'\x00\x00\x02\x11x',b'\x00\x00\x02\x11y',b'\x00\x00\x02\x11w',b'\x00\x00\x02\x11h',b'\x00\x00\xC7\x11refcount'),(b'\x00\x00\x00\xBB\x00\x00\x00\x02Pix',b'\x00\x00\xC7\x11w',b'\x00\x00\xC7\x11h',b'\x00\x00\xC7\x11d',b'\x00\x00\xC7\x11spp',b'\x00\x00\xC7\x11wpl',b'\x00\x00\xC7\x11refcount',b'\x00\x00\x02\x11xres',b'\x00\x00\x02\x11yres',b'\x00\x00\x02\x11informat',b'\x00\x00\x02\x11special',b'\x00\x00\xBD\x11text',b'\x00\x00\xC3\x11colormap',b'\x00\x00\xC6\x11data'),(b'\x00\x00\x00\xBC\x00\x00\x00\x02PixColormap',b'\x00\x00\xB8\x11array',b'\x00\x00\x02\x11depth',b'\x00\x00\x02\x11nalloc',b'\x00\x00\x02\x11n')),
_typenames = (b'\x00\x00\x00\xBABOX',b'\x00\x00\x00\xBBPIX',b'\x00\x00\x00\xBCPIXCMAP',b'\x00\x00\x00\x1Fl_float32',b'\x00\x00\x00\xBFl_float64',b'\x00\x00\x00\xC1l_int16',b'\x00\x00\x00\x02l_int32',b'\x00\x00\x00\xC0l_int64',b'\x00\x00\x00\xC2l_int8',b'\x00\x00\x00\xC9l_uint16',b'\x00\x00\x00\xC7l_uint32',b'\x00\x00\x00\xC8l_uint64',b'\x00\x00\x00\xC5l_uint8'),
_types = b'\x00\x00\x0F\x0D\x00\x00\xBB\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xBE\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\xBA\x03\x00\x00\x0F\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x02\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x08\x11\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\xC9\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\xBD\x0D\x00\x00\x00\x0F\x00\x00\x49\x0D\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x1F\x03\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x49\x11\x00\x00\x49\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x49\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x6E\x11\x00\x00\x6E\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x01\x03\x00\x00\x9D\x11\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x01\x11\x00\x00\xC8\x03\x00\x00\x65\x03\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\x08\x11\x00\x00\x01\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x02\x0D\x00\x00\xC6\x03\x00\x00\xA3\x11\x00\x00\x01\x11\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\xCC\x0D\x00\x00\x10\x11\x00\x00\x00\x0F\x00\x00\xCC\x0D\x00\x00\x9D\x11\x00\x00\x00\x0F\x00\x00\xCC\x0D\x00\x00\xCC\x03\x00\x00\x00\x0F\x00\x00\x00\x09\x00\x00\x01\x09\x00\x00\x02\x09\x00\x00\xBE\x03\x00\x00\x02\x01\x00\x00\x0E\x01\x00\x00\x00\x0B\x00\x00\x01\x0B\x00\x00\x0B\x01\x00\x00\x05\x01\x00\x00\x03\x01\x00\x00\xBC\x03\x00\x00\xC7\x03\x00\x00\x04\x01\x00\x00\xC9\x03\x00\x00\x08\x01\x00\x00\x0C\x01\x00\x00\x06\x01\x00\x00\x00\x01',
_globals = (b'\xFF\xFF\xFF\x0BL_CLONE',2,b'\xFF\xFF\xFF\x0BL_COPY',1,b'\xFF\xFF\xFF\x0BL_COPY_CLONE',3,b'\xFF\xFF\xFF\x0BL_INSERT',0,b'\xFF\xFF\xFF\x0BL_NOCOPY',0,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_BASED_ON_SRC',4,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_BINARY',0,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_FULL_COLOR',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_GRAYSCALE',1,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_WITH_ALPHA',3,b'\x00\x00\xB1\x23boxDestroy',0,b'\x00\x00\x67\x23getLeptonicaVersion',0,b'\x00\x00\xB7\x23lept_free',0,b'\x00\x00\x69\x23makePixelSumTab8',0,b'\x00\x00\x16\x23pixAnd',0,b'\x00\x00\x23\x23pixBackgroundNorm',0,b'\x00\x00\x1B\x23pixCleanBackgroundToWhite',0,b'\x00\x00\x0D\x23pixClipRectangle',0,b'\x00\x00\x8D\x23pixColorFraction',0,b'\x00\x00\x59\x23pixColorMagnitude',0,b'\x00\x00\x0A\x23pixConvertRGBToLuminance',0,b'\x00\x00\x6B\x23pixCorrelationBinary',0,b'\x00\x00\x80\x23pixCountPixels',0,b'\x00\x00\x63\x23pixDeserializeFromMemory',0,b'\x00\x00\x50\x23pixDeskew',0,b'\x00\x00\xB4\x23pixDestroy',0,b'\x00\x00\x0A\x23pixEndianByteSwapNew',0,b'\x00\x00\x00\x23pixFindPageForeground',0,b'\x00\x00\x7B\x23pixFindSkew',0,b'\x00\x00\x2F\x23pixGammaTRC',0,b'\x00\x00\x70\x23pixGetAverageMaskedRGB',0,b'\x00\x00\x36\x23pixGlobalNormRGB',0,b'\x00\x00\x12\x23pixInvert',0,b'\x00\x00\x54\x23pixMaskOverColorPixels',0,b'\x00\x00\x85\x23pixNumSignificantGrayColors',0,b'\x00\x00\x96\x23pixOtsuAdaptiveThreshold',0,b'\x00\x00\x3E\x23pixOtsuThreshOnBackgroundNorm',0,b'\x00\x00\x60\x23pixRead',0,b'\x00\x00\x50\x23pixRemoveColormap',0,b'\x00\x00\x54\x23pixRemoveColormapGeneral',0,b'\x00\x00\x12\x23pixRotate180',0,b'\x00\x00\x50\x23pixRotateOrth',0,b'\x00\x00\x4B\x23pixScale',0,b'\x00\x00\xA0\x23pixSerializeToMemory',0,b'\x00\x00\xA5\x23pixWriteImpliedFormat',0,b'\x00\x00\xAB\x23pixWriteMemPng',0),
_struct_unions = ((b'\x00\x00\x00\xBA\x00\x00\x00\x02Box',b'\x00\x00\x02\x11x',b'\x00\x00\x02\x11y',b'\x00\x00\x02\x11w',b'\x00\x00\x02\x11h',b'\x00\x00\xC9\x11refcount'),(b'\x00\x00\x00\xBB\x00\x00\x00\x02Pix',b'\x00\x00\xC9\x11w',b'\x00\x00\xC9\x11h',b'\x00\x00\xC9\x11d',b'\x00\x00\xC9\x11spp',b'\x00\x00\xC9\x11wpl',b'\x00\x00\xC9\x11refcount',b'\x00\x00\x02\x11xres',b'\x00\x00\x02\x11yres',b'\x00\x00\x02\x11informat',b'\x00\x00\x02\x11special',b'\x00\x00\xBD\x11text',b'\x00\x00\xC5\x11colormap',b'\x00\x00\xC8\x11data'),(b'\x00\x00\x00\xBC\x00\x00\x00\x02PixColormap',b'\x00\x00\xB8\x11array',b'\x00\x00\x02\x11depth',b'\x00\x00\x02\x11nalloc',b'\x00\x00\x02\x11n')),
_enums = (b'\x00\x00\x00\xC0\x00\x00\x00\x16$1\x00REMOVE_CMAP_TO_BINARY,REMOVE_CMAP_TO_GRAYSCALE,REMOVE_CMAP_TO_FULL_COLOR,REMOVE_CMAP_WITH_ALPHA,REMOVE_CMAP_BASED_ON_SRC',b'\x00\x00\x00\xC1\x00\x00\x00\x16$2\x00L_NOCOPY,L_INSERT,L_COPY,L_CLONE,L_COPY_CLONE'),
_typenames = (b'\x00\x00\x00\xBABOX',b'\x00\x00\x00\xBBPIX',b'\x00\x00\x00\xBCPIXCMAP',b'\x00\x00\x00\x1Fl_float32',b'\x00\x00\x00\xBFl_float64',b'\x00\x00\x00\xC3l_int16',b'\x00\x00\x00\x02l_int32',b'\x00\x00\x00\xC2l_int64',b'\x00\x00\x00\xC4l_int8',b'\x00\x00\x00\xCBl_uint16',b'\x00\x00\x00\xC9l_uint32',b'\x00\x00\x00\xCAl_uint64',b'\x00\x00\x00\xC7l_uint8'),
)
+23
View File
@@ -72,6 +72,24 @@ struct Box
};
typedef struct Box BOX;
enum {
REMOVE_CMAP_TO_BINARY = 0, /*!< remove colormap for conv to 1 bpp */
REMOVE_CMAP_TO_GRAYSCALE = 1, /*!< remove colormap for conv to 8 bpp */
REMOVE_CMAP_TO_FULL_COLOR = 2, /*!< remove colormap for conv to 32 bpp */
REMOVE_CMAP_WITH_ALPHA = 3, /*!< remove colormap and alpha */
REMOVE_CMAP_BASED_ON_SRC = 4 /*!< remove depending on src format */
};
/*! Access and storage flags */
enum {
L_NOCOPY = 0, /*!< do not copy the object; do not delete the ptr */
L_INSERT = L_NOCOPY, /*!< stuff it in; do not copy or clone */
L_COPY = 1, /*!< make/use a copy of the object */
L_CLONE = 2, /*!< make/use clone (ref count) of the object */
L_COPY_CLONE = 3 /*!< make a new array object (e.g., pixa) and fill */
/*!< the array with clones (e.g., pix) */
};
""")
ffibuilder.cdef("""
@@ -227,6 +245,11 @@ PIX *
pixInvert(PIX * pixd,
PIX * pixs);
PIX *
pixRemoveColormapGeneral(PIX *pixs,
l_int32 type,
l_int32 ifnocmap);
void
boxDestroy(BOX **pbox);
+92 -3
View File
@@ -19,8 +19,12 @@
from string import Template
from binascii import hexlify
from datetime import datetime
from xml.parsers.expat import ExpatError
import pkg_resources
import PyPDF2 as pypdf
from defusedxml.minidom import parseString as defused_parseString
from unittest.mock import patch
ICC_PROFILE_RELPATH = 'data/sRGB.icc'
@@ -98,7 +102,87 @@ def encode_text_string(s: str) -> str:
return ascii_hex_str
def encode_pdf_date(d: datetime) -> str:
"""Encode Python datetime object as PDF date string
From Adobe pdfmark manual:
(D:YYYYMMDDHHmmSSOHH'mm')
D: is an optional prefix. YYYY is the year. All fields after the year are
optional. MM is the month (01-12), DD is the day (01-31), HH is the
hour (00-23), mm are the minutes (00-59), and SS are the seconds
(00-59). The remainder of the string defines the relation of local
time to GMT. O is either + for a positive difference (local time is
later than GMT) or - (minus) for a negative difference. HH' is the
absolute value of the offset from GMT in hours, and mm' is the
absolute value of the offset in minutes. If no GMT information is
specified, the relation between the specified time and GMT is
considered unknown. Regardless of whether or not GMT
information is specified, the remainder of the string should specify
the local time.
"""
pdfmark_date_fmt = r'%Y%m%d%H%M%S'
s = d.strftime(pdfmark_date_fmt)
tz = d.strftime('%z')
if tz == 'Z' or tz == '':
# Ghostscript <= 9.23 handles missing timezones incorrectly, so if
# timezone is missing, move it into GMT.
# https://bugs.ghostscript.com/show_bug.cgi?id=699182
s += "+00'00'"
else:
sign, tz_hours, tz_mins = tz[0], tz[1:3], tz[3:5]
s += "{}{}'{}'".format(sign, tz_hours, tz_mins)
return s
def decode_pdf_date(s: str) -> datetime:
if s.startswith('D:'):
s = s[2:]
# Literal Z00'00', is incorrect but found in the wild,
# probably made by OS X Quartz -- standardize
if s.endswith("Z00'00'"):
s = s.replace("Z00'00'", '+0000')
elif s.endswith('Z'):
s = s.replace('Z', '+0000')
s = s.replace("'", "") # Remove apos from PDF time strings
return datetime.strptime(s, r'%Y%m%d%H%M%S%z')
def _get_pdfmark_dates(pdfmark):
"""Encode dates for pdfmark Postscript. The best way to deal with a
missing date entry is set it to null, because if the key is omitted
Ghostscript will set it to now - we do not want to erase the fact that
the value was unknown. Setting to an empty string breaks Ghostscript
9.22 as reported here:
https://bugs.ghostscript.com/show_bug.cgi?id=699182
"""
for key in ('/CreationDate', '/ModDate'):
if key not in pdfmark:
continue
if pdfmark[key].strip() == '':
yield ' {} null'.format(key)
continue
date_str = pdfmark[key]
if date_str.startswith('D:'):
date_str = date_str[2:]
try:
yield ' {} (D:{})'.format(
key,
encode_pdf_date(decode_pdf_date(date_str)))
except ValueError:
yield ' {} null'.format(key)
def _get_pdfa_def(icc_profile, icc_identifier, pdfmark):
"""Create a Postscript file for Ghostscript. pdfmark contains the various
objects as strings; these must be encoded in ASCII, and dates have a
special format."""
# Ghostscript <= 9.21 has a bug where null entries in DOCINFO might produce
# ERROR: VMerror (-25) on closing pdfwrite device.
# https://bugs.ghostscript.com/show_bug.cgi?id=697684
@@ -107,12 +191,12 @@ def _get_pdfa_def(icc_profile, icc_identifier, pdfmark):
docinfo_line_template = ' {key} <{value}>'
def docinfo_gen():
yield from _get_pdfmark_dates(pdfmark)
for key in docinfo_keys:
if key in pdfmark and pdfmark[key].strip() != '':
line = docinfo_line_template.format(
key=key, value=encode_text_string(pdfmark[key]))
yield line
docinfo = '\n'.join(docinfo_gen())
t = Template(pdfa_def_template)
@@ -145,9 +229,14 @@ def file_claims_pdfa(filename):
This checks if the XMP metadata contains a PDF/A marker.
"""
pdf = pypdf.PdfFileReader(filename)
xmp = pdf.getXmpMetadata()
try:
# Monkeypatch PyPDF2 to use defusedxml as its XML parser, for safety
with patch('xml.dom.minidom.parseString', new=defused_parseString):
xmp = pdf.getXmpMetadata()
except ExpatError:
return {'pass': False, 'output': 'pdf',
'conformance': 'Invalid XML metadata'}
try:
pdfa_nodes = xmp.getNodesInNamespace(
+73 -55
View File
@@ -18,6 +18,8 @@
from contextlib import suppress
from shutil import copyfileobj
from pathlib import Path
from datetime import datetime, timezone
from io import BytesIO
import sys
import os
import shutil
@@ -31,7 +33,7 @@ from ruffus import formatter, regex, Pipeline, suffix
from .hocrtransform import HocrTransform
from .pdfinfo import PdfInfo, Encoding, Colorspace
from .pdfa import generate_pdfa_ps
from .pdfa import generate_pdfa_ps, encode_pdf_date
from .helpers import re_symlink, is_iterable_notstr, page_number
from .exec import ghostscript, tesseract, qpdf
from .lib import fitz
@@ -143,6 +145,13 @@ def triage_image_file(input_file, output_file, log, options):
"image was scanned and specify it using --image-dpi.")
raise DpiError()
if im.mode in ('RGBA', 'LA'):
log.error(
"The input image has an alpha channel. Remove the alpha "
"channel first."
)
raise UnsupportedImageFormatError()
if 'iccprofile' not in im.info:
if im.mode == 'RGB':
log.info('Input image has no ICC profile, assuming sRGB')
@@ -171,7 +180,7 @@ def triage_image_file(input_file, output_file, log, options):
def _pdf_guess_version(input_file, search_window=1024):
"""Try to find version signature at start of file.
Not robust enough to deal with appended files.
Returns empty string if not found, indicating file is probably not PDF.
@@ -221,7 +230,7 @@ def repair_and_parse_pdf(
pdfinfo = PdfInfo(output_file)
if pdfinfo.has_userunit and options.output_type == 'pdfa':
if pdfinfo.has_userunit and options.output_type.startswith('pdfa'):
log.error(
"This input file uses a PDF feature that is not supported "
"by Ghostscript, so you cannot use --output-type=pdfa for this "
@@ -231,6 +240,12 @@ def repair_and_parse_pdf(
)
raise InputFileError()
if len(pdfinfo.pages) > 2000 and sys.version_info[0:2] <= (3, 5):
log.warning(
"Performance regressions are known occur with Python 3.5 for "
"high page count files. Python 3.6 or newer is recommended."
)
context.set_pdfinfo(pdfinfo)
log.debug(pdfinfo)
@@ -291,7 +306,7 @@ def is_ocr_required(pageinfo, log, options):
# We found a page with no images and no text. That means it may
# have vector art that the user wants to OCR. If we determined
# lossless reconstruction is not possible then we have to rasterize
# the image. So if OCR is being forced, take that to mean YES, go
# the image. So if OCR is being forced, take that to mean YES, go
# ahead and rasterize. If not forced, then pretend there's no text
# on the page at all so we don't lose anything.
# This could be made smarter by explicitly searching for vector art.
@@ -489,17 +504,23 @@ def rasterize_with_ghostscript(
options = context.get_options()
pageinfo = get_pageinfo(input_file, context)
device = 'png16m' # 24-bit
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 == Colorspace.index
for image in pageinfo.images):
device = 'png256'
elif all(image.bpc > 1 and image.color == Colorspace.gray
for image in pageinfo.images):
device = 'pnggray'
colorspaces = ['pngmono', 'pnggray', 'png256', 'png16m']
device_idx = 0
def at_least(cs):
return max(device_idx, colorspaces.index(cs))
for image in pageinfo.images:
if image.type_ != 'image':
continue # ignore masks
if image.bpc > 1:
if image.color == Colorspace.index:
device_idx = at_least('png256')
elif image.color == Colorspace.gray:
device_idx = at_least('pnggray')
else:
device_idx = at_least('png16m')
device = colorspaces[device_idx]
log.debug("Rasterize {0} with {1}".format(
os.path.basename(input_file), device))
@@ -624,19 +645,18 @@ def select_visible_page_image(
log.debug('{:4d}: JPEG input -> JPEG output'.format(
page_number(image)))
# If all images were JPEGs originally, produce a JPEG as output
im = Image.open(image)
with Image.open(image) as im:
# At this point the image should be a .png, but deskew, unpaper
# might have removed the DPI information. In this case, fall back to
# square DPI used to rasterize. When the preview image was
# rasterized, it was also converted to square resolution, which is
# what we want to give tesseract, so keep it square.
fallback_dpi = get_page_square_dpi(pageinfo, options)
dpi = im.info.get('dpi', (fallback_dpi, fallback_dpi))
# At this point the image should be a .png, but deskew, unpaper might
# have removed the DPI information. In this case, fall back to square
# DPI used to rasterize. When the preview image was rasterized, it
# was also converted to square resolution, which is what we want to
# give tesseract, so keep it square.
fallback_dpi = get_page_square_dpi(pageinfo, options)
dpi = im.info.get('dpi', (fallback_dpi, fallback_dpi))
# Pillow requires integer DPI
dpi = round(dpi[0]), round(dpi[1])
im.save(output_file, format='JPEG', dpi=dpi)
# Pillow requires integer DPI
dpi = round(dpi[0]), round(dpi[1])
im.save(output_file, format='JPEG', dpi=dpi)
else:
re_symlink(image, output_file, log)
@@ -658,25 +678,25 @@ def select_image_layer(
log.debug("{:4d}: page eligible for lossless reconstruction".format(
page_number(page_pdf)))
re_symlink(page_pdf, output_file, log)
else:
pageinfo = get_pageinfo(image, context)
return
# We rasterize a square DPI version of each page because most image
# processing tools don't support rectangular DPI. Use the square DPI
# as it accurately describes the image. It would be possible to
# resample the image at this stage back to non-square DPI to more
# closely resemble the input, except that the hocr renderer does not
# understand non-square DPI. The sandwich renderer would be fine.
dpi = get_page_square_dpi(pageinfo, options)
layout_fun = img2pdf.get_fixed_dpi_layout_fun((dpi, dpi))
pageinfo = get_pageinfo(image, context)
with open(image, 'rb') as imfile, \
open(output_file, 'wb') as pdf:
log.debug('{:4d}: convert'.format(page_number(page_pdf)))
img2pdf.convert(
imfile, with_pdfrw=False,
layout_fun=layout_fun, outputstream=pdf)
log.debug('{:4d}: convert done'.format(page_number(page_pdf)))
# We rasterize a square DPI version of each page because most image
# processing tools don't support rectangular DPI. Use the square DPI as it
# accurately describes the image. It would be possible to resample the image
# at this stage back to non-square DPI to more closely resemble the input,
# except that the hocr renderer does not understand non-square DPI. The
# sandwich renderer would be fine.
dpi = get_page_square_dpi(pageinfo, options)
layout_fun = img2pdf.get_fixed_dpi_layout_fun((dpi, dpi))
with open(image, 'rb') as imfile, open(output_file, 'wb') as pdf:
log.debug('{:4d}: convert'.format(page_number(page_pdf)))
img2pdf.convert(
imfile, with_pdfrw=False,
layout_fun=layout_fun, outputstream=pdf)
log.debug('{:4d}: convert done'.format(page_number(page_pdf)))
def render_hocr_page(
@@ -872,12 +892,8 @@ def get_pdfmark(base_pdf, options):
except (KeyError, TypeError):
return ''
pdfmark = {
'/Title': from_document_info('/Title'),
'/Author': from_document_info('/Author'),
'/Keywords': from_document_info('/Keywords'),
'/Subject': from_document_info('/Subject'),
}
pdfmark = {k: from_document_info(k) for k in
('/Title', '/Author', '/Keywords', '/Subject', '/CreationDate')}
if options.title:
pdfmark['/Title'] = options.title
if options.author:
@@ -898,6 +914,7 @@ def get_pdfmark(base_pdf, options):
PROGRAM_NAME, VERSION,
renderer_tag,
tesseract.version())
pdfmark['/ModDate'] = encode_pdf_date(datetime.now(timezone.utc))
return pdfmark
@@ -967,6 +984,7 @@ def merge_pages_ghostscript(
pdf_pages, _ = _merge_pages_common(
input_files_groups, output_file, log, context)
input_pdfinfo = context.get_pdfinfo()
ghostscript.generate_pdfa(
pdf_version=input_pdfinfo.min_version,
pdf_pages=pdf_pages,
@@ -974,7 +992,7 @@ def merge_pages_ghostscript(
compression=options.pdfa_image_compression,
log=log,
threads=options.jobs or 1,
pdfa_part=('1' if options.output_type == 'pdfa-1' else '2'))
pdfa_part=options.output_type[-1]) # is pdfa-1, pdfa-2, or pdfa-3
if fitz:
doc = fitz.Document(output_file + '_toc.pdf')
doc.setToC(input_pdfinfo.table_of_contents)
@@ -1031,7 +1049,7 @@ def merge_pages_mupdf(
reader_metadata = pypdf.PdfFileReader(metadata_file)
pdfmark = get_pdfmark(reader_metadata, options)
pdfmark['/Producer'] = 'PyMuPDF ' + fitz.version[0]
pymupdf_metadata = {k[1:].lower() : v for k, v in pdfmark.items()}
pymupdf_metadata = {(k[1].lower() + k[2:]) : v for k, v in pdfmark.items()}
for pdf_page in pdf_pages:
page = fitz.open(pdf_page)
@@ -1065,7 +1083,7 @@ def merge_sidecars(
if txt_file:
with open(txt_file, 'r', encoding="utf-8") as in_:
txt = in_.read()
# Tesseract v4 alpha started adding form feeds in
# Tesseract v4 alpha started adding form feeds in
# commit aa6eb6b
# No obvious way to detect what binaries will do this, so
# for consistency just ignore its form feeds and insert our
@@ -1099,7 +1117,7 @@ def copy_final(
sys.stdout.flush()
else:
# At this point we overwrite the output_file specified by the user
# use copyfileobj because then we use open() to create the file and
# use copyfileobj because then we use open() to create the file and
# get the appropriate umask, ownership, etc.
with open(output_file, 'wb') as output_stream:
copyfileobj(input_stream, output_stream)
@@ -1274,7 +1292,7 @@ def build_pipeline(options, work_folder, log, context):
output=os.path.join(work_folder, r'\1.rendered.pdf'),
extras=[log, context])
task_combine_layers.graphviz(fillcolor='"#00cc66"')
task_combine_layers.active_if(options.pdf_renderer == 'hocr' or
task_combine_layers.active_if(options.pdf_renderer == 'hocr' or
options.pdf_renderer == 'sandwich')
# Tesseract OCR+PDF
+1 -1
View File
@@ -2,4 +2,4 @@ pytest >= 3.2
pytest-helpers-namespace
pytest-xdist
pytest-cov
pytest-timeout
pytest-timeout == 1.2.1
@@ -9,7 +9,7 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.bp6c363s/000001.ocr.png"; bbox 0 0 1000 800; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.4nwu81i8/000001.ocr.png"; bbox 0 0 1000 800; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 296 96 704 504">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 296 96 704 504">
<span class='ocr_line' id='line_1_1' title="bbox 296 96 704 504; baseline 0 296; x_size 169.33333; x_descenders 42.333332; x_ascenders 42.333336"><span class='ocrx_word' id='word_1_1' title='bbox 296 96 704 504; x_wconf 95'><strong> </strong></span>
@@ -9,7 +9,7 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.832q8ia9/000001.ocr.png"; bbox 0 0 1000 1520; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.hej6gvph/000001.ocr.png"; bbox 0 0 1000 1520; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 126 101 547 145">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 126 101 547 145">
<span class='ocr_line' id='line_1_1' title="bbox 126 101 547 125; baseline 0.005 -7; x_size 23; x_descenders 6; x_ascenders 4"><span class='ocrx_word' id='word_1_1' title='bbox 126 101 173 118; x_wconf 37'><strong>41st</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 181 101 303 124; x_wconf 16'><strong>CONGRESS;</strong></span> <span class='ocrx_word' id='word_1_3' title='bbox 329 123 331 125; x_wconf 42'><strong>|</strong></span> <span class='ocrx_word' id='word_1_4' title='bbox 443 103 547 120; x_wconf 94'><strong>SENATE.</strong></span>
@@ -1,3 +1,3 @@
Tesseract Open Source OCR Engine v4.0.0-beta.1 with Leptonica
Too few characters. Skipping this page
OSD: Weak margin (0.00) for 3 blob text block, but using orientation anyway: 0
OSD: Weak margin (0.00) for 17 blob text block, but using orientation anyway: 0
-47
View File
@@ -1,47 +0,0 @@
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.9t3fsoql/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.9t3fsoql/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/palette.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.mg78jtto/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.mg78jtto/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/jbig2.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.z0iuk012/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.z0iuk012/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/ccitt.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.h2o3yo13/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.h2o3yo13/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/lichtenstein.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.tav12ppr/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.tav12ppr/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/ccitt.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.8w9ao33a/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.8w9ao33a/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/jbig2.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.e1af_65a/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.e1af_65a/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/palette.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ylml9ah3/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ylml9ah3/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/ccitt.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1o424xo0/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1o424xo0/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/lichtenstein.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "osd", "--psm", "0", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000001.ocr.preview.jpg", "stdout"], "argv_slug": "__-l__osd__--psm__0__000001.ocr.preview.jpg__stdout", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "osd", "--psm", "0", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000003.ocr.preview.jpg", "stdout"], "argv_slug": "__-l__osd__--psm__0__000003.ocr.preview.jpg__stdout", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "osd", "--psm", "0", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000004.ocr.preview.jpg", "stdout"], "argv_slug": "__-l__osd__--psm__0__000004.ocr.preview.jpg__stdout", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "osd", "--psm", "0", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000002.ocr.preview.jpg", "stdout"], "argv_slug": "__-l__osd__--psm__0__000002.ocr.preview.jpg__stdout", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.z552uoqg/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.z552uoqg/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/skew.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1yo3m6jc/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1yo3m6jc/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/skew.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.9b6v5qah/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.9b6v5qah/000001", "hocr", "txt"], "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/skew.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000004.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000004.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000004.ocr.png__000004.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000003.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000003.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000003.ocr.png__000003.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000002.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000002.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000002.ocr.png__000002.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.udmc7x8w/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/cardinal.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.caos0t47/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.caos0t47/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/graph_ocred.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000005.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000005.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000005.ocr.png__000005.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000004.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000004.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000004.ocr.png__000004.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000003.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000003.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000003.ocr.png__000003.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000006.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000006.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000006.ocr.png__000006.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "--psm", "7", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.qdd9eyjq/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.qdd9eyjq/000001", "hocr", "txt"], "argv_slug": "__-l__eng__--psm__7__000001.ocr.png__000001__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/skew.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.1pk_2ejc/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.bp6c363s/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.bp6c363s/000001", "hocr", "txt"], "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/aspect.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.chi5902h/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.chi5902h/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/aspect.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "--psm", "7", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.5nrsbqn2/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.5nrsbqn2/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__--psm__7__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/skew.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.9ftp2zvl/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.9ftp2zvl/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/aspect.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "fra", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eqhklb0y/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eqhklb0y/000001.text", "pdf", "txt"], "argv_slug": "__-l__fra__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/francais.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.832q8ia9/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.832q8ia9/000001", "hocr", "txt"], "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/jbig2.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000005.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000005", "hocr", "txt"], "argv_slug": "__-l__eng__000005.ocr.png__000005__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000004.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000004", "hocr", "txt"], "argv_slug": "__-l__eng__000004.ocr.png__000004__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000003.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000003", "hocr", "txt"], "argv_slug": "__-l__eng__000003.ocr.png__000003__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000006.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000006", "hocr", "txt"], "argv_slug": "__-l__eng__000006.ocr.png__000006__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000001", "hocr", "txt"], "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.v21jys8r/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.v21jys8r/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/2400dpi.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000005.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000005.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000005.image__000005.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000004.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000004.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000004.image__000004.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000003.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000003.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000003.image__000003.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000006.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000006.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000006.image__000006.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000001.image", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.eersguc3/000001.rendered", "pdf", "txt"], "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.8js59f0_/000002.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.8js59f0_/000002.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000002.ocr.png__000002.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/multipage.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "eng", "-c", "textonly_pdf=1", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.fbs5vlu1/000001.ocr.png", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.fbs5vlu1/000001.text", "pdf", "txt"], "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/poster.pdf"}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.4.0-x86_64-i386-64bit", "python": "3.6.4", "args": ["-l", "osd", "--psm", "0", "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ab_bvzic/000001.ocr.preview.jpg", "stdout"], "argv_slug": "__-l__osd__--psm__0__000001.ocr.preview.jpg__stdout", "sourcefile": "/Users/jb/Documents/src/OCRmyPDF-dev/tests/resources/poster.pdf"}
+60
View File
@@ -0,0 +1,60 @@
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/palette.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/jbig2.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/ccitt.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/lichtenstein.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/ccitt.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/jbig2.pdf", "args": ["-l", "eng", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/palette.pdf", "args": ["-l", "eng", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/ccitt.pdf", "args": ["-l", "eng", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/lichtenstein.pdf", "args": ["-l", "eng", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "resources/skew.pdf", "args": ["-l", "eng", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/skew.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/graph_ocred.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__osd__--psm__0__000001.ocr.preview.jpg__stdout", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "osd", "--psm", "0", "$TMPDIR/000001.ocr.preview.jpg", "stdout"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__osd__--psm__0__000003.ocr.preview.jpg__stdout", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "osd", "--psm", "0", "$TMPDIR/000003.ocr.preview.jpg", "stdout"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__osd__--psm__0__000004.ocr.preview.jpg__stdout", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "osd", "--psm", "0", "$TMPDIR/000004.ocr.preview.jpg", "stdout"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__osd__--psm__0__000002.ocr.preview.jpg__stdout", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "osd", "--psm", "0", "$TMPDIR/000002.ocr.preview.jpg", "stdout"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/skew.pdf", "args": ["-l", "eng", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000004.ocr.png__000004.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000004.ocr.png", "$TMPDIR/000004.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000002.ocr.png__000002.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000002.ocr.png", "$TMPDIR/000002.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000003.ocr.png__000003.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000003.ocr.png", "$TMPDIR/000003.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000002.ocr.png__000002.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000002.ocr.png", "$TMPDIR/000002.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000004.ocr.png__000004.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000004.ocr.png", "$TMPDIR/000004.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000003.ocr.png__000003.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000003.ocr.png", "$TMPDIR/000003.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000004.ocr.png__000004.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000004.ocr.png", "$TMPDIR/000004.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000003.ocr.png__000003.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000003.ocr.png", "$TMPDIR/000003.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000002.ocr.png__000002.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000002.ocr.png", "$TMPDIR/000002.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000004.ocr.png__000004.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000004.ocr.png", "$TMPDIR/000004.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000002.ocr.png__000002.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000002.ocr.png", "$TMPDIR/000002.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000003.ocr.png__000003.text__pdf__txt", "sourcefile": "resources/cardinal.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000003.ocr.png", "$TMPDIR/000003.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000003.ocr.png__000003__hocr__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000003.ocr.png", "$TMPDIR/000003", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000004.ocr.png__000004__hocr__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000004.ocr.png", "$TMPDIR/000004", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "resources/aspect.pdf", "args": ["-l", "eng", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000005.ocr.png__000005__hocr__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000005.ocr.png", "$TMPDIR/000005", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000006.ocr.png__000006__hocr__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000006.ocr.png", "$TMPDIR/000006", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__--psm__7__000001.ocr.png__000001__hocr__txt", "sourcefile": "resources/skew.pdf", "args": ["-l", "eng", "--psm", "7", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/aspect.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/aspect.pdf", "args": ["-l", "eng", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__--psm__7__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/skew.pdf", "args": ["-l", "eng", "--psm", "7", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000004.image__000004.rendered__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000004.image", "$TMPDIR/000004.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000003.image__000003.rendered__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000003.image", "$TMPDIR/000003.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.image__000001.rendered__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000001.image", "$TMPDIR/000001.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/2400dpi.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000005.image__000005.rendered__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000005.image", "$TMPDIR/000005.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000001.ocr.png__000001__hocr__txt", "sourcefile": "resources/jbig2.pdf", "args": ["-l", "eng", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001", "hocr", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__000006.image__000006.rendered__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "$TMPDIR/000006.image", "$TMPDIR/000006.rendered", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000003.ocr.png__000003.text__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000003.ocr.png", "$TMPDIR/000003.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000004.ocr.png__000004.text__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000004.ocr.png", "$TMPDIR/000004.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000005.ocr.png__000005.text__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000005.ocr.png", "$TMPDIR/000005.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000006.ocr.png__000006.text__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000006.ocr.png", "$TMPDIR/000006.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000002.ocr.png__000002.text__pdf__txt", "sourcefile": "resources/multipage.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000002.ocr.png", "$TMPDIR/000002.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__fra__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/francais.pdf", "args": ["-l", "fra", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__osd__--psm__0__000001.ocr.preview.jpg__stdout", "sourcefile": "resources/poster.pdf", "args": ["-l", "osd", "--psm", "0", "$TMPDIR/000001.ocr.preview.jpg", "stdout"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/poster.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
{"tesseract_version": "tesseract 4.0.0-beta.1 leptonica-1.75.3 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libopenjp2 2.3.0 Found AVX2 Found AVX Found SSE ", "platform": "Darwin-17.5.0-x86_64-i386-64bit", "python": "3.6.5", "argv_slug": "__-l__eng__-c__textonly_pdf=1__000001.ocr.png__000001.text__pdf__txt", "sourcefile": "resources/poster.pdf", "args": ["-l", "eng", "-c", "textonly_pdf=1", "$TMPDIR/000001.ocr.png", "$TMPDIR/000001.text", "pdf", "txt"]}
@@ -1 +1,71 @@
with a plain face, on the throne of England;
there were a king with a large jaw and a queen
with a fair face, on the throne of France. In both
countries it was clearer than crystal to the lords
of the State preserves of loaves and fishes, that
things in general were settled for ever.
It was the year of Our Lord one thousand
seven hundred and seventy-five. Spiritual reve-
lations were conceded to England at that
favoured period, as at this, Mrs. Southcott had
recently attained her five-and-twentieth blessed
birthday, of whom a prophetic private in the Life
Guards had heralded the sublime appearance by
announcing that arrangements were made for the
swallowing up of London and Westminster.
Even the Cock-lane ghost had been laid only a
round dozen of years, after rapping out its mes-
sages, as the spirits of this very year last past
(supematurally deficient in originality) rapped
out theirs. Mere messages in the earthly order of
events had lately come to the English Crown and
People, from a congress of British subjects in
America: which, strange to relate, have proved
more important to the human race than any com-
munications yet received through any of the
chickens of the Cock-lane brood.
France, less favoured on the whole as to mat-
ters spiritual than her sister of the shield and tri-
dent, rolled with exceeding smoothness down
hill, making paper money and spending it. Under
the guidance of her Christian pastors, she enter-
tained herself, besides, with such humane
achievements as sentencing a youth to have his
hands cut off, his tongue torn out with pincers,
and his body burned alive, because he had not
kneeled down in the rain to do honour to a dirty
procession of monks which passed within his
view, at a distance of some fifty or sixty yards. It
is likely enough that, rooted in the woods of
France and Norway, there were growing trees,
when that sufferer was put to death, already
marked by the Woodman, Fate, to come down
and be sawn into boards, to make a certain mov-
able framework with a sack and a knife in it, ter-
rible in history. It is likely enough that in the
rough outhouses of some tillers of the heavy
lands adjacent to Paris, there were sheltered
from the weather that very day, rude carts,
bespattered with rustic mire, snuffed about by
pigs, and roosted in by poultry, which the
Farmer, Death, had already set apart to be his
tumbrils of the Revolution. But that Woodman
and that Farmer, though they work unceasingly,
work silently, and no one heard them as they
went about with muffled tread: the rather, foras-
much as to entertain any suspicion that they
were awake, was to be atheistical and traitorous.
In England, there was scarcely an amount of
order and protection to justify much national
boasting. Daring burglaries by armed men, and
highway robberies, took place in the capital
itself every night; families were publicly cau-
tioned not to go out of town without removing
their furniture to upholsterers' warehouses for
security; the highwayman in the dark was a City
tradesman in the light, and, being recognised and
@@ -1 +1,71 @@
with a plain face, on the throne of England;
there were a king with a large jaw and a queen
with a fair face, on the throne of France. In both
countries it was clearer than crystal to the lords
of the State preserves of loaves and fishes, that
things in general were settled for ever.
It was the year of Our Lord one thousand
seven hundred and seventy-five. Spiritual reve-
lations were conceded to England at that
favoured period, as at this. Mrs. Southcott had
recently attained her five-and-twentieth blessed
birthday, of whom a prophetic private in the Life
Guards had heralded the sublime appearance by
announcing that arrangements were made for the
swallowing up of London and Westminster.
Even the Cock-lane ghost had been laid only a
round dozen of years, after rapping out its mes-
sages, as the spirits of this very year last past
(supernaturally deficient in originality) rapped
out theirs. Mere messages in the earthly order of
events had lately come to the English Crown and
People, from a congress of British subjects in
America: which, strange to relate, have proved
more important to the human race than any com-
munications yet received through any of the
chickens of the Cock-lane brood.
France, less favoured on the whole as to mat-
ters spiritual than her sister of the shield and tri-
dent, rolled with exceeding smoothness down
hill, making paper money and spending it. Under
the guidance of her Christian pastors, she enter-
tained herself, besides, with such humane
achievements as sentencing a youth to have his
hands cut off, his tongue torn out with pincers,
and his body burned alive, because he had not
kneeled down in the rain to do honour to a dirty
procession of monks which passed within his
view, at a distance of some fifty or sixty yards. It
is likely enough that, rooted in the woods of
France and Norway, there were growing trees,
when that sufferer was put to death, already
marked by the Woodman, Fate, to come down
and be sawn into boards, to make a certain mov-
able framework with a sack and a knife in it, ter-
rible in history. It is likely enough that in the
rough outhouses of some tillers of the heavy
lands adjacent to Paris, there were sheltered
from the weather that very day, rude carts,
bespattered with rustic mire, snuffed about by
pigs, and roosted in by poultry, which the
Farmer, Death, had already set apart to be his
tumbrils of the Revolution. But that Woodman
and that Farmer, though they work unceasingly,
work silently, and no one heard them as they
went about with muffled tread: the rather, foras-
much as to entertain any suspicion that they
were awake, was to be atheistical and traitorous.
In England, there was scarcely an amount of
order and protection to justify much national
boasting. Daring burglaries by armed men, and
highway robberies, took place in the capital
itself every night; families were publicly cau-
tioned not to go out of town without removing
their furniture to upholsterers' warehouses for
security; the highwayman in the dark was a City
tradesman in the light, and, being recognised and
@@ -9,7 +9,7 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000001.ocr.png"; bbox 0 0 1600 1962; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.3e7kb0k7/000001.ocr.png"; bbox 0 0 1600 1962; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 84 216 786 1605">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 84 216 786 1605">
<span class='ocr_line' id='line_1_1' title="bbox 84 216 786 1605; baseline 0 0; x_size 694.5; x_descenders -347.25; x_ascenders 347.25"><span class='ocrx_word' id='word_1_1' title='bbox 84 216 786 1605; x_wconf 95'><strong> </strong></span>
@@ -106,7 +106,7 @@
</div>
<div class='ocr_carea' id='block_1_8' title="bbox 77 1879 1533 1921">
<p class='ocr_par' id='par_1_10' lang='eng' title="bbox 77 1879 1533 1921">
<span class='ocr_line' id='line_1_31' title="bbox 77 1879 1533 1921; baseline -0.001 -10; x_size 42; x_descenders 11; x_ascenders 11"><span class='ocrx_word' id='word_1_198' title='bbox 77 1880 212 1918; x_wconf 96'><strong>funeral,</strong></span> <span class='ocrx_word' id='word_1_199' title='bbox 231 1891 267 1911; x_wconf 96'><strong>or</strong></span> <span class='ocrx_word' id='word_1_200' title='bbox 289 1881 395 1921; x_wconf 96'><strong>trying</strong></span> <span class='ocrx_word' id='word_1_201' title='bbox 417 1884 450 1911; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_202' title='bbox 471 1891 511 1920; x_wconf 96'><strong>go</strong></span> <span class='ocrx_word' id='word_1_203' title='bbox 533 1883 565 1911; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_204' title='bbox 587 1880 672 1920; x_wconf 96'><strong>sleep</strong></span> <span class='ocrx_word' id='word_1_205' title='bbox 695 1881 785 1911; x_wconf 96'><strong>when</strong></span> <span class='ocrx_word' id='word_1_206' title='bbox 807 1890 867 1920; x_wconf 93'><strong>you</strong></span> <span class='ocrx_word' id='word_1_207' title='bbox 894 1880 973 1911; x_wconf 92'><strong>aint</strong></span> <span class='ocrx_word' id='word_1_208' title='bbox 994 1880 1167 1921; x_wconf 91'><strong>sleepy—if</strong></span> <span class='ocrx_word' id='word_1_209' title='bbox 1194 1890 1256 1921; x_wconf 96'><strong>you</strong></span> <span class='ocrx_word' id='word_1_210' title='bbox 1278 1890 1330 1911; x_wconf 93'><strong>are</strong></span> <span class='ocrx_word' id='word_1_211' title='bbox 1353 1879 1533 1921; x_wconf 92'><strong>anywheres</strong></span>
<span class='ocr_line' id='line_1_31' title="bbox 77 1879 1533 1921; baseline -0.001 -10; x_size 42; x_descenders 11; x_ascenders 11"><span class='ocrx_word' id='word_1_198' title='bbox 77 1880 212 1918; x_wconf 96'><strong>funeral,</strong></span> <span class='ocrx_word' id='word_1_199' title='bbox 231 1891 267 1911; x_wconf 96'><strong>or</strong></span> <span class='ocrx_word' id='word_1_200' title='bbox 289 1881 395 1921; x_wconf 96'><strong>trying</strong></span> <span class='ocrx_word' id='word_1_201' title='bbox 417 1884 450 1911; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_202' title='bbox 471 1891 511 1920; x_wconf 96'><strong>go</strong></span> <span class='ocrx_word' id='word_1_203' title='bbox 533 1883 565 1911; x_wconf 95'><strong>to</strong></span> <span class='ocrx_word' id='word_1_204' title='bbox 587 1880 672 1920; x_wconf 96'><strong>sleep</strong></span> <span class='ocrx_word' id='word_1_205' title='bbox 695 1881 785 1911; x_wconf 96'><strong>when</strong></span> <span class='ocrx_word' id='word_1_206' title='bbox 807 1890 867 1920; x_wconf 93'><strong>you</strong></span> <span class='ocrx_word' id='word_1_207' title='bbox 894 1880 973 1911; x_wconf 92'><strong>aint</strong></span> <span class='ocrx_word' id='word_1_208' title='bbox 994 1880 1167 1921; x_wconf 92'><strong>sleepy—if</strong></span> <span class='ocrx_word' id='word_1_209' title='bbox 1194 1890 1256 1921; x_wconf 96'><strong>you</strong></span> <span class='ocrx_word' id='word_1_210' title='bbox 1278 1890 1330 1911; x_wconf 93'><strong>are</strong></span> <span class='ocrx_word' id='word_1_211' title='bbox 1353 1879 1533 1921; x_wconf 91'><strong>anywheres</strong></span>
</span>
</p>
</div>
@@ -9,7 +9,7 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000003.ocr.png"; bbox 0 0 2272 1848; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.3e7kb0k7/000003.ocr.png"; bbox 0 0 2272 1848; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 201 38 2167 118">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 201 38 2167 118">
<span class='ocr_line' id='line_1_1' title="bbox 201 38 2167 118; baseline -0.001 -17; x_size 79; x_descenders 17; x_ascenders 16"><span class='ocrx_word' id='word_1_1' title='bbox 201 39 659 117; x_wconf 96'><strong>Replacement</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 665 38 784 101; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_3' title='bbox 808 39 1289 101; x_wconf 95'><strong>&quot;creationism&quot;</strong></span> <span class='ocrx_word' id='word_1_4' title='bbox 1316 39 1458 101; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_5' title='bbox 1491 39 1869 118; x_wconf 96'><strong>&quot;intelligent</strong></span> <span class='ocrx_word' id='word_1_6' title='bbox 1897 39 2167 118; x_wconf 92'><strong>design&quot;</strong></span>
@@ -9,10 +9,10 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000004.ocr.png"; bbox 0 0 2272 1848; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.3e7kb0k7/000004.ocr.png"; bbox 0 0 2272 1848; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 200 38 2168 120">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 200 38 2168 120">
<span class='ocr_line' id='line_1_1' title="bbox 200 38 2168 120; baseline 0 -18; x_size 80; x_descenders 18; x_ascenders 16"><span class='ocrx_word' id='word_1_1' title='bbox 200 40 660 118; x_wconf 96'><strong>Replacement</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 664 38 784 102; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_3' title='bbox 808 40 1290 102; x_wconf 93'><strong>&quot;creationism&quot;</strong></span> <span class='ocrx_word' id='word_1_4' title='bbox 1316 40 1458 102; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_5' title='bbox 1490 40 1870 120; x_wconf 86'><strong>&quot;intelligent</strong></span> <span class='ocrx_word' id='word_1_6' title='bbox 1896 40 2168 120; x_wconf 93'><strong>design&quot;</strong></span>
<span class='ocr_line' id='line_1_1' title="bbox 200 38 2168 120; baseline 0 -18; x_size 80; x_descenders 18; x_ascenders 16"><span class='ocrx_word' id='word_1_1' title='bbox 200 40 660 118; x_wconf 96'><strong>Replacement</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 664 38 784 102; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_3' title='bbox 808 40 1290 102; x_wconf 94'><strong>&quot;creationism&quot;</strong></span> <span class='ocrx_word' id='word_1_4' title='bbox 1316 40 1458 102; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_5' title='bbox 1490 40 1870 120; x_wconf 87'><strong>&quot;intelligent</strong></span> <span class='ocrx_word' id='word_1_6' title='bbox 1896 40 2168 120; x_wconf 94'><strong>design&quot;</strong></span>
</span>
</p>
</div>
@@ -1 +1,71 @@
with a plain face, on the throne of England;
there were a king with a large jaw and a queen
with a fair face, on the throne of France. In both
countries it was clearer than crystal to the lords
of the State preserves of loaves and fishes, that
things in general were settled for ever.
It was the year of Our Lord one thousand
seven hundred and seventy-five. Spiritual reve-
lations were conceded to England at that
favoured period, as at this, Mrs. Southcott had
recently attained her five-and-twentieth blessed
birthday, of whom a prophetic private in the Life
Guards had heralded the sublime appearance by
announcing that arrangements were made for the
swallowing up of London and Westminster.
Even the Cock-lane ghost had been laid only a
round dozen of years, after rapping out its mes-
sages, as the spirits of this very year last past
(supematurally deficient in originality) rapped
out theirs. Mere messages in the earthly order of
events had lately come to the English Crown and
People, from a congress of British subjects in
America: which, strange to relate, have proved
more important to the human race than any com-
munications yet received through any of the
chickens of the Cock-lane brood.
France, less favoured on the whole as to mat-
ters spiritual than her sister of the shield and tri-
dent, rolled with exceeding smoothness down
hill, making paper money and spending it. Under
the guidance of her Christian pastors, she enter-
tained herself, besides, with such humane
achievements as sentencing a youth to have his
hands cut off, his tongue torn out with pincers,
and his body burned alive, because he had not
kneeled down in the rain to do honour to a dirty
procession of monks which passed within his
view, at a distance of some fifty or sixty yards. It
is likely enough that, rooted in the woods of
France and Norway, there were growing trees,
when that sufferer was put to death, already
marked by the Woodman, Fate, to come down
and be sawn into boards, to make a certain mov-
able framework with a sack and a knife in it, ter-
rible in history. It is likely enough that in the
rough outhouses of some tillers of the heavy
lands adjacent to Paris, there were sheltered
from the weather that very day, rude carts,
bespattered with rustic mire, snuffed about by
pigs, and roosted in by poultry, which the
Farmer, Death, had already set apart to be his
tumbrils of the Revolution. But that Woodman
and that Farmer, though they work unceasingly,
work silently, and no one heard them as they
went about with muffled tread: the rather, foras-
much as to entertain any suspicion that they
were awake, was to be atheistical and traitorous.
In England, there was scarcely an amount of
order and protection to justify much national
boasting. Daring burglaries by armed men, and
highway robberies, took place in the capital
itself every night; families were publicly cau-
tioned not to go out of town without removing
their furniture to upholsterers' warehouses for
security; the highwayman in the dark was a City
tradesman in the light, and, being recognised and
@@ -9,7 +9,158 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000005.ocr.png"; bbox 0 0 2550 3300; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.3e7kb0k7/000005.ocr.png"; bbox 0 0 2550 3300; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 70 403 1182 833">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 70 403 1182 833">
<span class='ocr_line' id='line_1_1' title="bbox 70 403 1180 461; baseline 0.002 -14; x_size 59; x_descenders 13; x_ascenders 15"><span class='ocrx_word' id='word_1_1' title='bbox 70 404 171 447; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 204 418 229 447; x_wconf 95'><strong>a</strong></span> <span class='ocrx_word' id='word_1_3' title='bbox 258 404 371 459; x_wconf 96'><strong>plain</strong></span> <span class='ocrx_word' id='word_1_4' title='bbox 404 403 509 454; x_wconf 96'><strong>face,</strong></span> <span class='ocrx_word' id='word_1_5' title='bbox 541 418 596 449; x_wconf 96'><strong>on</strong></span> <span class='ocrx_word' id='word_1_6' title='bbox 629 404 696 449; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_7' title='bbox 729 404 871 449; x_wconf 96'><strong>throne</strong></span> <span class='ocrx_word' id='word_1_8' title='bbox 901 406 954 448; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_9' title='bbox 979 405 1180 461; x_wconf 96'><strong>England;</strong></span>
</span>
<span class='ocr_line' id='line_1_2' title="bbox 72 478 1182 535; baseline 0.001 -12; x_size 59; x_descenders 13; x_ascenders 15"><span class='ocrx_word' id='word_1_10' title='bbox 72 481 185 523; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_11' title='bbox 206 491 315 524; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_12' title='bbox 335 492 361 523; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_13' title='bbox 378 478 479 535; x_wconf 96'><strong>king</strong></span> <span class='ocrx_word' id='word_1_14' title='bbox 502 478 599 524; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_15' title='bbox 619 492 645 521; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_16' title='bbox 668 481 778 535; x_wconf 96'><strong>large</strong></span> <span class='ocrx_word' id='word_1_17' title='bbox 791 482 878 533; x_wconf 96'><strong>jaw</strong></span> <span class='ocrx_word' id='word_1_18' title='bbox 898 480 982 523; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_19' title='bbox 1003 492 1028 521; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_20' title='bbox 1048 492 1182 535; x_wconf 96'><strong>queen</strong></span>
</span>
<span class='ocr_line' id='line_1_3' title="bbox 71 552 1181 603; baseline 0.002 -6; x_size 57.241344; x_descenders 12.241344; x_ascenders 15"><span class='ocrx_word' id='word_1_21' title='bbox 71 554 172 597; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_22' title='bbox 188 568 214 597; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_23' title='bbox 230 554 309 597; x_wconf 96'><strong>fair</strong></span> <span class='ocrx_word' id='word_1_24' title='bbox 325 556 431 603; x_wconf 96'><strong>face,</strong></span> <span class='ocrx_word' id='word_1_25' title='bbox 450 568 506 598; x_wconf 96'><strong>on</strong></span> <span class='ocrx_word' id='word_1_26' title='bbox 521 553 589 598; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_27' title='bbox 609 554 751 598; x_wconf 96'><strong>throne</strong></span> <span class='ocrx_word' id='word_1_28' title='bbox 768 552 821 598; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_29' title='bbox 834 556 997 598; x_wconf 96'><strong>France.</strong></span> <span class='ocrx_word' id='word_1_30' title='bbox 1017 558 1064 599; x_wconf 96'><strong>In</strong></span> <span class='ocrx_word' id='word_1_31' title='bbox 1080 554 1181 599; x_wconf 96'><strong>both</strong></span>
</span>
<span class='ocr_line' id='line_1_4' title="bbox 73 628 1179 683; baseline 0.002 -11; x_size 56; x_descenders 11; x_ascenders 14"><span class='ocrx_word' id='word_1_32' title='bbox 73 631 278 672; x_wconf 96'><strong>countries</strong></span> <span class='ocrx_word' id='word_1_33' title='bbox 298 628 328 669; x_wconf 96'><strong>it</strong></span> <span class='ocrx_word' id='word_1_34' title='bbox 348 640 437 672; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_35' title='bbox 458 630 612 673; x_wconf 96'><strong>clearer</strong></span> <span class='ocrx_word' id='word_1_36' title='bbox 628 629 725 673; x_wconf 96'><strong>than</strong></span> <span class='ocrx_word' id='word_1_37' title='bbox 745 630 896 683; x_wconf 92'><strong>crystal</strong></span> <span class='ocrx_word' id='word_1_38' title='bbox 916 636 959 673; x_wconf 97'><strong>to</strong></span> <span class='ocrx_word' id='word_1_39' title='bbox 978 630 1049 674; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_40' title='bbox 1070 629 1179 674; x_wconf 95'><strong>lords</strong></span>
</span>
<span class='ocr_line' id='line_1_5' title="bbox 72 703 1182 759; baseline 0.002 -12; x_size 56; x_descenders 12; x_ascenders 15"><span class='ocrx_word' id='word_1_41' title='bbox 72 705 126 747; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_42' title='bbox 139 704 206 746; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_43' title='bbox 230 705 340 748; x_wconf 96'><strong>State</strong></span> <span class='ocrx_word' id='word_1_44' title='bbox 361 715 573 759; x_wconf 96'><strong>preserves</strong></span> <span class='ocrx_word' id='word_1_45' title='bbox 597 704 651 747; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_46' title='bbox 664 703 806 748; x_wconf 96'><strong>loaves</strong></span> <span class='ocrx_word' id='word_1_47' title='bbox 827 704 911 747; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_48' title='bbox 931 705 1074 756; x_wconf 96'><strong>fishes,</strong></span> <span class='ocrx_word' id='word_1_49' title='bbox 1097 705 1182 749; x_wconf 96'><strong>that</strong></span>
</span>
<span class='ocr_line' id='line_1_6' title="bbox 71 777 934 833; baseline -0.002 -11; x_size 57; x_descenders 12; x_ascenders 15"><span class='ocrx_word' id='word_1_50' title='bbox 71 777 208 833; x_wconf 94'><strong>things</strong></span> <span class='ocrx_word' id='word_1_51' title='bbox 224 777 267 822; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_52' title='bbox 283 778 446 833; x_wconf 96'><strong>general</strong></span> <span class='ocrx_word' id='word_1_53' title='bbox 463 791 571 822; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_54' title='bbox 588 778 733 823; x_wconf 96'><strong>settled</strong></span> <span class='ocrx_word' id='word_1_55' title='bbox 750 778 817 821; x_wconf 96'><strong>for</strong></span> <span class='ocrx_word' id='word_1_56' title='bbox 829 791 934 822; x_wconf 96'><strong>ever.</strong></span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_2' title="bbox 69 867 1189 2333">
<p class='ocr_par' id='par_1_2' lang='eng' title="bbox 69 867 1189 2333">
<span class='ocr_line' id='line_1_7' title="bbox 127 867 1179 921; baseline 0.002 -12; x_size 56; x_descenders 11; x_ascenders 15"><span class='ocrx_word' id='word_1_57' title='bbox 127 867 161 909; x_wconf 96'><strong>It</strong></span> <span class='ocrx_word' id='word_1_58' title='bbox 190 880 278 910; x_wconf 95'><strong>was</strong></span> <span class='ocrx_word' id='word_1_59' title='bbox 307 868 374 911; x_wconf 95'><strong>the</strong></span> <span class='ocrx_word' id='word_1_60' title='bbox 406 880 503 921; x_wconf 96'><strong>year</strong></span> <span class='ocrx_word' id='word_1_61' title='bbox 532 869 586 911; x_wconf 95'><strong>of</strong></span> <span class='ocrx_word' id='word_1_62' title='bbox 610 868 699 912; x_wconf 95'><strong>Our</strong></span> <span class='ocrx_word' id='word_1_63' title='bbox 728 868 836 912; x_wconf 95'><strong>Lord</strong></span> <span class='ocrx_word' id='word_1_64' title='bbox 866 880 946 912; x_wconf 96'><strong>one</strong></span> <span class='ocrx_word' id='word_1_65' title='bbox 978 867 1179 912; x_wconf 96'><strong>thousand</strong></span>
</span>
<span class='ocr_line' id='line_1_8' title="bbox 72 941 1181 996; baseline 0.001 -10; x_size 55; x_descenders 10; x_ascenders 14"><span class='ocrx_word' id='word_1_66' title='bbox 72 954 198 986; x_wconf 96'><strong>seven</strong></span> <span class='ocrx_word' id='word_1_67' title='bbox 222 941 406 986; x_wconf 95'><strong>hundred</strong></span> <span class='ocrx_word' id='word_1_68' title='bbox 430 943 510 986; x_wconf 95'><strong>and</strong></span> <span class='ocrx_word' id='word_1_69' title='bbox 534 942 823 995; x_wconf 96'><strong>seventy-five.</strong></span> <span class='ocrx_word' id='word_1_70' title='bbox 851 941 1039 996; x_wconf 93'><strong>Spiritual</strong></span> <span class='ocrx_word' id='word_1_71' title='bbox 1064 955 1181 987; x_wconf 92'><strong>reve-</strong></span>
</span>
<span class='ocr_line' id='line_1_9' title="bbox 74 1015 1180 1072; baseline 0 -11; x_size 58; x_descenders 12; x_ascenders 16"><span class='ocrx_word' id='word_1_72' title='bbox 74 1015 221 1061; x_wconf 95'><strong>lations</strong></span> <span class='ocrx_word' id='word_1_73' title='bbox 266 1029 375 1061; x_wconf 95'><strong>were</strong></span> <span class='ocrx_word' id='word_1_74' title='bbox 425 1017 637 1061; x_wconf 95'><strong>conceded</strong></span> <span class='ocrx_word' id='word_1_75' title='bbox 683 1023 729 1061; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_76' title='bbox 775 1017 962 1072; x_wconf 96'><strong>England</strong></span> <span class='ocrx_word' id='word_1_77' title='bbox 1008 1025 1051 1061; x_wconf 77'><strong>at</strong></span> <span class='ocrx_word' id='word_1_78' title='bbox 1096 1017 1180 1061; x_wconf 77'><strong>that</strong></span>
</span>
<span class='ocr_line' id='line_1_10' title="bbox 73 1090 1182 1145; baseline 0 -9; x_size 63; x_descenders 11; x_ascenders 23"><span class='ocrx_word' id='word_1_79' title='bbox 73 1090 273 1136; x_wconf 96'><strong>favoured</strong></span> <span class='ocrx_word' id='word_1_80' title='bbox 293 1090 453 1145; x_wconf 96'><strong>period,</strong></span> <span class='ocrx_word' id='word_1_81' title='bbox 478 1104 524 1135; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_82' title='bbox 549 1098 590 1135; x_wconf 96'><strong>at</strong></span> <span class='ocrx_word' id='word_1_83' title='bbox 610 1092 703 1136; x_wconf 81'><strong>this,</strong></span> <span class='ocrx_word' id='word_1_84' title='bbox 731 1093 832 1136; x_wconf 93'><strong>Mrs.</strong></span> <span class='ocrx_word' id='word_1_85' title='bbox 861 1092 1078 1136; x_wconf 92'><strong>Southcott</strong></span> <span class='ocrx_word' id='word_1_86' title='bbox 1100 1092 1182 1136; x_wconf 96'><strong>had</strong></span>
</span>
<span class='ocr_line' id='line_1_11' title="bbox 70 1165 1181 1218; baseline 0.001 -8; x_size 53; x_descenders 9; x_ascenders 13"><span class='ocrx_word' id='word_1_87' title='bbox 70 1168 254 1218; x_wconf 96'><strong>recently</strong></span> <span class='ocrx_word' id='word_1_88' title='bbox 276 1165 455 1210; x_wconf 96'><strong>attained</strong></span> <span class='ocrx_word' id='word_1_89' title='bbox 479 1168 551 1210; x_wconf 93'><strong>her</strong></span> <span class='ocrx_word' id='word_1_90' title='bbox 576 1166 989 1211; x_wconf 90'><strong>five-and-twentieth</strong></span> <span class='ocrx_word' id='word_1_91' title='bbox 1016 1166 1181 1211; x_wconf 96'><strong>blessed</strong></span>
</span>
<span class='ocr_line' id='line_1_12' title="bbox 72 1240 1179 1297; baseline 0.004 -15; x_size 58; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_92' title='bbox 72 1240 266 1293; x_wconf 96'><strong>birthday,</strong></span> <span class='ocrx_word' id='word_1_93' title='bbox 286 1240 336 1283; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_94' title='bbox 348 1241 487 1285; x_wconf 96'><strong>whom</strong></span> <span class='ocrx_word' id='word_1_95' title='bbox 503 1254 529 1284; x_wconf 95'><strong>a</strong></span> <span class='ocrx_word' id='word_1_96' title='bbox 541 1242 754 1297; x_wconf 96'><strong>prophetic</strong></span> <span class='ocrx_word' id='word_1_97' title='bbox 770 1240 929 1296; x_wconf 96'><strong>private</strong></span> <span class='ocrx_word' id='word_1_98' title='bbox 944 1243 987 1286; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_99' title='bbox 1003 1241 1070 1286; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_100' title='bbox 1086 1241 1179 1286; x_wconf 96'><strong>Life</strong></span>
</span>
<span class='ocr_line' id='line_1_13' title="bbox 71 1315 1181 1371; baseline 0 -11; x_size 56; x_descenders 11; x_ascenders 13"><span class='ocrx_word' id='word_1_101' title='bbox 71 1315 232 1360; x_wconf 96'><strong>Guards</strong></span> <span class='ocrx_word' id='word_1_102' title='bbox 252 1315 335 1359; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_103' title='bbox 355 1315 548 1360; x_wconf 95'><strong>heralded</strong></span> <span class='ocrx_word' id='word_1_104' title='bbox 568 1319 635 1360; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_105' title='bbox 656 1317 832 1361; x_wconf 96'><strong>sublime</strong></span> <span class='ocrx_word' id='word_1_106' title='bbox 851 1329 1106 1371; x_wconf 96'><strong>appearance</strong></span> <span class='ocrx_word' id='word_1_107' title='bbox 1125 1317 1181 1371; x_wconf 95'><strong>by</strong></span>
</span>
<span class='ocr_line' id='line_1_14' title="bbox 71 1390 1179 1445; baseline -0.002 -10; x_size 54; x_descenders 11; x_ascenders 11"><span class='ocrx_word' id='word_1_108' title='bbox 71 1392 334 1444; x_wconf 96'><strong>announcing</strong></span> <span class='ocrx_word' id='word_1_109' title='bbox 349 1392 434 1434; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_110' title='bbox 449 1398 754 1445; x_wconf 96'><strong>arrangements</strong></span> <span class='ocrx_word' id='word_1_111' title='bbox 767 1403 875 1435; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_112' title='bbox 893 1392 1013 1435; x_wconf 96'><strong>made</strong></span> <span class='ocrx_word' id='word_1_113' title='bbox 1034 1390 1096 1435; x_wconf 96'><strong>for</strong></span> <span class='ocrx_word' id='word_1_114' title='bbox 1112 1391 1179 1434; x_wconf 96'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_15' title="bbox 73 1465 1178 1521; baseline 0 -13; x_size 58; x_descenders 13; x_ascenders 14"><span class='ocrx_word' id='word_1_115' title='bbox 73 1466 332 1520; x_wconf 96'><strong>swallowing</strong></span> <span class='ocrx_word' id='word_1_116' title='bbox 372 1479 427 1521; x_wconf 95'><strong>up</strong></span> <span class='ocrx_word' id='word_1_117' title='bbox 465 1467 519 1509; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_118' title='bbox 553 1466 728 1509; x_wconf 96'><strong>London</strong></span> <span class='ocrx_word' id='word_1_119' title='bbox 769 1468 849 1510; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_120' title='bbox 890 1465 1178 1510; x_wconf 96'><strong>Westminster.</strong></span>
</span>
<span class='ocr_line' id='line_1_16' title="bbox 71 1539 1181 1597; baseline -0.001 -13; x_size 58; x_descenders 13; x_ascenders 14"><span class='ocrx_word' id='word_1_121' title='bbox 71 1540 184 1584; x_wconf 95'><strong>Even</strong></span> <span class='ocrx_word' id='word_1_122' title='bbox 208 1539 276 1584; x_wconf 93'><strong>the</strong></span> <span class='ocrx_word' id='word_1_123' title='bbox 300 1540 530 1584; x_wconf 91'><strong>Cock-lane</strong></span> <span class='ocrx_word' id='word_1_124' title='bbox 552 1540 676 1595; x_wconf 96'><strong>ghost</strong></span> <span class='ocrx_word' id='word_1_125' title='bbox 696 1540 776 1585; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_126' title='bbox 800 1541 905 1585; x_wconf 96'><strong>been</strong></span> <span class='ocrx_word' id='word_1_127' title='bbox 929 1539 1010 1585; x_wconf 95'><strong>laid</strong></span> <span class='ocrx_word' id='word_1_128' title='bbox 1034 1543 1134 1597; x_wconf 96'><strong>only</strong></span> <span class='ocrx_word' id='word_1_129' title='bbox 1156 1553 1181 1583; x_wconf 97'><strong>a</strong></span>
</span>
<span class='ocr_line' id='line_1_17' title="bbox 70 1614 1179 1671; baseline 0.001 -13; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_130' title='bbox 70 1615 200 1659; x_wconf 96'><strong>round</strong></span> <span class='ocrx_word' id='word_1_131' title='bbox 220 1614 354 1659; x_wconf 96'><strong>dozen</strong></span> <span class='ocrx_word' id='word_1_132' title='bbox 374 1616 428 1659; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_133' title='bbox 441 1627 571 1670; x_wconf 96'><strong>years,</strong></span> <span class='ocrx_word' id='word_1_134' title='bbox 595 1617 699 1659; x_wconf 96'><strong>after</strong></span> <span class='ocrx_word' id='word_1_135' title='bbox 716 1615 887 1671; x_wconf 96'><strong>rapping</strong></span> <span class='ocrx_word' id='word_1_136' title='bbox 907 1622 979 1658; x_wconf 96'><strong>out</strong></span> <span class='ocrx_word' id='word_1_137' title='bbox 999 1617 1050 1659; x_wconf 93'><strong>its</strong></span> <span class='ocrx_word' id='word_1_138' title='bbox 1070 1629 1179 1659; x_wconf 93'><strong>mes-</strong></span>
</span>
<span class='ocr_line' id='line_1_18' title="bbox 72 1689 1181 1746; baseline 0.001 -13; x_size 53; x_descenders 10; x_ascenders 13"><span class='ocrx_word' id='word_1_139' title='bbox 72 1701 206 1743; x_wconf 96'><strong>sages,</strong></span> <span class='ocrx_word' id='word_1_140' title='bbox 231 1702 277 1734; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_141' title='bbox 302 1690 373 1733; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_142' title='bbox 397 1689 535 1746; x_wconf 96'><strong>spirits</strong></span> <span class='ocrx_word' id='word_1_143' title='bbox 560 1690 613 1732; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_144' title='bbox 631 1691 714 1733; x_wconf 96'><strong>this</strong></span> <span class='ocrx_word' id='word_1_145' title='bbox 738 1702 839 1745; x_wconf 96'><strong>very</strong></span> <span class='ocrx_word' id='word_1_146' title='bbox 864 1703 964 1743; x_wconf 96'><strong>year</strong></span> <span class='ocrx_word' id='word_1_147' title='bbox 988 1692 1064 1734; x_wconf 96'><strong>last</strong></span> <span class='ocrx_word' id='word_1_148' title='bbox 1089 1699 1181 1743; x_wconf 96'><strong>past</strong></span>
</span>
<span class='ocr_line' id='line_1_19' title="bbox 71 1763 1180 1820; baseline 0.002 -13; x_size 56; x_descenders 11; x_ascenders 14"><span class='ocrx_word' id='word_1_149' title='bbox 71 1764 412 1818; x_wconf 92'><strong>(supematurally</strong></span> <span class='ocrx_word' id='word_1_150' title='bbox 441 1763 638 1808; x_wconf 96'><strong>deficient</strong></span> <span class='ocrx_word' id='word_1_151' title='bbox 671 1766 713 1808; x_wconf 95'><strong>in</strong></span> <span class='ocrx_word' id='word_1_152' title='bbox 741 1765 997 1820; x_wconf 96'><strong>originality)</strong></span> <span class='ocrx_word' id='word_1_153' title='bbox 1026 1765 1180 1819; x_wconf 96'><strong>rapped</strong></span>
</span>
<span class='ocr_line' id='line_1_20' title="bbox 69 1839 1189 1894; baseline 0 -11; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_154' title='bbox 69 1847 141 1883; x_wconf 96'><strong>out</strong></span> <span class='ocrx_word' id='word_1_155' title='bbox 160 1839 294 1883; x_wconf 96'><strong>theirs.</strong></span> <span class='ocrx_word' id='word_1_156' title='bbox 314 1839 432 1883; x_wconf 95'><strong>Mere</strong></span> <span class='ocrx_word' id='word_1_157' title='bbox 452 1851 661 1894; x_wconf 96'><strong>messages</strong></span> <span class='ocrx_word' id='word_1_158' title='bbox 682 1841 724 1882; x_wconf 95'><strong>in</strong></span> <span class='ocrx_word' id='word_1_159' title='bbox 740 1839 807 1884; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_160' title='bbox 828 1840 982 1894; x_wconf 96'><strong>earthly</strong></span> <span class='ocrx_word' id='word_1_161' title='bbox 999 1840 1119 1884; x_wconf 95'><strong>order</strong></span> <span class='ocrx_word' id='word_1_162' title='bbox 1136 1840 1189 1884; x_wconf 96'><strong>of</strong></span>
</span>
<span class='ocr_line' id='line_1_21' title="bbox 71 1913 1181 1970; baseline 0.001 -12; x_size 57; x_descenders 13; x_ascenders 12"><span class='ocrx_word' id='word_1_163' title='bbox 71 1920 214 1958; x_wconf 96'><strong>events</strong></span> <span class='ocrx_word' id='word_1_164' title='bbox 230 1914 310 1958; x_wconf 97'><strong>had</strong></span> <span class='ocrx_word' id='word_1_165' title='bbox 326 1913 451 1970; x_wconf 96'><strong>lately</strong></span> <span class='ocrx_word' id='word_1_166' title='bbox 467 1926 588 1958; x_wconf 96'><strong>come</strong></span> <span class='ocrx_word' id='word_1_167' title='bbox 601 1922 646 1956; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_168' title='bbox 659 1916 730 1958; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_169' title='bbox 746 1914 915 1970; x_wconf 96'><strong>English</strong></span> <span class='ocrx_word' id='word_1_170' title='bbox 931 1915 1085 1958; x_wconf 96'><strong>Crown</strong></span> <span class='ocrx_word' id='word_1_171' title='bbox 1101 1915 1181 1959; x_wconf 96'><strong>and</strong></span>
</span>
<span class='ocr_line' id='line_1_22' title="bbox 72 1988 1180 2043; baseline 0 -10; x_size 56; x_descenders 11; x_ascenders 15"><span class='ocrx_word' id='word_1_172' title='bbox 72 1990 237 2042; x_wconf 96'><strong>People,</strong></span> <span class='ocrx_word' id='word_1_173' title='bbox 266 1988 374 2033; x_wconf 94'><strong>from</strong></span> <span class='ocrx_word' id='word_1_174' title='bbox 399 2004 424 2030; x_wconf 94'><strong>a</strong></span> <span class='ocrx_word' id='word_1_175' title='bbox 453 2001 649 2042; x_wconf 96'><strong>congress</strong></span> <span class='ocrx_word' id='word_1_176' title='bbox 674 1990 728 2032; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_177' title='bbox 749 1989 900 2033; x_wconf 96'><strong>British</strong></span> <span class='ocrx_word' id='word_1_178' title='bbox 929 1988 1109 2043; x_wconf 96'><strong>subjects</strong></span> <span class='ocrx_word' id='word_1_179' title='bbox 1137 1991 1180 2033; x_wconf 96'><strong>in</strong></span>
</span>
<span class='ocr_line' id='line_1_23' title="bbox 72 2062 1178 2119; baseline 0 -11; x_size 57; x_descenders 12; x_ascenders 15"><span class='ocrx_word' id='word_1_180' title='bbox 72 2065 277 2108; x_wconf 88'><strong>America:</strong></span> <span class='ocrx_word' id='word_1_181' title='bbox 301 2062 452 2115; x_wconf 96'><strong>which,</strong></span> <span class='ocrx_word' id='word_1_182' title='bbox 477 2072 640 2119; x_wconf 96'><strong>strange</strong></span> <span class='ocrx_word' id='word_1_183' title='bbox 664 2071 707 2107; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_184' title='bbox 731 2063 869 2114; x_wconf 96'><strong>relate,</strong></span> <span class='ocrx_word' id='word_1_185' title='bbox 893 2063 998 2108; x_wconf 96'><strong>have</strong></span> <span class='ocrx_word' id='word_1_186' title='bbox 1022 2065 1178 2117; x_wconf 96'><strong>proved</strong></span>
</span>
<span class='ocr_line' id='line_1_24' title="bbox 70 2138 1179 2193; baseline 0.001 -11; x_size 55; x_descenders 11; x_ascenders 12"><span class='ocrx_word' id='word_1_187' title='bbox 70 2150 187 2182; x_wconf 95'><strong>more</strong></span> <span class='ocrx_word' id='word_1_188' title='bbox 203 2140 421 2193; x_wconf 95'><strong>important</strong></span> <span class='ocrx_word' id='word_1_189' title='bbox 437 2145 479 2182; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_190' title='bbox 495 2138 563 2182; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_191' title='bbox 578 2140 730 2182; x_wconf 95'><strong>human</strong></span> <span class='ocrx_word' id='word_1_192' title='bbox 746 2150 842 2183; x_wconf 96'><strong>race</strong></span> <span class='ocrx_word' id='word_1_193' title='bbox 854 2139 951 2183; x_wconf 96'><strong>than</strong></span> <span class='ocrx_word' id='word_1_194' title='bbox 967 2151 1050 2192; x_wconf 90'><strong>any</strong></span> <span class='ocrx_word' id='word_1_195' title='bbox 1063 2151 1179 2183; x_wconf 90'><strong>com-</strong></span>
</span>
<span class='ocr_line' id='line_1_25' title="bbox 69 2212 1182 2269; baseline 0.001 -12; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_196' title='bbox 69 2212 345 2257; x_wconf 95'><strong>munications</strong></span> <span class='ocrx_word' id='word_1_197' title='bbox 377 2221 449 2268; x_wconf 96'><strong>yet</strong></span> <span class='ocrx_word' id='word_1_198' title='bbox 481 2213 674 2257; x_wconf 96'><strong>received</strong></span> <span class='ocrx_word' id='word_1_199' title='bbox 706 2214 882 2269; x_wconf 96'><strong>through</strong></span> <span class='ocrx_word' id='word_1_200' title='bbox 916 2227 998 2269; x_wconf 96'><strong>any</strong></span> <span class='ocrx_word' id='word_1_201' title='bbox 1031 2215 1086 2258; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_202' title='bbox 1112 2213 1182 2258; x_wconf 96'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_26' title="bbox 71 2286 815 2333; baseline 0.001 -1; x_size 56.447617; x_descenders 11.447617; x_ascenders 15"><span class='ocrx_word' id='word_1_203' title='bbox 71 2288 268 2332; x_wconf 96'><strong>chickens</strong></span> <span class='ocrx_word' id='word_1_204' title='bbox 280 2286 333 2330; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_205' title='bbox 343 2289 414 2331; x_wconf 93'><strong>the</strong></span> <span class='ocrx_word' id='word_1_206' title='bbox 426 2287 659 2332; x_wconf 91'><strong>Cock-lane</strong></span> <span class='ocrx_word' id='word_1_207' title='bbox 672 2288 815 2333; x_wconf 95'><strong>brood.</strong></span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_3' title="bbox 69 2375 1182 2880">
<p class='ocr_par' id='par_1_3' lang='eng' title="bbox 69 2375 1182 2880">
<span class='ocr_line' id='line_1_27' title="bbox 125 2375 1179 2426; baseline 0.004 -8; x_size 56.309299; x_descenders 11.3093; x_ascenders 14"><span class='ocrx_word' id='word_1_208' title='bbox 125 2376 292 2426; x_wconf 96'><strong>France,</strong></span> <span class='ocrx_word' id='word_1_209' title='bbox 311 2379 396 2420; x_wconf 96'><strong>less</strong></span> <span class='ocrx_word' id='word_1_210' title='bbox 416 2375 613 2421; x_wconf 96'><strong>favoured</strong></span> <span class='ocrx_word' id='word_1_211' title='bbox 633 2391 688 2421; x_wconf 96'><strong>on</strong></span> <span class='ocrx_word' id='word_1_212' title='bbox 707 2377 775 2420; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_213' title='bbox 792 2377 930 2421; x_wconf 96'><strong>whole</strong></span> <span class='ocrx_word' id='word_1_214' title='bbox 950 2389 997 2419; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_215' title='bbox 1012 2384 1058 2421; x_wconf 93'><strong>to</strong></span> <span class='ocrx_word' id='word_1_216' title='bbox 1075 2384 1179 2422; x_wconf 92'><strong>mat-</strong></span>
</span>
<span class='ocr_line' id='line_1_28' title="bbox 69 2451 1178 2508; baseline 0.002 -13; x_size 58; x_descenders 13; x_ascenders 16"><span class='ocrx_word' id='word_1_217' title='bbox 69 2458 149 2495; x_wconf 96'><strong>ters</strong></span> <span class='ocrx_word' id='word_1_218' title='bbox 169 2452 353 2508; x_wconf 96'><strong>spiritual</strong></span> <span class='ocrx_word' id='word_1_219' title='bbox 369 2451 470 2496; x_wconf 95'><strong>than</strong></span> <span class='ocrx_word' id='word_1_220' title='bbox 485 2452 556 2496; x_wconf 95'><strong>her</strong></span> <span class='ocrx_word' id='word_1_221' title='bbox 573 2452 694 2496; x_wconf 96'><strong>sister</strong></span> <span class='ocrx_word' id='word_1_222' title='bbox 710 2451 764 2494; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_223' title='bbox 773 2453 840 2496; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_224' title='bbox 861 2451 995 2496; x_wconf 96'><strong>shield</strong></span> <span class='ocrx_word' id='word_1_225' title='bbox 1011 2453 1095 2496; x_wconf 93'><strong>and</strong></span> <span class='ocrx_word' id='word_1_226' title='bbox 1111 2454 1178 2497; x_wconf 92'><strong>tri-</strong></span>
</span>
<span class='ocr_line' id='line_1_29' title="bbox 72 2525 1181 2582; baseline 0.001 -12; x_size 58; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_227' title='bbox 72 2527 180 2575; x_wconf 96'><strong>dent,</strong></span> <span class='ocrx_word' id='word_1_228' title='bbox 210 2526 342 2570; x_wconf 95'><strong>rolled</strong></span> <span class='ocrx_word' id='word_1_229' title='bbox 372 2526 472 2571; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_230' title='bbox 502 2526 731 2582; x_wconf 96'><strong>exceeding</strong></span> <span class='ocrx_word' id='word_1_231' title='bbox 763 2525 1023 2571; x_wconf 96'><strong>smoothness</strong></span> <span class='ocrx_word' id='word_1_232' title='bbox 1055 2528 1181 2571; x_wconf 96'><strong>down</strong></span>
</span>
<span class='ocr_line' id='line_1_30' title="bbox 69 2600 1182 2658; baseline 0.002 -14; x_size 55; x_descenders 10; x_ascenders 14"><span class='ocrx_word' id='word_1_233' title='bbox 69 2600 158 2651; x_wconf 96'><strong>hill,</strong></span> <span class='ocrx_word' id='word_1_234' title='bbox 174 2601 341 2654; x_wconf 95'><strong>making</strong></span> <span class='ocrx_word' id='word_1_235' title='bbox 357 2613 483 2657; x_wconf 96'><strong>paper</strong></span> <span class='ocrx_word' id='word_1_236' title='bbox 499 2613 649 2656; x_wconf 96'><strong>money</strong></span> <span class='ocrx_word' id='word_1_237' title='bbox 665 2602 745 2645; x_wconf 95'><strong>and</strong></span> <span class='ocrx_word' id='word_1_238' title='bbox 762 2600 963 2658; x_wconf 96'><strong>spending</strong></span> <span class='ocrx_word' id='word_1_239' title='bbox 980 2602 1020 2644; x_wconf 96'><strong>it.</strong></span> <span class='ocrx_word' id='word_1_240' title='bbox 1040 2601 1182 2646; x_wconf 96'><strong>Under</strong></span>
</span>
<span class='ocr_line' id='line_1_31' title="bbox 71 2675 1178 2730; baseline -0.001 -11; x_size 56; x_descenders 11; x_ascenders 14"><span class='ocrx_word' id='word_1_241' title='bbox 71 2677 138 2719; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_242' title='bbox 157 2677 360 2730; x_wconf 92'><strong>guidance</strong></span> <span class='ocrx_word' id='word_1_243' title='bbox 381 2675 434 2718; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_244' title='bbox 446 2678 518 2720; x_wconf 96'><strong>her</strong></span> <span class='ocrx_word' id='word_1_245' title='bbox 535 2675 744 2721; x_wconf 96'><strong>Christian</strong></span> <span class='ocrx_word' id='word_1_246' title='bbox 760 2682 936 2730; x_wconf 96'><strong>pastors,</strong></span> <span class='ocrx_word' id='word_1_247' title='bbox 956 2677 1031 2719; x_wconf 93'><strong>she</strong></span> <span class='ocrx_word' id='word_1_248' title='bbox 1048 2685 1178 2720; x_wconf 92'><strong>enter-</strong></span>
</span>
<span class='ocr_line' id='line_1_32' title="bbox 70 2749 1180 2801; baseline 0.002 -7; x_size 56.309299; x_descenders 11.3093; x_ascenders 14"><span class='ocrx_word' id='word_1_249' title='bbox 70 2749 209 2794; x_wconf 95'><strong>tained</strong></span> <span class='ocrx_word' id='word_1_250' title='bbox 255 2751 421 2801; x_wconf 95'><strong>herself,</strong></span> <span class='ocrx_word' id='word_1_251' title='bbox 470 2750 650 2801; x_wconf 95'><strong>besides,</strong></span> <span class='ocrx_word' id='word_1_252' title='bbox 699 2750 800 2794; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_253' title='bbox 850 2750 950 2795; x_wconf 96'><strong>such</strong></span> <span class='ocrx_word' id='word_1_254' title='bbox 1000 2752 1180 2796; x_wconf 96'><strong>humane</strong></span>
</span>
<span class='ocr_line' id='line_1_33' title="bbox 69 2825 1178 2880; baseline 0.002 -11; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_255' title='bbox 69 2825 374 2869; x_wconf 96'><strong>achievements</strong></span> <span class='ocrx_word' id='word_1_256' title='bbox 398 2837 444 2867; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_257' title='bbox 465 2826 708 2879; x_wconf 96'><strong>sentencing</strong></span> <span class='ocrx_word' id='word_1_258' title='bbox 727 2840 753 2869; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_259' title='bbox 773 2826 903 2880; x_wconf 95'><strong>youth</strong></span> <span class='ocrx_word' id='word_1_260' title='bbox 923 2833 966 2870; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_261' title='bbox 987 2827 1094 2869; x_wconf 96'><strong>have</strong></span> <span class='ocrx_word' id='word_1_262' title='bbox 1115 2826 1178 2871; x_wconf 96'><strong>his</strong></span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_4' title="bbox 1377 403 2497 2864">
<p class='ocr_par' id='par_1_4' lang='eng' title="bbox 1379 403 2497 2175">
<span class='ocr_line' id='line_1_34' title="bbox 1381 403 2489 460; baseline 0.001 -13; x_size 57; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_263' title='bbox 1381 403 1513 447; x_wconf 96'><strong>hands</strong></span> <span class='ocrx_word' id='word_1_264' title='bbox 1534 413 1605 447; x_wconf 96'><strong>cut</strong></span> <span class='ocrx_word' id='word_1_265' title='bbox 1626 403 1702 456; x_wconf 96'><strong>off,</strong></span> <span class='ocrx_word' id='word_1_266' title='bbox 1725 404 1789 446; x_wconf 96'><strong>his</strong></span> <span class='ocrx_word' id='word_1_267' title='bbox 1812 410 1964 458; x_wconf 95'><strong>tongue</strong></span> <span class='ocrx_word' id='word_1_268' title='bbox 1987 412 2077 448; x_wconf 95'><strong>torn</strong></span> <span class='ocrx_word' id='word_1_269' title='bbox 2096 411 2171 448; x_wconf 95'><strong>out</strong></span> <span class='ocrx_word' id='word_1_270' title='bbox 2192 403 2289 448; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_271' title='bbox 2313 405 2489 460; x_wconf 96'><strong>pincers,</strong></span>
</span>
<span class='ocr_line' id='line_1_35' title="bbox 1382 478 2491 532; baseline -0.001 -10; x_size 56; x_descenders 11; x_ascenders 14"><span class='ocrx_word' id='word_1_272' title='bbox 1382 480 1462 522; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_273' title='bbox 1486 478 1549 521; x_wconf 96'><strong>his</strong></span> <span class='ocrx_word' id='word_1_274' title='bbox 1573 478 1686 532; x_wconf 96'><strong>body</strong></span> <span class='ocrx_word' id='word_1_275' title='bbox 1711 479 1866 523; x_wconf 0'><strong>burned</strong></span> <span class='ocrx_word' id='word_1_276' title='bbox 1890 481 2012 529; x_wconf 96'><strong>alive,</strong></span> <span class='ocrx_word' id='word_1_277' title='bbox 2036 481 2216 523; x_wconf 95'><strong>because</strong></span> <span class='ocrx_word' id='word_1_278' title='bbox 2238 478 2291 523; x_wconf 96'><strong>he</strong></span> <span class='ocrx_word' id='word_1_279' title='bbox 2315 479 2395 522; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_280' title='bbox 2420 487 2491 522; x_wconf 96'><strong>not</strong></span>
</span>
<span class='ocr_line' id='line_1_36' title="bbox 1381 552 2490 609; baseline 0.001 -13; x_size 58; x_descenders 13; x_ascenders 14"><span class='ocrx_word' id='word_1_281' title='bbox 1381 552 1557 597; x_wconf 96'><strong>kneeled</strong></span> <span class='ocrx_word' id='word_1_282' title='bbox 1576 555 1698 597; x_wconf 96'><strong>down</strong></span> <span class='ocrx_word' id='word_1_283' title='bbox 1718 555 1761 596; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_284' title='bbox 1780 553 1847 598; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_285' title='bbox 1864 553 1951 598; x_wconf 96'><strong>rain</strong></span> <span class='ocrx_word' id='word_1_286' title='bbox 1968 559 2014 597; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_287' title='bbox 2031 552 2086 597; x_wconf 96'><strong>do</strong></span> <span class='ocrx_word' id='word_1_288' title='bbox 2106 554 2268 598; x_wconf 96'><strong>honour</strong></span> <span class='ocrx_word' id='word_1_289' title='bbox 2281 561 2326 598; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_290' title='bbox 2343 567 2369 596; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_291' title='bbox 2385 553 2490 609; x_wconf 96'><strong>dirty</strong></span>
</span>
<span class='ocr_line' id='line_1_37' title="bbox 1380 627 2489 684; baseline 0.001 -13; x_size 57; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_292' title='bbox 1380 627 1621 683; x_wconf 96'><strong>procession</strong></span> <span class='ocrx_word' id='word_1_293' title='bbox 1650 627 1703 670; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_294' title='bbox 1728 630 1875 673; x_wconf 96'><strong>monks</strong></span> <span class='ocrx_word' id='word_1_295' title='bbox 1908 628 2042 672; x_wconf 96'><strong>which</strong></span> <span class='ocrx_word' id='word_1_296' title='bbox 2071 629 2221 684; x_wconf 96'><strong>passed</strong></span> <span class='ocrx_word' id='word_1_297' title='bbox 2253 627 2396 672; x_wconf 96'><strong>within</strong></span> <span class='ocrx_word' id='word_1_298' title='bbox 2424 630 2489 672; x_wconf 96'><strong>his</strong></span>
</span>
<span class='ocr_line' id='line_1_38' title="bbox 1381 702 2491 758; baseline 0.001 -13; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_299' title='bbox 1381 703 1499 754; x_wconf 95'><strong>view,</strong></span> <span class='ocrx_word' id='word_1_300' title='bbox 1515 711 1556 745; x_wconf 95'><strong>at</strong></span> <span class='ocrx_word' id='word_1_301' title='bbox 1573 718 1595 744; x_wconf 95'><strong>a</strong></span> <span class='ocrx_word' id='word_1_302' title='bbox 1611 704 1795 746; x_wconf 96'><strong>distance</strong></span> <span class='ocrx_word' id='word_1_303' title='bbox 1811 704 1865 747; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_304' title='bbox 1873 715 1991 747; x_wconf 96'><strong>some</strong></span> <span class='ocrx_word' id='word_1_305' title='bbox 2007 702 2102 756; x_wconf 97'><strong>fifty</strong></span> <span class='ocrx_word' id='word_1_306' title='bbox 2119 716 2169 746; x_wconf 96'><strong>or</strong></span> <span class='ocrx_word' id='word_1_307' title='bbox 2181 705 2290 758; x_wconf 96'><strong>sixty</strong></span> <span class='ocrx_word' id='word_1_308' title='bbox 2303 703 2437 757; x_wconf 92'><strong>yards.</strong></span> <span class='ocrx_word' id='word_1_309' title='bbox 2456 705 2491 746; x_wconf 96'><strong>It</strong></span>
</span>
<span class='ocr_line' id='line_1_39' title="bbox 1383 776 2497 832; baseline 0 -11; x_size 53; x_descenders 8; x_ascenders 15"><span class='ocrx_word' id='word_1_310' title='bbox 1383 778 1418 821; x_wconf 96'><strong>is</strong></span> <span class='ocrx_word' id='word_1_311' title='bbox 1450 776 1575 832; x_wconf 96'><strong>likely</strong></span> <span class='ocrx_word' id='word_1_312' title='bbox 1604 779 1768 831; x_wconf 96'><strong>enough</strong></span> <span class='ocrx_word' id='word_1_313' title='bbox 1800 777 1897 829; x_wconf 96'><strong>that,</strong></span> <span class='ocrx_word' id='word_1_314' title='bbox 1925 777 2072 822; x_wconf 96'><strong>rooted</strong></span> <span class='ocrx_word' id='word_1_315' title='bbox 2100 779 2143 822; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_316' title='bbox 2172 777 2239 822; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_317' title='bbox 2268 779 2415 822; x_wconf 96'><strong>woods</strong></span> <span class='ocrx_word' id='word_1_318' title='bbox 2443 779 2497 822; x_wconf 96'><strong>of</strong></span>
</span>
<span class='ocr_line' id='line_1_40' title="bbox 1381 853 2488 907; baseline 0 -11; x_size 54; x_descenders 11; x_ascenders 12"><span class='ocrx_word' id='word_1_319' title='bbox 1381 853 1532 896; x_wconf 95'><strong>France</strong></span> <span class='ocrx_word' id='word_1_320' title='bbox 1561 854 1641 896; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_321' title='bbox 1666 853 1858 906; x_wconf 96'><strong>Norway,</strong></span> <span class='ocrx_word' id='word_1_322' title='bbox 1882 853 1996 897; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_323' title='bbox 2020 866 2132 897; x_wconf 95'><strong>were</strong></span> <span class='ocrx_word' id='word_1_324' title='bbox 2158 853 2346 907; x_wconf 95'><strong>growing</strong></span> <span class='ocrx_word' id='word_1_325' title='bbox 2370 862 2488 905; x_wconf 96'><strong>trees,</strong></span>
</span>
<span class='ocr_line' id='line_1_41' title="bbox 1380 926 2489 984; baseline -0.001 -14; x_size 59; x_descenders 15; x_ascenders 15"><span class='ocrx_word' id='word_1_326' title='bbox 1380 927 1502 971; x_wconf 96'><strong>when</strong></span> <span class='ocrx_word' id='word_1_327' title='bbox 1534 927 1619 971; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_328' title='bbox 1651 926 1827 971; x_wconf 96'><strong>sufferer</strong></span> <span class='ocrx_word' id='word_1_329' title='bbox 1856 939 1944 971; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_330' title='bbox 1977 935 2049 983; x_wconf 96'><strong>put</strong></span> <span class='ocrx_word' id='word_1_331' title='bbox 2081 934 2123 971; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_332' title='bbox 2156 927 2290 978; x_wconf 96'><strong>death,</strong></span> <span class='ocrx_word' id='word_1_333' title='bbox 2323 930 2489 984; x_wconf 96'><strong>already</strong></span>
</span>
<span class='ocr_line' id='line_1_42' title="bbox 1382 1001 2488 1056; baseline 0 -10; x_size 57; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_334' title='bbox 1382 1001 1550 1046; x_wconf 96'><strong>marked</strong></span> <span class='ocrx_word' id='word_1_335' title='bbox 1574 1001 1629 1056; x_wconf 96'><strong>by</strong></span> <span class='ocrx_word' id='word_1_336' title='bbox 1654 1003 1722 1045; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_337' title='bbox 1749 1003 1988 1051; x_wconf 96'><strong>Woodman,</strong></span> <span class='ocrx_word' id='word_1_338' title='bbox 2016 1003 2126 1054; x_wconf 96'><strong>Fate,</strong></span> <span class='ocrx_word' id='word_1_339' title='bbox 2150 1011 2196 1045; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_340' title='bbox 2217 1015 2342 1046; x_wconf 95'><strong>come</strong></span> <span class='ocrx_word' id='word_1_341' title='bbox 2366 1004 2488 1046; x_wconf 96'><strong>down</strong></span>
</span>
<span class='ocr_line' id='line_1_43' title="bbox 1381 1076 2490 1127; baseline -0.002 -7; x_size 57.08234; x_descenders 12.082339; x_ascenders 15"><span class='ocrx_word' id='word_1_342' title='bbox 1381 1076 1461 1121; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_343' title='bbox 1477 1076 1532 1120; x_wconf 96'><strong>be</strong></span> <span class='ocrx_word' id='word_1_344' title='bbox 1548 1089 1661 1120; x_wconf 95'><strong>sawn</strong></span> <span class='ocrx_word' id='word_1_345' title='bbox 1681 1078 1765 1120; x_wconf 95'><strong>into</strong></span> <span class='ocrx_word' id='word_1_346' title='bbox 1781 1078 1945 1127; x_wconf 96'><strong>boards,</strong></span> <span class='ocrx_word' id='word_1_347' title='bbox 1964 1084 2007 1121; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_348' title='bbox 2024 1076 2144 1121; x_wconf 97'><strong>make</strong></span> <span class='ocrx_word' id='word_1_349' title='bbox 2161 1090 2186 1120; x_wconf 95'><strong>a</strong></span> <span class='ocrx_word' id='word_1_350' title='bbox 2203 1076 2354 1121; x_wconf 93'><strong>certain</strong></span> <span class='ocrx_word' id='word_1_351' title='bbox 2374 1090 2490 1120; x_wconf 92'><strong>mov-</strong></span>
</span>
<span class='ocr_line' id='line_1_44' title="bbox 1380 1150 2489 1204; baseline 0 -10; x_size 54; x_descenders 9; x_ascenders 14"><span class='ocrx_word' id='word_1_352' title='bbox 1380 1152 1476 1195; x_wconf 96'><strong>able</strong></span> <span class='ocrx_word' id='word_1_353' title='bbox 1492 1150 1738 1195; x_wconf 96'><strong>framework</strong></span> <span class='ocrx_word' id='word_1_354' title='bbox 1751 1152 1852 1194; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_355' title='bbox 1868 1166 1893 1196; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_356' title='bbox 1909 1151 2010 1196; x_wconf 95'><strong>sack</strong></span> <span class='ocrx_word' id='word_1_357' title='bbox 2026 1151 2106 1195; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_358' title='bbox 2121 1166 2147 1196; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_359' title='bbox 2163 1151 2277 1196; x_wconf 95'><strong>knife</strong></span> <span class='ocrx_word' id='word_1_360' title='bbox 2293 1152 2335 1194; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_361' title='bbox 2355 1150 2397 1204; x_wconf 93'><strong>it,</strong></span> <span class='ocrx_word' id='word_1_362' title='bbox 2413 1161 2489 1194; x_wconf 93'><strong>ter-</strong></span>
</span>
<span class='ocr_line' id='line_1_45' title="bbox 1382 1225 2492 1282; baseline 0.001 -12; x_size 58; x_descenders 13; x_ascenders 15"><span class='ocrx_word' id='word_1_363' title='bbox 1382 1227 1483 1270; x_wconf 88'><strong>rible</strong></span> <span class='ocrx_word' id='word_1_364' title='bbox 1511 1225 1554 1270; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_365' title='bbox 1578 1225 1742 1281; x_wconf 96'><strong>history.</strong></span> <span class='ocrx_word' id='word_1_366' title='bbox 1773 1228 1808 1270; x_wconf 96'><strong>It</strong></span> <span class='ocrx_word' id='word_1_367' title='bbox 1833 1227 1870 1268; x_wconf 96'><strong>is</strong></span> <span class='ocrx_word' id='word_1_368' title='bbox 1898 1226 2024 1279; x_wconf 96'><strong>likely</strong></span> <span class='ocrx_word' id='word_1_369' title='bbox 2049 1226 2217 1282; x_wconf 96'><strong>enough</strong></span> <span class='ocrx_word' id='word_1_370' title='bbox 2241 1228 2325 1271; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_371' title='bbox 2354 1225 2396 1270; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_372' title='bbox 2423 1227 2492 1271; x_wconf 96'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_46' title="bbox 1381 1300 2490 1356; baseline 0 -11; x_size 57; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_373' title='bbox 1381 1300 1511 1355; x_wconf 96'><strong>rough</strong></span> <span class='ocrx_word' id='word_1_374' title='bbox 1543 1300 1769 1345; x_wconf 96'><strong>outhouses</strong></span> <span class='ocrx_word' id='word_1_375' title='bbox 1797 1301 1851 1344; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_376' title='bbox 1873 1314 1969 1346; x_wconf 96'><strong>some</strong></span> <span class='ocrx_word' id='word_1_377' title='bbox 1968 1301 2148 1345; x_wconf 96'><strong>tillers</strong></span> <span class='ocrx_word' id='word_1_378' title='bbox 2181 1300 2235 1344; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_379' title='bbox 2257 1303 2327 1345; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_380' title='bbox 2356 1300 2490 1356; x_wconf 96'><strong>heavy</strong></span>
</span>
<span class='ocr_line' id='line_1_47' title="bbox 1383 1375 2493 1431; baseline -0.002 -11; x_size 53; x_descenders 8; x_ascenders 14"><span class='ocrx_word' id='word_1_381' title='bbox 1383 1375 1497 1420; x_wconf 96'><strong>lands</strong></span> <span class='ocrx_word' id='word_1_382' title='bbox 1534 1376 1721 1431; x_wconf 96'><strong>adjacent</strong></span> <span class='ocrx_word' id='word_1_383' title='bbox 1758 1383 1800 1419; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_384' title='bbox 1834 1377 1960 1427; x_wconf 96'><strong>Paris,</strong></span> <span class='ocrx_word' id='word_1_385' title='bbox 1996 1375 2109 1420; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_386' title='bbox 2142 1388 2251 1419; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_387' title='bbox 2288 1375 2493 1420; x_wconf 96'><strong>sheltered</strong></span>
</span>
<span class='ocr_line' id='line_1_48' title="bbox 1381 1449 2488 1503; baseline 0.001 -9; x_size 55; x_descenders 10; x_ascenders 13"><span class='ocrx_word' id='word_1_388' title='bbox 1381 1450 1491 1494; x_wconf 96'><strong>from</strong></span> <span class='ocrx_word' id='word_1_389' title='bbox 1527 1449 1595 1494; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_390' title='bbox 1631 1451 1811 1494; x_wconf 95'><strong>weather</strong></span> <span class='ocrx_word' id='word_1_391' title='bbox 1848 1451 1932 1495; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_392' title='bbox 1969 1462 2069 1503; x_wconf 95'><strong>very</strong></span> <span class='ocrx_word' id='word_1_393' title='bbox 2103 1450 2195 1503; x_wconf 96'><strong>day,</strong></span> <span class='ocrx_word' id='word_1_394' title='bbox 2231 1452 2332 1495; x_wconf 91'><strong>rude</strong></span> <span class='ocrx_word' id='word_1_395' title='bbox 2370 1460 2488 1501; x_wconf 93'><strong>carts,</strong></span>
</span>
<span class='ocr_line' id='line_1_49' title="bbox 1379 1525 2489 1581; baseline 0 -12; x_size 59; x_descenders 14; x_ascenders 15"><span class='ocrx_word' id='word_1_396' title='bbox 1379 1525 1635 1581; x_wconf 92'><strong>bespattered</strong></span> <span class='ocrx_word' id='word_1_397' title='bbox 1664 1526 1764 1568; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_398' title='bbox 1792 1525 1915 1569; x_wconf 96'><strong>rustic</strong></span> <span class='ocrx_word' id='word_1_399' title='bbox 1943 1525 2059 1577; x_wconf 96'><strong>mire,</strong></span> <span class='ocrx_word' id='word_1_400' title='bbox 2089 1525 2256 1570; x_wconf 95'><strong>snuffed</strong></span> <span class='ocrx_word' id='word_1_401' title='bbox 2281 1527 2406 1570; x_wconf 95'><strong>about</strong></span> <span class='ocrx_word' id='word_1_402' title='bbox 2433 1527 2489 1581; x_wconf 96'><strong>by</strong></span>
</span>
<span class='ocr_line' id='line_1_50' title="bbox 1379 1599 2487 1656; baseline 0.002 -15; x_size 57; x_descenders 14; x_ascenders 13"><span class='ocrx_word' id='word_1_403' title='bbox 1379 1599 1487 1654; x_wconf 95'><strong>pigs,</strong></span> <span class='ocrx_word' id='word_1_404' title='bbox 1528 1601 1608 1644; x_wconf 92'><strong>and</strong></span> <span class='ocrx_word' id='word_1_405' title='bbox 1649 1602 1812 1644; x_wconf 92'><strong>roosted</strong></span> <span class='ocrx_word' id='word_1_406' title='bbox 1853 1601 1896 1642; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_407' title='bbox 1936 1602 1991 1656; x_wconf 96'><strong>by</strong></span> <span class='ocrx_word' id='word_1_408' title='bbox 2030 1600 2204 1654; x_wconf 92'><strong>poultry,</strong></span> <span class='ocrx_word' id='word_1_409' title='bbox 2245 1600 2380 1644; x_wconf 95'><strong>which</strong></span> <span class='ocrx_word' id='word_1_410' title='bbox 2420 1602 2487 1644; x_wconf 95'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_51' title="bbox 1380 1675 2490 1730; baseline 0.001 -13; x_size 54; x_descenders 10; x_ascenders 13"><span class='ocrx_word' id='word_1_411' title='bbox 1380 1675 1553 1724; x_wconf 96'><strong>Farmer,</strong></span> <span class='ocrx_word' id='word_1_412' title='bbox 1580 1676 1728 1727; x_wconf 96'><strong>Death,</strong></span> <span class='ocrx_word' id='word_1_413' title='bbox 1755 1675 1836 1719; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_414' title='bbox 1860 1675 2027 1730; x_wconf 96'><strong>already</strong></span> <span class='ocrx_word' id='word_1_415' title='bbox 2052 1684 2114 1719; x_wconf 96'><strong>set</strong></span> <span class='ocrx_word' id='word_1_416' title='bbox 2139 1684 2253 1728; x_wconf 95'><strong>apart</strong></span> <span class='ocrx_word' id='word_1_417' title='bbox 2277 1683 2320 1719; x_wconf 95'><strong>to</strong></span> <span class='ocrx_word' id='word_1_418' title='bbox 2347 1676 2399 1718; x_wconf 96'><strong>be</strong></span> <span class='ocrx_word' id='word_1_419' title='bbox 2423 1677 2490 1719; x_wconf 96'><strong>his</strong></span>
</span>
<span class='ocr_line' id='line_1_52' title="bbox 1379 1748 2489 1794; baseline 0.002 -2; x_size 57.08234; x_descenders 12.082339; x_ascenders 15"><span class='ocrx_word' id='word_1_420' title='bbox 1379 1749 1567 1793; x_wconf 91'><strong>tumbrils</strong></span> <span class='ocrx_word' id='word_1_421' title='bbox 1591 1750 1646 1793; x_wconf 95'><strong>of</strong></span> <span class='ocrx_word' id='word_1_422' title='bbox 1662 1748 1730 1793; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_423' title='bbox 1755 1749 2017 1794; x_wconf 96'><strong>Revolution.</strong></span> <span class='ocrx_word' id='word_1_424' title='bbox 2046 1752 2126 1794; x_wconf 96'><strong>But</strong></span> <span class='ocrx_word' id='word_1_425' title='bbox 2151 1749 2234 1794; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_426' title='bbox 2258 1749 2489 1794; x_wconf 96'><strong>Woodman</strong></span>
</span>
<span class='ocr_line' id='line_1_53' title="bbox 1382 1823 2487 1881; baseline 0.002 -14; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_427' title='bbox 1382 1823 1461 1867; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_428' title='bbox 1481 1825 1565 1868; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_429' title='bbox 1585 1826 1758 1876; x_wconf 96'><strong>Farmer,</strong></span> <span class='ocrx_word' id='word_1_430' title='bbox 1781 1824 1937 1880; x_wconf 96'><strong>though</strong></span> <span class='ocrx_word' id='word_1_431' title='bbox 1957 1826 2053 1879; x_wconf 96'><strong>they</strong></span> <span class='ocrx_word' id='word_1_432' title='bbox 2074 1824 2190 1868; x_wconf 93'><strong>work</strong></span> <span class='ocrx_word' id='word_1_433' title='bbox 2211 1825 2487 1881; x_wconf 89'><strong>unceasingly,</strong></span>
</span>
<span class='ocr_line' id='line_1_54' title="bbox 1380 1898 2489 1956; baseline 0.002 -14; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_434' title='bbox 1380 1901 1497 1943; x_wconf 96'><strong>work</strong></span> <span class='ocrx_word' id='word_1_435' title='bbox 1522 1898 1697 1954; x_wconf 96'><strong>silently,</strong></span> <span class='ocrx_word' id='word_1_436' title='bbox 1727 1899 1810 1943; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_437' title='bbox 1834 1913 1889 1943; x_wconf 96'><strong>no</strong></span> <span class='ocrx_word' id='word_1_438' title='bbox 1918 1911 1997 1944; x_wconf 96'><strong>one</strong></span> <span class='ocrx_word' id='word_1_439' title='bbox 2027 1900 2152 1944; x_wconf 96'><strong>heard</strong></span> <span class='ocrx_word' id='word_1_440' title='bbox 2180 1901 2290 1944; x_wconf 96'><strong>them</strong></span> <span class='ocrx_word' id='word_1_441' title='bbox 2318 1913 2364 1943; x_wconf 95'><strong>as</strong></span> <span class='ocrx_word' id='word_1_442' title='bbox 2393 1899 2489 1956; x_wconf 96'><strong>they</strong></span>
</span>
<span class='ocr_line' id='line_1_55' title="bbox 1379 1973 2491 2026; baseline 0.001 -9; x_size 52; x_descenders 8; x_ascenders 15"><span class='ocrx_word' id='word_1_443' title='bbox 1379 1980 1491 2017; x_wconf 95'><strong>went</strong></span> <span class='ocrx_word' id='word_1_444' title='bbox 1508 1974 1633 2018; x_wconf 96'><strong>about</strong></span> <span class='ocrx_word' id='word_1_445' title='bbox 1649 1973 1749 2018; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_446' title='bbox 1770 1974 1946 2018; x_wconf 96'><strong>muffled</strong></span> <span class='ocrx_word' id='word_1_447' title='bbox 1965 1974 2088 2018; x_wconf 96'><strong>tread:</strong></span> <span class='ocrx_word' id='word_1_448' title='bbox 2112 1975 2180 2018; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_449' title='bbox 2199 1975 2338 2026; x_wconf 93'><strong>rather,</strong></span> <span class='ocrx_word' id='word_1_450' title='bbox 2362 1975 2491 2018; x_wconf 92'><strong>foras-</strong></span>
</span>
<span class='ocr_line' id='line_1_56' title="bbox 1381 2048 2490 2106; baseline 0.002 -14; x_size 57; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_451' title='bbox 1381 2048 1502 2093; x_wconf 96'><strong>much</strong></span> <span class='ocrx_word' id='word_1_452' title='bbox 1536 2061 1582 2091; x_wconf 94'><strong>as</strong></span> <span class='ocrx_word' id='word_1_453' title='bbox 1614 2056 1657 2092; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_454' title='bbox 1690 2051 1886 2092; x_wconf 95'><strong>entertain</strong></span> <span class='ocrx_word' id='word_1_455' title='bbox 1919 2061 2001 2102; x_wconf 95'><strong>any</strong></span> <span class='ocrx_word' id='word_1_456' title='bbox 2032 2049 2245 2105; x_wconf 96'><strong>suspicion</strong></span> <span class='ocrx_word' id='word_1_457' title='bbox 2277 2049 2362 2093; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_458' title='bbox 2393 2049 2490 2106; x_wconf 96'><strong>they</strong></span>
</span>
<span class='ocr_line' id='line_1_57' title="bbox 1379 2122 2472 2175; baseline 0.001 -8; x_size 54; x_descenders 9; x_ascenders 13"><span class='ocrx_word' id='word_1_459' title='bbox 1379 2136 1488 2167; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_460' title='bbox 1504 2122 1660 2175; x_wconf 96'><strong>awake,</strong></span> <span class='ocrx_word' id='word_1_461' title='bbox 1675 2135 1764 2167; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_462' title='bbox 1779 2129 1822 2166; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_463' title='bbox 1837 2123 1889 2167; x_wconf 93'><strong>be</strong></span> <span class='ocrx_word' id='word_1_464' title='bbox 1904 2123 2130 2168; x_wconf 91'><strong>atheistical</strong></span> <span class='ocrx_word' id='word_1_465' title='bbox 2147 2123 2230 2168; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_466' title='bbox 2242 2123 2472 2168; x_wconf 95'><strong>traitorous.</strong></span>
</span>
</p>
<p class='ocr_par' id='par_1_5' lang='eng' title="bbox 1377 2210 2495 2864">
<span class='ocr_line' id='line_1_58' title="bbox 1436 2210 2495 2265; baseline 0.003 -13; x_size 58; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_467' title='bbox 1436 2211 1482 2253; x_wconf 96'><strong>In</strong></span> <span class='ocrx_word' id='word_1_468' title='bbox 1504 2210 1704 2265; x_wconf 96'><strong>England,</strong></span> <span class='ocrx_word' id='word_1_469' title='bbox 1728 2210 1841 2255; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_470' title='bbox 1862 2224 1950 2254; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_471' title='bbox 1970 2214 2157 2264; x_wconf 96'><strong>scarcely</strong></span> <span class='ocrx_word' id='word_1_472' title='bbox 2178 2223 2229 2253; x_wconf 96'><strong>an</strong></span> <span class='ocrx_word' id='word_1_473' title='bbox 2250 2219 2421 2256; x_wconf 96'><strong>amount</strong></span> <span class='ocrx_word' id='word_1_474' title='bbox 2441 2210 2495 2255; x_wconf 96'><strong>of</strong></span>
</span>
<span class='ocr_line' id='line_1_59' title="bbox 1380 2285 2486 2340; baseline 0.004 -14; x_size 57; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_475' title='bbox 1380 2286 1501 2329; x_wconf 95'><strong>order</strong></span> <span class='ocrx_word' id='word_1_476' title='bbox 1530 2285 1610 2328; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_477' title='bbox 1640 2286 1869 2338; x_wconf 96'><strong>protection</strong></span> <span class='ocrx_word' id='word_1_478' title='bbox 1901 2291 1944 2329; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_479' title='bbox 1970 2285 2122 2340; x_wconf 96'><strong>justify</strong></span> <span class='ocrx_word' id='word_1_480' title='bbox 2152 2288 2277 2329; x_wconf 95'><strong>much</strong></span> <span class='ocrx_word' id='word_1_481' title='bbox 2307 2285 2486 2330; x_wconf 95'><strong>national</strong></span>
</span>
<span class='ocr_line' id='line_1_60' title="bbox 1378 2359 2488 2416; baseline -0.001 -13; x_size 59; x_descenders 14; x_ascenders 15"><span class='ocrx_word' id='word_1_482' title='bbox 1378 2359 1580 2416; x_wconf 96'><strong>boasting.</strong></span> <span class='ocrx_word' id='word_1_483' title='bbox 1608 2360 1763 2414; x_wconf 96'><strong>Daring</strong></span> <span class='ocrx_word' id='word_1_484' title='bbox 1786 2359 2009 2414; x_wconf 96'><strong>burglaries</strong></span> <span class='ocrx_word' id='word_1_485' title='bbox 2033 2361 2087 2416; x_wconf 96'><strong>by</strong></span> <span class='ocrx_word' id='word_1_486' title='bbox 2112 2360 2251 2404; x_wconf 96'><strong>armed</strong></span> <span class='ocrx_word' id='word_1_487' title='bbox 2275 2373 2384 2409; x_wconf 96'><strong>men,</strong></span> <span class='ocrx_word' id='word_1_488' title='bbox 2408 2360 2488 2404; x_wconf 96'><strong>and</strong></span>
</span>
<span class='ocr_line' id='line_1_61' title="bbox 1378 2433 2487 2491; baseline 0.004 -16; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_489' title='bbox 1378 2433 1573 2491; x_wconf 95'><strong>highway</strong></span> <span class='ocrx_word' id='word_1_490' title='bbox 1607 2434 1832 2486; x_wconf 96'><strong>robberies,</strong></span> <span class='ocrx_word' id='word_1_491' title='bbox 1869 2436 1966 2479; x_wconf 95'><strong>took</strong></span> <span class='ocrx_word' id='word_1_492' title='bbox 2002 2436 2120 2488; x_wconf 96'><strong>place</strong></span> <span class='ocrx_word' id='word_1_493' title='bbox 2157 2437 2200 2478; x_wconf 95'><strong>in</strong></span> <span class='ocrx_word' id='word_1_494' title='bbox 2235 2435 2303 2479; x_wconf 95'><strong>the</strong></span> <span class='ocrx_word' id='word_1_495' title='bbox 2336 2435 2487 2491; x_wconf 96'><strong>capital</strong></span>
</span>
<span class='ocr_line' id='line_1_62' title="bbox 1380 2509 2488 2566; baseline 0.003 -15; x_size 56; x_descenders 13; x_ascenders 12"><span class='ocrx_word' id='word_1_496' title='bbox 1380 2509 1500 2553; x_wconf 96'><strong>itself</strong></span> <span class='ocrx_word' id='word_1_497' title='bbox 1518 2521 1642 2564; x_wconf 96'><strong>every</strong></span> <span class='ocrx_word' id='word_1_498' title='bbox 1672 2509 1802 2564; x_wconf 96'><strong>night;</strong></span> <span class='ocrx_word' id='word_1_499' title='bbox 1834 2510 2014 2554; x_wconf 95'><strong>families</strong></span> <span class='ocrx_word' id='word_1_500' title='bbox 2042 2522 2152 2553; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_501' title='bbox 2178 2510 2363 2566; x_wconf 93'><strong>publicly</strong></span> <span class='ocrx_word' id='word_1_502' title='bbox 2392 2522 2488 2554; x_wconf 89'><strong>cau-</strong></span>
</span>
<span class='ocr_line' id='line_1_63' title="bbox 1378 2583 2491 2640; baseline 0.004 -15; x_size 58; x_descenders 13; x_ascenders 15"><span class='ocrx_word' id='word_1_503' title='bbox 1378 2583 1520 2628; x_wconf 96'><strong>tioned</strong></span> <span class='ocrx_word' id='word_1_504' title='bbox 1541 2593 1613 2628; x_wconf 95'><strong>not</strong></span> <span class='ocrx_word' id='word_1_505' title='bbox 1636 2592 1679 2625; x_wconf 95'><strong>to</strong></span> <span class='ocrx_word' id='word_1_506' title='bbox 1704 2597 1758 2640; x_wconf 96'><strong>go</strong></span> <span class='ocrx_word' id='word_1_507' title='bbox 1782 2593 1854 2629; x_wconf 96'><strong>out</strong></span> <span class='ocrx_word' id='word_1_508' title='bbox 1875 2583 1928 2629; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_509' title='bbox 1944 2590 2054 2628; x_wconf 96'><strong>town</strong></span> <span class='ocrx_word' id='word_1_510' title='bbox 2078 2584 2251 2628; x_wconf 96'><strong>without</strong></span> <span class='ocrx_word' id='word_1_511' title='bbox 2274 2586 2491 2639; x_wconf 96'><strong>removing</strong></span>
</span>
<span class='ocr_line' id='line_1_64' title="bbox 1380 2658 2490 2714; baseline 0.002 -12; x_size 56; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_512' title='bbox 1380 2658 1484 2702; x_wconf 96'><strong>their</strong></span> <span class='ocrx_word' id='word_1_513' title='bbox 1514 2659 1710 2703; x_wconf 96'><strong>furniture</strong></span> <span class='ocrx_word' id='word_1_514' title='bbox 1739 2668 1782 2702; x_wconf 93'><strong>to</strong></span> <span class='ocrx_word' id='word_1_515' title='bbox 1814 2659 2097 2714; x_wconf 91'><strong>upholsterers&#39;</strong></span> <span class='ocrx_word' id='word_1_516' title='bbox 2131 2660 2394 2703; x_wconf 96'><strong>warehouses</strong></span> <span class='ocrx_word' id='word_1_517' title='bbox 2427 2661 2490 2704; x_wconf 96'><strong>for</strong></span>
</span>
<span class='ocr_line' id='line_1_65' title="bbox 1380 2733 2488 2789; baseline 0.003 -13; x_size 56; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_518' title='bbox 1380 2735 1571 2788; x_wconf 96'><strong>security;</strong></span> <span class='ocrx_word' id='word_1_519' title='bbox 1588 2735 1659 2777; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_520' title='bbox 1674 2733 1967 2789; x_wconf 95'><strong>highwayman</strong></span> <span class='ocrx_word' id='word_1_521' title='bbox 1984 2734 2026 2777; x_wconf 95'><strong>in</strong></span> <span class='ocrx_word' id='word_1_522' title='bbox 2045 2736 2113 2778; x_wconf 95'><strong>the</strong></span> <span class='ocrx_word' id='word_1_523' title='bbox 2130 2733 2230 2778; x_wconf 96'><strong>dark</strong></span> <span class='ocrx_word' id='word_1_524' title='bbox 2246 2747 2334 2778; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_525' title='bbox 2350 2747 2376 2776; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_526' title='bbox 2392 2736 2488 2789; x_wconf 96'><strong>City</strong></span>
</span>
<span class='ocr_line' id='line_1_66' title="bbox 1377 2807 2491 2864; baseline 0.001 -13; x_size 58; x_descenders 12; x_ascenders 16"><span class='ocrx_word' id='word_1_527' title='bbox 1377 2811 1612 2852; x_wconf 96'><strong>tradesman</strong></span> <span class='ocrx_word' id='word_1_528' title='bbox 1627 2809 1670 2851; x_wconf 95'><strong>in</strong></span> <span class='ocrx_word' id='word_1_529' title='bbox 1686 2811 1752 2853; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_530' title='bbox 1769 2808 1883 2862; x_wconf 96'><strong>light,</strong></span> <span class='ocrx_word' id='word_1_531' title='bbox 1899 2810 1991 2860; x_wconf 96'><strong>and,</strong></span> <span class='ocrx_word' id='word_1_532' title='bbox 2010 2807 2136 2864; x_wconf 96'><strong>being</strong></span> <span class='ocrx_word' id='word_1_533' title='bbox 2148 2809 2395 2864; x_wconf 96'><strong>recognised</strong></span> <span class='ocrx_word' id='word_1_534' title='bbox 2408 2810 2491 2854; x_wconf 96'><strong>and</strong></span>
</span>
</p>
</div>
</div>
</body>
</html>
@@ -1 +1,71 @@
with a plain face, on the throne of England;
there were a king with a large jaw and a queen
with a fair face, on the throne of France. In both
countries it was clearer than crystal to the lords
of the State preserves of loaves and fishes, that
things in general were settled for ever.
It was the year of Our Lord one thousand
seven hundred and seventy-five. Spiritual reve-
lations were conceded to England at that
favoured period, as at this, Mrs. Southcott had
recently attained her five-and-twentieth blessed
birthday, of whom a prophetic private in the Life
Guards had heralded the sublime appearance by
announcing that arrangements were made for the
swallowing up of London and Westminster.
Even the Cock-lane ghost had been laid only a
round dozen of years, after rapping out its mes-
sages, as the spirits of this very year last past
(supematurally deficient in originality) rapped
out theirs. Mere messages in the earthly order of
events had lately come to the English Crown and
People, from a congress of British subjects in
America: which, strange to relate, have proved
more important to the human race than any com-
munications yet received through any of the
chickens of the Cock-lane brood.
France, less favoured on the whole as to mat-
ters spiritual than her sister of the shield and tri-
dent, rolled with exceeding smoothness down
hill, making paper money and spending it. Under
the guidance of her Christian pastors, she enter-
tained herself, besides, with such humane
achievements as sentencing a youth to have his
hands cut off, his tongue torn out with pincers,
and his body burned alive, because he had not
kneeled down in the rain to do honour to a dirty
procession of monks which passed within his
view, at a distance of some fifty or sixty yards. It
is likely enough that, rooted in the woods of
France and Norway, there were growing trees,
when that sufferer was put to death, already
marked by the Woodman, Fate, to come down
and be sawn into boards, to make a certain mov-
able framework with a sack and a knife in it, ter-
rible in history. It is likely enough that in the
rough outhouses of some tillers of the heavy
lands adjacent to Paris, there were sheltered
from the weather that very day, rude carts,
bespattered with rustic mire, snuffed about by
pigs, and roosted in by poultry, which the
Farmer, Death, had already set apart to be his
tumbrils of the Revolution. But that Woodman
and that Farmer, though they work unceasingly,
work silently, and no one heard them as they
went about with muffled tread: the rather, foras-
much as to entertain any suspicion that they
were awake, was to be atheistical and traitorous.
In England, there was scarcely an amount of
order and protection to justify much national
boasting. Daring burglaries by armed men, and
highway robberies, took place in the capital
itself every night; families were publicly cau-
tioned not to go out of town without removing
their furniture to upholsterers' warehouses for
security; the highwayman in the dark was a City
tradesman in the light, and, being recognised and
@@ -1 +1,71 @@
with a plain face, on the throne of England;
there were a king with a large jaw and a queen
with a fair face, on the throne of France. In both
countries it was clearer than crystal to the lords
of the State preserves of loaves and fishes, that
things in general were settled for ever.
It was the year of Our Lord one thousand
seven hundred and seventy-five. Spiritual reve-
lations were conceded to England at that
favoured period, as at this. Mrs. Southcott had
recently attained her five-and-twentieth blessed
birthday, of whom a prophetic private in the Life
Guards had heralded the sublime appearance by
announcing that arrangements were made for the
swallowing up of London and Westminster.
Even the Cock-lane ghost had been laid only a
round dozen of years, after rapping out its mes-
sages, as the spirits of this very year last past
(supernaturally deficient in originality) rapped
out theirs. Mere messages in the earthly order of
events had lately come to the English Crown and
People, from a congress of British subjects in
America: which, strange to relate, have proved
more important to the human race than any com-
munications yet received through any of the
chickens of the Cock-lane brood.
France, less favoured on the whole as to mat-
ters spiritual than her sister of the shield and tri-
dent, rolled with exceeding smoothness down
hill, making paper money and spending it. Under
the guidance of her Christian pastors, she enter-
tained herself, besides, with such humane
achievements as sentencing a youth to have his
hands cut off, his tongue torn out with pincers,
and his body burned alive, because he had not
kneeled down in the rain to do honour to a dirty
procession of monks which passed within his
view, at a distance of some fifty or sixty yards. It
is likely enough that, rooted in the woods of
France and Norway, there were growing trees,
when that sufferer was put to death, already
marked by the Woodman, Fate, to come down
and be sawn into boards, to make a certain mov-
able framework with a sack and a knife in it, ter-
rible in history. It is likely enough that in the
rough outhouses of some tillers of the heavy
lands adjacent to Paris, there were sheltered
from the weather that very day, rude carts,
bespattered with rustic mire, snuffed about by
pigs, and roosted in by poultry, which the
Farmer, Death, had already set apart to be his
tumbrils of the Revolution. But that Woodman
and that Farmer, though they work unceasingly,
work silently, and no one heard them as they
went about with muffled tread: the rather, foras-
much as to entertain any suspicion that they
were awake, was to be atheistical and traitorous.
In England, there was scarcely an amount of
order and protection to justify much national
boasting. Daring burglaries by armed men, and
highway robberies, took place in the capital
itself every night; families were publicly cau-
tioned not to go out of town without removing
their furniture to upholsterers' warehouses for
security; the highwayman in the dark was a City
tradesman in the light, and, being recognised and
@@ -9,7 +9,159 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.ksa5wt_o/000006.ocr.png"; bbox 0 0 3300 2550; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.3e7kb0k7/000006.ocr.png"; bbox 0 0 3300 2550; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 439 20 1559 450">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 439 20 1559 450">
<span class='ocr_line' id='line_1_1' title="bbox 439 20 1556 74; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_1' title='bbox 439 20 541 62; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 571 34 596 62; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_3' title='bbox 625 20 741 74; x_wconf 96'><strong>plain</strong></span> <span class='ocrx_word' id='word_1_4' title='bbox 772 20 878 70; x_wconf 96'><strong>face,</strong></span> <span class='ocrx_word' id='word_1_5' title='bbox 911 34 968 62; x_wconf 96'><strong>on</strong></span> <span class='ocrx_word' id='word_1_6' title='bbox 997 20 1068 62; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_7' title='bbox 1098 20 1243 62; x_wconf 96'><strong>throne</strong></span> <span class='ocrx_word' id='word_1_8' title='bbox 1275 20 1329 62; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_9' title='bbox 1352 20 1556 74; x_wconf 96'><strong>England;</strong></span>
</span>
<span class='ocr_line' id='line_1_2' title="bbox 439 95 1557 149; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_10' title='bbox 439 95 553 137; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_11' title='bbox 572 109 683 137; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_12' title='bbox 704 109 730 137; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_13' title='bbox 748 95 851 149; x_wconf 96'><strong>king</strong></span> <span class='ocrx_word' id='word_1_14' title='bbox 870 95 972 137; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_15' title='bbox 992 109 1018 137; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_16' title='bbox 1039 95 1150 149; x_wconf 96'><strong>large</strong></span> <span class='ocrx_word' id='word_1_17' title='bbox 1165 95 1253 149; x_wconf 96'><strong>jaw</strong></span> <span class='ocrx_word' id='word_1_18' title='bbox 1273 95 1356 137; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_19' title='bbox 1376 109 1402 137; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_20' title='bbox 1422 109 1557 149; x_wconf 95'><strong>queen</strong></span>
</span>
<span class='ocr_line' id='line_1_3' title="bbox 439 171 1557 221; baseline 0 -9; x_size 50; x_descenders 9; x_ascenders 13"><span class='ocrx_word' id='word_1_21' title='bbox 439 171 541 212; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_22' title='bbox 557 184 582 212; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_23' title='bbox 599 171 679 212; x_wconf 96'><strong>fair</strong></span> <span class='ocrx_word' id='word_1_24' title='bbox 695 171 801 221; x_wconf 95'><strong>face,</strong></span> <span class='ocrx_word' id='word_1_25' title='bbox 820 184 877 212; x_wconf 95'><strong>on</strong></span> <span class='ocrx_word' id='word_1_26' title='bbox 893 171 962 212; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_27' title='bbox 978 171 1125 212; x_wconf 96'><strong>throne</strong></span> <span class='ocrx_word' id='word_1_28' title='bbox 1142 171 1196 212; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_29' title='bbox 1205 173 1372 212; x_wconf 95'><strong>France.</strong></span> <span class='ocrx_word' id='word_1_30' title='bbox 1391 173 1439 212; x_wconf 95'><strong>In</strong></span> <span class='ocrx_word' id='word_1_31' title='bbox 1454 171 1557 212; x_wconf 96'><strong>both</strong></span>
</span>
<span class='ocr_line' id='line_1_4' title="bbox 440 246 1556 299; baseline -0.001 -11; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_32' title='bbox 440 246 647 288; x_wconf 96'><strong>countries</strong></span> <span class='ocrx_word' id='word_1_33' title='bbox 668 246 700 287; x_wconf 96'><strong>it</strong></span> <span class='ocrx_word' id='word_1_34' title='bbox 717 260 806 288; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_35' title='bbox 827 246 983 288; x_wconf 96'><strong>clearer</strong></span> <span class='ocrx_word' id='word_1_36' title='bbox 1000 246 1100 287; x_wconf 95'><strong>than</strong></span> <span class='ocrx_word' id='word_1_37' title='bbox 1120 246 1271 299; x_wconf 95'><strong>crystal</strong></span> <span class='ocrx_word' id='word_1_38' title='bbox 1289 252 1334 288; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_39' title='bbox 1353 246 1424 288; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_40' title='bbox 1445 246 1556 288; x_wconf 96'><strong>lords</strong></span>
</span>
<span class='ocr_line' id='line_1_5' title="bbox 440 321 1559 375; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_41' title='bbox 440 321 494 363; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_42' title='bbox 506 321 576 363; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_43' title='bbox 599 322 710 363; x_wconf 96'><strong>State</strong></span> <span class='ocrx_word' id='word_1_44' title='bbox 730 335 946 375; x_wconf 96'><strong>preserves</strong></span> <span class='ocrx_word' id='word_1_45' title='bbox 968 321 1022 363; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_46' title='bbox 1037 321 1180 363; x_wconf 96'><strong>loaves</strong></span> <span class='ocrx_word' id='word_1_47' title='bbox 1202 321 1285 363; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_48' title='bbox 1305 321 1450 372; x_wconf 96'><strong>fishes,</strong></span> <span class='ocrx_word' id='word_1_49' title='bbox 1471 321 1559 363; x_wconf 97'><strong>that</strong></span>
</span>
<span class='ocr_line' id='line_1_6' title="bbox 439 396 1308 450; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_50' title='bbox 439 397 578 450; x_wconf 96'><strong>things</strong></span> <span class='ocrx_word' id='word_1_51' title='bbox 593 397 637 438; x_wconf 97'><strong>in</strong></span> <span class='ocrx_word' id='word_1_52' title='bbox 651 397 818 450; x_wconf 96'><strong>general</strong></span> <span class='ocrx_word' id='word_1_53' title='bbox 832 410 920 438; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_54' title='bbox 919 397 1108 438; x_wconf 96'><strong>settled</strong></span> <span class='ocrx_word' id='word_1_55' title='bbox 1122 396 1188 438; x_wconf 96'><strong>for</strong></span> <span class='ocrx_word' id='word_1_56' title='bbox 1202 410 1308 438; x_wconf 96'><strong>ever.</strong></span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_2' title="bbox 438 486 1565 1959">
<p class='ocr_par' id='par_1_2' lang='eng' title="bbox 438 486 1565 1959">
<span class='ocr_line' id='line_1_7' title="bbox 496 486 1558 540; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_57' title='bbox 496 488 531 528; x_wconf 96'><strong>It</strong></span> <span class='ocrx_word' id='word_1_58' title='bbox 559 500 647 528; x_wconf 95'><strong>was</strong></span> <span class='ocrx_word' id='word_1_59' title='bbox 677 486 746 528; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_60' title='bbox 775 500 876 540; x_wconf 96'><strong>year</strong></span> <span class='ocrx_word' id='word_1_61' title='bbox 905 486 959 528; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_62' title='bbox 981 487 1071 528; x_wconf 96'><strong>Our</strong></span> <span class='ocrx_word' id='word_1_63' title='bbox 1099 486 1211 528; x_wconf 96'><strong>Lord</strong></span> <span class='ocrx_word' id='word_1_64' title='bbox 1240 500 1321 528; x_wconf 96'><strong>one</strong></span> <span class='ocrx_word' id='word_1_65' title='bbox 1350 486 1558 528; x_wconf 96'><strong>thousand</strong></span>
</span>
<span class='ocr_line' id='line_1_8' title="bbox 441 561 1555 615; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_66' title='bbox 441 575 569 603; x_wconf 96'><strong>seven</strong></span> <span class='ocrx_word' id='word_1_67' title='bbox 590 561 778 603; x_wconf 96'><strong>hundred</strong></span> <span class='ocrx_word' id='word_1_68' title='bbox 800 561 883 603; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_69' title='bbox 905 561 1197 615; x_wconf 96'><strong>seventy-five.</strong></span> <span class='ocrx_word' id='word_1_70' title='bbox 1224 561 1418 615; x_wconf 93'><strong>Spiritual</strong></span> <span class='ocrx_word' id='word_1_71' title='bbox 1438 575 1555 603; x_wconf 92'><strong>reve-</strong></span>
</span>
<span class='ocr_line' id='line_1_9' title="bbox 440 637 1557 690; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_72' title='bbox 440 637 590 678; x_wconf 95'><strong>lations</strong></span> <span class='ocrx_word' id='word_1_73' title='bbox 636 650 747 678; x_wconf 95'><strong>were</strong></span> <span class='ocrx_word' id='word_1_74' title='bbox 795 637 1010 678; x_wconf 96'><strong>conceded</strong></span> <span class='ocrx_word' id='word_1_75' title='bbox 1055 643 1100 678; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_76' title='bbox 1147 637 1338 690; x_wconf 96'><strong>England</strong></span> <span class='ocrx_word' id='word_1_77' title='bbox 1384 643 1425 678; x_wconf 79'><strong>at</strong></span> <span class='ocrx_word' id='word_1_78' title='bbox 1470 637 1557 678; x_wconf 79'><strong>that</strong></span>
</span>
<span class='ocr_line' id='line_1_10' title="bbox 441 712 1559 766; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_79' title='bbox 441 712 643 754; x_wconf 96'><strong>favoured</strong></span> <span class='ocrx_word' id='word_1_80' title='bbox 664 712 823 766; x_wconf 96'><strong>period,</strong></span> <span class='ocrx_word' id='word_1_81' title='bbox 849 726 895 754; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_82' title='bbox 920 718 962 754; x_wconf 96'><strong>at</strong></span> <span class='ocrx_word' id='word_1_83' title='bbox 983 712 1078 754; x_wconf 96'><strong>this.</strong></span> <span class='ocrx_word' id='word_1_84' title='bbox 1103 714 1207 754; x_wconf 93'><strong>Mrs.</strong></span> <span class='ocrx_word' id='word_1_85' title='bbox 1236 712 1453 754; x_wconf 92'><strong>Southcott</strong></span> <span class='ocrx_word' id='word_1_86' title='bbox 1475 712 1559 754; x_wconf 96'><strong>had</strong></span>
</span>
<span class='ocr_line' id='line_1_11' title="bbox 439 787 1559 841; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_87' title='bbox 439 787 623 841; x_wconf 96'><strong>recently</strong></span> <span class='ocrx_word' id='word_1_88' title='bbox 646 787 827 829; x_wconf 96'><strong>attained</strong></span> <span class='ocrx_word' id='word_1_89' title='bbox 849 787 924 829; x_wconf 93'><strong>her</strong></span> <span class='ocrx_word' id='word_1_90' title='bbox 947 787 1367 829; x_wconf 91'><strong>five-and-twentieth</strong></span> <span class='ocrx_word' id='word_1_91' title='bbox 1389 787 1559 829; x_wconf 96'><strong>blessed</strong></span>
</span>
<span class='ocr_line' id='line_1_12' title="bbox 438 863 1556 916; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_92' title='bbox 438 863 637 916; x_wconf 96'><strong>birthday,</strong></span> <span class='ocrx_word' id='word_1_93' title='bbox 655 863 708 904; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_94' title='bbox 716 863 860 904; x_wconf 96'><strong>whom</strong></span> <span class='ocrx_word' id='word_1_95' title='bbox 874 876 900 904; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_96' title='bbox 913 863 1129 916; x_wconf 96'><strong>prophetic</strong></span> <span class='ocrx_word' id='word_1_97' title='bbox 1143 863 1302 916; x_wconf 96'><strong>private</strong></span> <span class='ocrx_word' id='word_1_98' title='bbox 1318 863 1363 904; x_wconf 95'><strong>in</strong></span> <span class='ocrx_word' id='word_1_99' title='bbox 1377 863 1446 904; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_100' title='bbox 1462 863 1556 904; x_wconf 96'><strong>Life</strong></span>
</span>
<span class='ocr_line' id='line_1_13' title="bbox 440 938 1557 991; baseline 0 -11; x_size 53; x_descenders 11; x_ascenders 13"><span class='ocrx_word' id='word_1_101' title='bbox 440 938 602 980; x_wconf 96'><strong>Guards</strong></span> <span class='ocrx_word' id='word_1_102' title='bbox 622 938 705 980; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_103' title='bbox 723 938 921 980; x_wconf 96'><strong>heralded</strong></span> <span class='ocrx_word' id='word_1_104' title='bbox 937 938 1006 980; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_105' title='bbox 1028 938 1206 980; x_wconf 96'><strong>sublime</strong></span> <span class='ocrx_word' id='word_1_106' title='bbox 1225 951 1481 991; x_wconf 96'><strong>appearance</strong></span> <span class='ocrx_word' id='word_1_107' title='bbox 1499 938 1557 991; x_wconf 96'><strong>by</strong></span>
</span>
<span class='ocr_line' id='line_1_14' title="bbox 440 1013 1556 1067; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_108' title='bbox 440 1013 705 1067; x_wconf 96'><strong>announcing</strong></span> <span class='ocrx_word' id='word_1_109' title='bbox 718 1013 806 1055; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_110' title='bbox 820 1019 1126 1067; x_wconf 95'><strong>arrangements</strong></span> <span class='ocrx_word' id='word_1_111' title='bbox 1141 1027 1252 1055; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_112' title='bbox 1267 1013 1390 1055; x_wconf 96'><strong>made</strong></span> <span class='ocrx_word' id='word_1_113' title='bbox 1407 1013 1473 1055; x_wconf 96'><strong>for</strong></span> <span class='ocrx_word' id='word_1_114' title='bbox 1487 1013 1556 1055; x_wconf 96'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_15' title="bbox 441 1088 1555 1142; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_115' title='bbox 441 1088 702 1142; x_wconf 95'><strong>swallowing</strong></span> <span class='ocrx_word' id='word_1_116' title='bbox 740 1102 798 1142; x_wconf 95'><strong>up</strong></span> <span class='ocrx_word' id='word_1_117' title='bbox 838 1088 891 1130; x_wconf 95'><strong>of</strong></span> <span class='ocrx_word' id='word_1_118' title='bbox 925 1088 1103 1130; x_wconf 96'><strong>London</strong></span> <span class='ocrx_word' id='word_1_119' title='bbox 1142 1088 1225 1130; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_120' title='bbox 1262 1088 1555 1130; x_wconf 96'><strong>Westminster.</strong></span>
</span>
<span class='ocr_line' id='line_1_16' title="bbox 439 1164 1559 1217; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_121' title='bbox 439 1166 557 1205; x_wconf 96'><strong>Even</strong></span> <span class='ocrx_word' id='word_1_122' title='bbox 577 1164 646 1205; x_wconf 93'><strong>the</strong></span> <span class='ocrx_word' id='word_1_123' title='bbox 669 1164 903 1206; x_wconf 91'><strong>Cock-lane</strong></span> <span class='ocrx_word' id='word_1_124' title='bbox 925 1164 1050 1217; x_wconf 96'><strong>ghost</strong></span> <span class='ocrx_word' id='word_1_125' title='bbox 1069 1164 1153 1205; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_126' title='bbox 1173 1164 1282 1205; x_wconf 96'><strong>been</strong></span> <span class='ocrx_word' id='word_1_127' title='bbox 1304 1164 1389 1205; x_wconf 96'><strong>laid</strong></span> <span class='ocrx_word' id='word_1_128' title='bbox 1410 1164 1512 1217; x_wconf 96'><strong>only</strong></span> <span class='ocrx_word' id='word_1_129' title='bbox 1534 1177 1559 1205; x_wconf 96'><strong>a</strong></span>
</span>
<span class='ocr_line' id='line_1_17' title="bbox 439 1239 1555 1293; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_130' title='bbox 439 1239 573 1281; x_wconf 96'><strong>round</strong></span> <span class='ocrx_word' id='word_1_131' title='bbox 591 1239 727 1281; x_wconf 96'><strong>dozen</strong></span> <span class='ocrx_word' id='word_1_132' title='bbox 746 1239 800 1281; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_133' title='bbox 811 1253 944 1293; x_wconf 96'><strong>years,</strong></span> <span class='ocrx_word' id='word_1_134' title='bbox 966 1239 1071 1281; x_wconf 96'><strong>after</strong></span> <span class='ocrx_word' id='word_1_135' title='bbox 1088 1239 1263 1293; x_wconf 96'><strong>rapping</strong></span> <span class='ocrx_word' id='word_1_136' title='bbox 1281 1245 1355 1281; x_wconf 96'><strong>out</strong></span> <span class='ocrx_word' id='word_1_137' title='bbox 1373 1239 1425 1281; x_wconf 93'><strong>its</strong></span> <span class='ocrx_word' id='word_1_138' title='bbox 1445 1253 1555 1281; x_wconf 92'><strong>mes-</strong></span>
</span>
<span class='ocr_line' id='line_1_18' title="bbox 441 1314 1558 1368; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_139' title='bbox 441 1328 575 1368; x_wconf 96'><strong>sages,</strong></span> <span class='ocrx_word' id='word_1_140' title='bbox 602 1328 648 1356; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_141' title='bbox 673 1314 743 1356; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_142' title='bbox 769 1314 906 1368; x_wconf 96'><strong>spirits</strong></span> <span class='ocrx_word' id='word_1_143' title='bbox 933 1314 987 1356; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_144' title='bbox 1004 1314 1086 1356; x_wconf 96'><strong>this</strong></span> <span class='ocrx_word' id='word_1_145' title='bbox 1111 1328 1214 1368; x_wconf 96'><strong>very</strong></span> <span class='ocrx_word' id='word_1_146' title='bbox 1237 1328 1338 1368; x_wconf 96'><strong>year</strong></span> <span class='ocrx_word' id='word_1_147' title='bbox 1362 1314 1441 1356; x_wconf 96'><strong>last</strong></span> <span class='ocrx_word' id='word_1_148' title='bbox 1464 1320 1558 1368; x_wconf 96'><strong>past</strong></span>
</span>
<span class='ocr_line' id='line_1_19' title="bbox 440 1390 1558 1443; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_149' title='bbox 440 1390 784 1443; x_wconf 91'><strong>(supernaturally</strong></span> <span class='ocrx_word' id='word_1_150' title='bbox 813 1390 1014 1431; x_wconf 96'><strong>deficient</strong></span> <span class='ocrx_word' id='word_1_151' title='bbox 1042 1390 1087 1431; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_152' title='bbox 1116 1390 1371 1443; x_wconf 96'><strong>originality)</strong></span> <span class='ocrx_word' id='word_1_153' title='bbox 1401 1390 1558 1443; x_wconf 96'><strong>rapped</strong></span>
</span>
<span class='ocr_line' id='line_1_20' title="bbox 440 1465 1565 1519; baseline 0 -12; x_size 55; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_154' title='bbox 440 1471 513 1507; x_wconf 96'><strong>out</strong></span> <span class='ocrx_word' id='word_1_155' title='bbox 527 1465 665 1507; x_wconf 96'><strong>theirs.</strong></span> <span class='ocrx_word' id='word_1_156' title='bbox 684 1467 805 1507; x_wconf 96'><strong>Mere</strong></span> <span class='ocrx_word' id='word_1_157' title='bbox 821 1478 1014 1519; x_wconf 96'><strong>messages</strong></span> <span class='ocrx_word' id='word_1_158' title='bbox 1016 1465 1098 1507; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_159' title='bbox 1113 1465 1182 1507; x_wconf 95'><strong>the</strong></span> <span class='ocrx_word' id='word_1_160' title='bbox 1200 1465 1359 1519; x_wconf 96'><strong>earthly</strong></span> <span class='ocrx_word' id='word_1_161' title='bbox 1375 1465 1496 1507; x_wconf 96'><strong>order</strong></span> <span class='ocrx_word' id='word_1_162' title='bbox 1511 1465 1565 1507; x_wconf 96'><strong>of</strong></span>
</span>
<span class='ocr_line' id='line_1_21' title="bbox 440 1540 1559 1594; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_163' title='bbox 440 1546 584 1582; x_wconf 96'><strong>events</strong></span> <span class='ocrx_word' id='word_1_164' title='bbox 599 1540 683 1582; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_165' title='bbox 697 1540 822 1594; x_wconf 96'><strong>lately</strong></span> <span class='ocrx_word' id='word_1_166' title='bbox 838 1554 960 1582; x_wconf 96'><strong>come</strong></span> <span class='ocrx_word' id='word_1_167' title='bbox 974 1546 1019 1582; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_168' title='bbox 1033 1540 1102 1582; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_169' title='bbox 1118 1540 1292 1594; x_wconf 96'><strong>English</strong></span> <span class='ocrx_word' id='word_1_170' title='bbox 1307 1541 1461 1582; x_wconf 96'><strong>Crown</strong></span> <span class='ocrx_word' id='word_1_171' title='bbox 1477 1540 1559 1582; x_wconf 96'><strong>and</strong></span>
</span>
<span class='ocr_line' id='line_1_22' title="bbox 439 1616 1558 1669; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_172' title='bbox 439 1616 607 1669; x_wconf 95'><strong>People,</strong></span> <span class='ocrx_word' id='word_1_173' title='bbox 636 1616 746 1657; x_wconf 96'><strong>from</strong></span> <span class='ocrx_word' id='word_1_174' title='bbox 772 1629 797 1657; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_175' title='bbox 823 1629 1021 1669; x_wconf 96'><strong>congress</strong></span> <span class='ocrx_word' id='word_1_176' title='bbox 1048 1616 1102 1657; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_177' title='bbox 1122 1616 1278 1657; x_wconf 96'><strong>British</strong></span> <span class='ocrx_word' id='word_1_178' title='bbox 1305 1616 1486 1669; x_wconf 96'><strong>subjects</strong></span> <span class='ocrx_word' id='word_1_179' title='bbox 1513 1616 1558 1657; x_wconf 96'><strong>in</strong></span>
</span>
<span class='ocr_line' id='line_1_23' title="bbox 439 1691 1558 1744; baseline -0.001 -11; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_180' title='bbox 439 1691 647 1733; x_wconf 82'><strong>America:</strong></span> <span class='ocrx_word' id='word_1_181' title='bbox 673 1691 825 1741; x_wconf 96'><strong>which,</strong></span> <span class='ocrx_word' id='word_1_182' title='bbox 851 1697 1014 1744; x_wconf 96'><strong>strange</strong></span> <span class='ocrx_word' id='word_1_183' title='bbox 1036 1697 1081 1733; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_184' title='bbox 1103 1691 1243 1741; x_wconf 96'><strong>relate,</strong></span> <span class='ocrx_word' id='word_1_185' title='bbox 1267 1691 1375 1733; x_wconf 96'><strong>have</strong></span> <span class='ocrx_word' id='word_1_186' title='bbox 1397 1691 1558 1744; x_wconf 96'><strong>proved</strong></span>
</span>
<span class='ocr_line' id='line_1_24' title="bbox 439 1766 1556 1820; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_187' title='bbox 439 1780 556 1808; x_wconf 96'><strong>more</strong></span> <span class='ocrx_word' id='word_1_188' title='bbox 571 1766 793 1820; x_wconf 96'><strong>important</strong></span> <span class='ocrx_word' id='word_1_189' title='bbox 806 1772 851 1808; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_190' title='bbox 865 1766 935 1808; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_191' title='bbox 950 1766 1107 1808; x_wconf 96'><strong>human</strong></span> <span class='ocrx_word' id='word_1_192' title='bbox 1119 1780 1215 1808; x_wconf 95'><strong>race</strong></span> <span class='ocrx_word' id='word_1_193' title='bbox 1229 1766 1328 1808; x_wconf 96'><strong>than</strong></span> <span class='ocrx_word' id='word_1_194' title='bbox 1343 1780 1426 1820; x_wconf 93'><strong>any</strong></span> <span class='ocrx_word' id='word_1_195' title='bbox 1440 1780 1556 1808; x_wconf 92'><strong>com-</strong></span>
</span>
<span class='ocr_line' id='line_1_25' title="bbox 439 1841 1558 1895; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_196' title='bbox 439 1841 716 1883; x_wconf 96'><strong>munications</strong></span> <span class='ocrx_word' id='word_1_197' title='bbox 750 1848 822 1895; x_wconf 96'><strong>yet</strong></span> <span class='ocrx_word' id='word_1_198' title='bbox 854 1841 1048 1883; x_wconf 96'><strong>received</strong></span> <span class='ocrx_word' id='word_1_199' title='bbox 1080 1841 1258 1895; x_wconf 96'><strong>through</strong></span> <span class='ocrx_word' id='word_1_200' title='bbox 1291 1855 1374 1895; x_wconf 96'><strong>any</strong></span> <span class='ocrx_word' id='word_1_201' title='bbox 1407 1841 1461 1883; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_202' title='bbox 1488 1841 1558 1883; x_wconf 96'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_26' title="bbox 440 1917 1190 1959; baseline 0 -1; x_size 53.239323; x_descenders 12.239324; x_ascenders 13"><span class='ocrx_word' id='word_1_203' title='bbox 440 1917 617 1958; x_wconf 96'><strong>chickens</strong></span> <span class='ocrx_word' id='word_1_204' title='bbox 618 1917 706 1959; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_205' title='bbox 713 1917 784 1958; x_wconf 93'><strong>the</strong></span> <span class='ocrx_word' id='word_1_206' title='bbox 798 1917 1032 1959; x_wconf 92'><strong>Cock-lane</strong></span> <span class='ocrx_word' id='word_1_207' title='bbox 1046 1917 1190 1959; x_wconf 96'><strong>brood.</strong></span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_3' title="bbox 439 2006 1559 2512">
<p class='ocr_par' id='par_1_3' lang='eng' title="bbox 439 2006 1559 2512">
<span class='ocr_line' id='line_1_27' title="bbox 495 2006 1555 2056; baseline 0 -8; x_size 50; x_descenders 8; x_ascenders 14"><span class='ocrx_word' id='word_1_208' title='bbox 495 2008 663 2056; x_wconf 96'><strong>France,</strong></span> <span class='ocrx_word' id='word_1_209' title='bbox 683 2006 767 2048; x_wconf 96'><strong>less</strong></span> <span class='ocrx_word' id='word_1_210' title='bbox 787 2006 989 2048; x_wconf 96'><strong>favoured</strong></span> <span class='ocrx_word' id='word_1_211' title='bbox 1005 2020 1062 2048; x_wconf 96'><strong>on</strong></span> <span class='ocrx_word' id='word_1_212' title='bbox 1080 2006 1149 2048; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_213' title='bbox 1167 2006 1307 2048; x_wconf 96'><strong>whole</strong></span> <span class='ocrx_word' id='word_1_214' title='bbox 1325 2020 1371 2048; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_215' title='bbox 1389 2012 1434 2048; x_wconf 93'><strong>to</strong></span> <span class='ocrx_word' id='word_1_216' title='bbox 1451 2012 1555 2048; x_wconf 90'><strong>mat-</strong></span>
</span>
<span class='ocr_line' id='line_1_28' title="bbox 439 2082 1555 2135; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_217' title='bbox 439 2088 521 2123; x_wconf 96'><strong>ters</strong></span> <span class='ocrx_word' id='word_1_218' title='bbox 539 2082 725 2135; x_wconf 96'><strong>spiritual</strong></span> <span class='ocrx_word' id='word_1_219' title='bbox 741 2082 841 2123; x_wconf 96'><strong>than</strong></span> <span class='ocrx_word' id='word_1_220' title='bbox 856 2082 931 2123; x_wconf 96'><strong>her</strong></span> <span class='ocrx_word' id='word_1_221' title='bbox 947 2082 1068 2123; x_wconf 96'><strong>sister</strong></span> <span class='ocrx_word' id='word_1_222' title='bbox 1084 2082 1138 2123; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_223' title='bbox 1148 2082 1217 2123; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_224' title='bbox 1236 2082 1373 2123; x_wconf 96'><strong>shield</strong></span> <span class='ocrx_word' id='word_1_225' title='bbox 1388 2095 1442 2123; x_wconf 93'><strong>and</strong></span> <span class='ocrx_word' id='word_1_226' title='bbox 1442 2082 1555 2123; x_wconf 91'><strong>tri-</strong></span>
</span>
<span class='ocr_line' id='line_1_29' title="bbox 440 2157 1558 2210; baseline 0 -11; x_size 53; x_descenders 11; x_ascenders 13"><span class='ocrx_word' id='word_1_227' title='bbox 440 2157 550 2207; x_wconf 96'><strong>dent,</strong></span> <span class='ocrx_word' id='word_1_228' title='bbox 580 2157 715 2199; x_wconf 95'><strong>rolled</strong></span> <span class='ocrx_word' id='word_1_229' title='bbox 742 2157 845 2199; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_230' title='bbox 876 2157 1106 2210; x_wconf 96'><strong>exceeding</strong></span> <span class='ocrx_word' id='word_1_231' title='bbox 1137 2157 1400 2199; x_wconf 96'><strong>smoothness</strong></span> <span class='ocrx_word' id='word_1_232' title='bbox 1431 2157 1558 2199; x_wconf 96'><strong>down</strong></span>
</span>
<span class='ocr_line' id='line_1_30' title="bbox 439 2232 1559 2286; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_233' title='bbox 439 2232 527 2282; x_wconf 96'><strong>hill,</strong></span> <span class='ocrx_word' id='word_1_234' title='bbox 542 2232 714 2286; x_wconf 96'><strong>making</strong></span> <span class='ocrx_word' id='word_1_235' title='bbox 727 2246 857 2286; x_wconf 96'><strong>paper</strong></span> <span class='ocrx_word' id='word_1_236' title='bbox 869 2246 995 2274; x_wconf 96'><strong>money</strong></span> <span class='ocrx_word' id='word_1_237' title='bbox 995 2246 1093 2286; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_238' title='bbox 1093 2232 1313 2286; x_wconf 96'><strong>spending</strong></span> <span class='ocrx_word' id='word_1_239' title='bbox 1313 2232 1398 2286; x_wconf 96'><strong>it.</strong></span> <span class='ocrx_word' id='word_1_240' title='bbox 1414 2232 1559 2274; x_wconf 96'><strong>Under</strong></span>
</span>
<span class='ocr_line' id='line_1_31' title="bbox 439 2307 1556 2361; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_241' title='bbox 439 2308 508 2349; x_wconf 95'><strong>the</strong></span> <span class='ocrx_word' id='word_1_242' title='bbox 527 2307 732 2361; x_wconf 95'><strong>guidance</strong></span> <span class='ocrx_word' id='word_1_243' title='bbox 752 2307 806 2349; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_244' title='bbox 817 2308 891 2349; x_wconf 96'><strong>her</strong></span> <span class='ocrx_word' id='word_1_245' title='bbox 909 2307 1119 2349; x_wconf 96'><strong>Christian</strong></span> <span class='ocrx_word' id='word_1_246' title='bbox 1135 2314 1311 2361; x_wconf 96'><strong>pastors,</strong></span> <span class='ocrx_word' id='word_1_247' title='bbox 1332 2308 1406 2349; x_wconf 93'><strong>she</strong></span> <span class='ocrx_word' id='word_1_248' title='bbox 1426 2314 1556 2349; x_wconf 92'><strong>enter-</strong></span>
</span>
<span class='ocr_line' id='line_1_32' title="bbox 439 2383 1557 2433; baseline 0.001 -9; x_size 50; x_descenders 9; x_ascenders 13"><span class='ocrx_word' id='word_1_249' title='bbox 439 2383 579 2425; x_wconf 96'><strong>tained</strong></span> <span class='ocrx_word' id='word_1_250' title='bbox 626 2383 794 2433; x_wconf 96'><strong>herself,</strong></span> <span class='ocrx_word' id='word_1_251' title='bbox 843 2383 1025 2433; x_wconf 96'><strong>besides,</strong></span> <span class='ocrx_word' id='word_1_252' title='bbox 1073 2383 1176 2424; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_253' title='bbox 1226 2383 1329 2425; x_wconf 96'><strong>such</strong></span> <span class='ocrx_word' id='word_1_254' title='bbox 1377 2383 1557 2425; x_wconf 96'><strong>humane</strong></span>
</span>
<span class='ocr_line' id='line_1_33' title="bbox 440 2458 1557 2512; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_255' title='bbox 440 2458 747 2500; x_wconf 96'><strong>achievements</strong></span> <span class='ocrx_word' id='word_1_256' title='bbox 770 2472 816 2500; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_257' title='bbox 839 2458 1082 2512; x_wconf 96'><strong>sentencing</strong></span> <span class='ocrx_word' id='word_1_258' title='bbox 1102 2472 1128 2500; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_259' title='bbox 1147 2458 1278 2512; x_wconf 95'><strong>youth</strong></span> <span class='ocrx_word' id='word_1_260' title='bbox 1297 2464 1342 2500; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_261' title='bbox 1363 2458 1470 2500; x_wconf 96'><strong>have</strong></span> <span class='ocrx_word' id='word_1_262' title='bbox 1491 2458 1557 2500; x_wconf 95'><strong>his</strong></span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_4' title="bbox 1757 18 2883 1800">
<p class='ocr_par' id='par_1_4' lang='eng' title="bbox 1757 18 2883 1800">
<span class='ocr_line' id='line_1_34' title="bbox 1757 18 2873 72; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_263' title='bbox 1757 18 1889 60; x_wconf 96'><strong>hands</strong></span> <span class='ocrx_word' id='word_1_264' title='bbox 1912 24 1982 60; x_wconf 96'><strong>cut</strong></span> <span class='ocrx_word' id='word_1_265' title='bbox 2003 18 2080 68; x_wconf 96'><strong>off,</strong></span> <span class='ocrx_word' id='word_1_266' title='bbox 2102 18 2169 60; x_wconf 96'><strong>his</strong></span> <span class='ocrx_word' id='word_1_267' title='bbox 2190 24 2345 72; x_wconf 96'><strong>tongue</strong></span> <span class='ocrx_word' id='word_1_268' title='bbox 2366 24 2460 60; x_wconf 96'><strong>torn</strong></span> <span class='ocrx_word' id='word_1_269' title='bbox 2480 24 2553 60; x_wconf 96'><strong>out</strong></span> <span class='ocrx_word' id='word_1_270' title='bbox 2573 18 2675 60; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_271' title='bbox 2695 18 2873 72; x_wconf 96'><strong>pincers,</strong></span>
</span>
<span class='ocr_line' id='line_1_35' title="bbox 1758 93 2877 147; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_272' title='bbox 1758 93 1841 135; x_wconf 95'><strong>and</strong></span> <span class='ocrx_word' id='word_1_273' title='bbox 1862 93 1928 135; x_wconf 95'><strong>his</strong></span> <span class='ocrx_word' id='word_1_274' title='bbox 1951 93 2067 147; x_wconf 96'><strong>body</strong></span> <span class='ocrx_word' id='word_1_275' title='bbox 2088 93 2218 135; x_wconf 95'><strong>burned</strong></span> <span class='ocrx_word' id='word_1_276' title='bbox 2219 93 2393 144; x_wconf 96'><strong>alive,</strong></span> <span class='ocrx_word' id='word_1_277' title='bbox 2417 93 2598 135; x_wconf 96'><strong>because</strong></span> <span class='ocrx_word' id='word_1_278' title='bbox 2620 93 2674 135; x_wconf 96'><strong>he</strong></span> <span class='ocrx_word' id='word_1_279' title='bbox 2698 93 2781 135; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_280' title='bbox 2802 99 2877 135; x_wconf 96'><strong>not</strong></span>
</span>
<span class='ocr_line' id='line_1_36' title="bbox 1757 169 2877 222; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_281' title='bbox 1757 169 1936 210; x_wconf 95'><strong>kneeled</strong></span> <span class='ocrx_word' id='word_1_282' title='bbox 1953 169 2079 210; x_wconf 96'><strong>down</strong></span> <span class='ocrx_word' id='word_1_283' title='bbox 2096 169 2141 210; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_284' title='bbox 2157 169 2226 210; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_285' title='bbox 2244 169 2334 210; x_wconf 96'><strong>rain</strong></span> <span class='ocrx_word' id='word_1_286' title='bbox 2350 175 2394 210; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_287' title='bbox 2413 169 2469 210; x_wconf 96'><strong>do</strong></span> <span class='ocrx_word' id='word_1_288' title='bbox 2486 169 2650 210; x_wconf 96'><strong>honour</strong></span> <span class='ocrx_word' id='word_1_289' title='bbox 2664 175 2709 210; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_290' title='bbox 2727 182 2753 210; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_291' title='bbox 2770 169 2877 222; x_wconf 96'><strong>dirty</strong></span>
</span>
<span class='ocr_line' id='line_1_37' title="bbox 1757 244 2874 298; baseline 0 -12; x_size 55; x_descenders 13; x_ascenders 13"><span class='ocrx_word' id='word_1_292' title='bbox 1757 244 2002 298; x_wconf 96'><strong>procession</strong></span> <span class='ocrx_word' id='word_1_293' title='bbox 2030 244 2084 286; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_294' title='bbox 2105 244 2257 286; x_wconf 96'><strong>monks</strong></span> <span class='ocrx_word' id='word_1_295' title='bbox 2285 244 2426 286; x_wconf 96'><strong>which</strong></span> <span class='ocrx_word' id='word_1_296' title='bbox 2453 244 2607 298; x_wconf 96'><strong>passed</strong></span> <span class='ocrx_word' id='word_1_297' title='bbox 2633 244 2780 286; x_wconf 96'><strong>within</strong></span> <span class='ocrx_word' id='word_1_298' title='bbox 2808 244 2874 286; x_wconf 96'><strong>his</strong></span>
</span>
<span class='ocr_line' id='line_1_38' title="bbox 1757 319 2876 373; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_299' title='bbox 1757 319 1877 369; x_wconf 96'><strong>view,</strong></span> <span class='ocrx_word' id='word_1_300' title='bbox 1894 325 1935 361; x_wconf 96'><strong>at</strong></span> <span class='ocrx_word' id='word_1_301' title='bbox 1950 333 1976 361; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_302' title='bbox 1989 319 2175 361; x_wconf 96'><strong>distance</strong></span> <span class='ocrx_word' id='word_1_303' title='bbox 2191 319 2245 361; x_wconf 95'><strong>of</strong></span> <span class='ocrx_word' id='word_1_304' title='bbox 2254 333 2348 361; x_wconf 96'><strong>some</strong></span> <span class='ocrx_word' id='word_1_305' title='bbox 2348 319 2486 373; x_wconf 96'><strong>fifty</strong></span> <span class='ocrx_word' id='word_1_306' title='bbox 2501 333 2550 361; x_wconf 96'><strong>or</strong></span> <span class='ocrx_word' id='word_1_307' title='bbox 2564 319 2674 373; x_wconf 96'><strong>sixty</strong></span> <span class='ocrx_word' id='word_1_308' title='bbox 2687 319 2810 373; x_wconf 96'><strong>yards.</strong></span> <span class='ocrx_word' id='word_1_309' title='bbox 2814 321 2876 361; x_wconf 96'><strong>It</strong></span>
</span>
<span class='ocr_line' id='line_1_39' title="bbox 1759 394 2883 448; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_310' title='bbox 1759 394 1795 436; x_wconf 96'><strong>is</strong></span> <span class='ocrx_word' id='word_1_311' title='bbox 1825 394 1954 448; x_wconf 96'><strong>likely</strong></span> <span class='ocrx_word' id='word_1_312' title='bbox 1983 395 2151 448; x_wconf 96'><strong>enough</strong></span> <span class='ocrx_word' id='word_1_313' title='bbox 2177 395 2276 445; x_wconf 96'><strong>that,</strong></span> <span class='ocrx_word' id='word_1_314' title='bbox 2305 395 2453 436; x_wconf 96'><strong>rooted</strong></span> <span class='ocrx_word' id='word_1_315' title='bbox 2481 394 2526 436; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_316' title='bbox 2553 395 2622 436; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_317' title='bbox 2651 395 2800 436; x_wconf 96'><strong>woods</strong></span> <span class='ocrx_word' id='word_1_318' title='bbox 2829 394 2883 436; x_wconf 96'><strong>of</strong></span>
</span>
<span class='ocr_line' id='line_1_40' title="bbox 1758 470 2875 523; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_319' title='bbox 1758 472 1912 512; x_wconf 96'><strong>France</strong></span> <span class='ocrx_word' id='word_1_320' title='bbox 1939 470 2021 511; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_321' title='bbox 2043 472 2238 523; x_wconf 96'><strong>Norway,</strong></span> <span class='ocrx_word' id='word_1_322' title='bbox 2263 470 2378 511; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_323' title='bbox 2402 483 2513 511; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_324' title='bbox 2540 470 2701 523; x_wconf 96'><strong>growing</strong></span> <span class='ocrx_word' id='word_1_325' title='bbox 2701 476 2875 523; x_wconf 96'><strong>trees,</strong></span>
</span>
<span class='ocr_line' id='line_1_41' title="bbox 1757 545 2876 599; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_326' title='bbox 1757 545 1882 587; x_wconf 95'><strong>when</strong></span> <span class='ocrx_word' id='word_1_327' title='bbox 1912 545 1999 587; x_wconf 95'><strong>that</strong></span> <span class='ocrx_word' id='word_1_328' title='bbox 2031 545 2207 587; x_wconf 96'><strong>sufferer</strong></span> <span class='ocrx_word' id='word_1_329' title='bbox 2236 559 2326 587; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_330' title='bbox 2357 551 2432 599; x_wconf 96'><strong>put</strong></span> <span class='ocrx_word' id='word_1_331' title='bbox 2461 551 2506 587; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_332' title='bbox 2539 545 2674 595; x_wconf 96'><strong>death,</strong></span> <span class='ocrx_word' id='word_1_333' title='bbox 2708 545 2876 599; x_wconf 96'><strong>already</strong></span>
</span>
<span class='ocr_line' id='line_1_42' title="bbox 1757 620 2876 674; baseline 0 -12; x_size 51; x_descenders 9; x_ascenders 14"><span class='ocrx_word' id='word_1_334' title='bbox 1757 620 1929 662; x_wconf 96'><strong>marked</strong></span> <span class='ocrx_word' id='word_1_335' title='bbox 1951 620 2010 674; x_wconf 96'><strong>by</strong></span> <span class='ocrx_word' id='word_1_336' title='bbox 2032 620 2102 662; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_337' title='bbox 2126 620 2372 671; x_wconf 96'><strong>Woodman,</strong></span> <span class='ocrx_word' id='word_1_338' title='bbox 2397 622 2508 671; x_wconf 95'><strong>Fate,</strong></span> <span class='ocrx_word' id='word_1_339' title='bbox 2533 626 2577 662; x_wconf 95'><strong>to</strong></span> <span class='ocrx_word' id='word_1_340' title='bbox 2602 634 2725 662; x_wconf 96'><strong>come</strong></span> <span class='ocrx_word' id='word_1_341' title='bbox 2749 620 2876 662; x_wconf 96'><strong>down</strong></span>
</span>
<span class='ocr_line' id='line_1_43' title="bbox 1759 696 2875 746; baseline 0 -9; x_size 50; x_descenders 9; x_ascenders 13"><span class='ocrx_word' id='word_1_342' title='bbox 1759 696 1841 737; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_343' title='bbox 1855 696 1909 737; x_wconf 96'><strong>be</strong></span> <span class='ocrx_word' id='word_1_344' title='bbox 1926 709 2043 737; x_wconf 96'><strong>sawn</strong></span> <span class='ocrx_word' id='word_1_345' title='bbox 2059 696 2146 737; x_wconf 95'><strong>into</strong></span> <span class='ocrx_word' id='word_1_346' title='bbox 2162 696 2327 746; x_wconf 96'><strong>boards,</strong></span> <span class='ocrx_word' id='word_1_347' title='bbox 2343 702 2388 737; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_348' title='bbox 2404 696 2528 737; x_wconf 96'><strong>make</strong></span> <span class='ocrx_word' id='word_1_349' title='bbox 2544 709 2570 737; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_350' title='bbox 2586 696 2741 737; x_wconf 93'><strong>certain</strong></span> <span class='ocrx_word' id='word_1_351' title='bbox 2755 709 2875 737; x_wconf 92'><strong>mov-</strong></span>
</span>
<span class='ocr_line' id='line_1_44' title="bbox 1758 771 2875 821; baseline -0.001 -8; x_size 51; x_descenders 9; x_ascenders 14"><span class='ocrx_word' id='word_1_352' title='bbox 1758 771 1852 813; x_wconf 96'><strong>able</strong></span> <span class='ocrx_word' id='word_1_353' title='bbox 1869 771 2118 813; x_wconf 96'><strong>framework</strong></span> <span class='ocrx_word' id='word_1_354' title='bbox 2132 771 2235 813; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_355' title='bbox 2250 785 2275 813; x_wconf 96'><strong>a</strong></span> <span class='ocrx_word' id='word_1_356' title='bbox 2292 771 2392 813; x_wconf 95'><strong>sack</strong></span> <span class='ocrx_word' id='word_1_357' title='bbox 2407 771 2490 813; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_358' title='bbox 2504 785 2530 813; x_wconf 95'><strong>a</strong></span> <span class='ocrx_word' id='word_1_359' title='bbox 2544 771 2643 812; x_wconf 95'><strong>knife</strong></span> <span class='ocrx_word' id='word_1_360' title='bbox 2637 771 2722 813; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_361' title='bbox 2737 771 2781 821; x_wconf 93'><strong>it,</strong></span> <span class='ocrx_word' id='word_1_362' title='bbox 2797 777 2875 813; x_wconf 92'><strong>ter-</strong></span>
</span>
<span class='ocr_line' id='line_1_45' title="bbox 1757 846 2877 900; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_363' title='bbox 1757 846 1861 888; x_wconf 92'><strong>rible</strong></span> <span class='ocrx_word' id='word_1_364' title='bbox 1888 846 1933 888; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_365' title='bbox 1957 846 2124 900; x_wconf 96'><strong>history.</strong></span> <span class='ocrx_word' id='word_1_366' title='bbox 2153 848 2188 888; x_wconf 96'><strong>It</strong></span> <span class='ocrx_word' id='word_1_367' title='bbox 2213 846 2250 888; x_wconf 96'><strong>is</strong></span> <span class='ocrx_word' id='word_1_368' title='bbox 2278 846 2407 900; x_wconf 96'><strong>likely</strong></span> <span class='ocrx_word' id='word_1_369' title='bbox 2433 846 2601 900; x_wconf 96'><strong>enough</strong></span> <span class='ocrx_word' id='word_1_370' title='bbox 2625 846 2712 888; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_371' title='bbox 2737 846 2782 888; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_372' title='bbox 2806 846 2877 888; x_wconf 96'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_46' title="bbox 1757 922 2877 975; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_373' title='bbox 1757 922 1891 975; x_wconf 96'><strong>rough</strong></span> <span class='ocrx_word' id='word_1_374' title='bbox 1920 922 2147 963; x_wconf 96'><strong>outhouses</strong></span> <span class='ocrx_word' id='word_1_375' title='bbox 2178 922 2231 963; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_376' title='bbox 2256 935 2350 963; x_wconf 96'><strong>some</strong></span> <span class='ocrx_word' id='word_1_377' title='bbox 2351 922 2533 963; x_wconf 95'><strong>tillers</strong></span> <span class='ocrx_word' id='word_1_378' title='bbox 2564 922 2618 963; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_379' title='bbox 2641 922 2711 963; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_380' title='bbox 2740 922 2877 975; x_wconf 96'><strong>heavy</strong></span>
</span>
<span class='ocr_line' id='line_1_47' title="bbox 1759 997 2877 1050; baseline 0.001 -12; x_size 54; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_381' title='bbox 1759 997 1877 1039; x_wconf 96'><strong>lands</strong></span> <span class='ocrx_word' id='word_1_382' title='bbox 1912 997 2102 1050; x_wconf 96'><strong>adjacent</strong></span> <span class='ocrx_word' id='word_1_383' title='bbox 2136 1003 2180 1039; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_384' title='bbox 2215 997 2341 1047; x_wconf 96'><strong>Paris,</strong></span> <span class='ocrx_word' id='word_1_385' title='bbox 2376 997 2491 1039; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_386' title='bbox 2524 1010 2635 1039; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_387' title='bbox 2672 997 2877 1039; x_wconf 96'><strong>sheltered</strong></span>
</span>
<span class='ocr_line' id='line_1_48' title="bbox 1759 1072 2873 1126; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_388' title='bbox 1759 1072 1869 1114; x_wconf 96'><strong>from</strong></span> <span class='ocrx_word' id='word_1_389' title='bbox 1904 1072 1974 1114; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_390' title='bbox 2010 1072 2193 1114; x_wconf 95'><strong>weather</strong></span> <span class='ocrx_word' id='word_1_391' title='bbox 2226 1072 2314 1114; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_392' title='bbox 2348 1086 2450 1126; x_wconf 96'><strong>very</strong></span> <span class='ocrx_word' id='word_1_393' title='bbox 2487 1072 2577 1126; x_wconf 96'><strong>day,</strong></span> <span class='ocrx_word' id='word_1_394' title='bbox 2615 1072 2717 1114; x_wconf 96'><strong>rude</strong></span> <span class='ocrx_word' id='word_1_395' title='bbox 2754 1078 2873 1122; x_wconf 96'><strong>carts,</strong></span>
</span>
<span class='ocr_line' id='line_1_49' title="bbox 1757 1147 2876 1201; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_396' title='bbox 1757 1148 2018 1201; x_wconf 91'><strong>bespattered</strong></span> <span class='ocrx_word' id='word_1_397' title='bbox 2042 1147 2145 1189; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_398' title='bbox 2170 1147 2297 1189; x_wconf 96'><strong>rustic</strong></span> <span class='ocrx_word' id='word_1_399' title='bbox 2323 1147 2441 1198; x_wconf 96'><strong>mire,</strong></span> <span class='ocrx_word' id='word_1_400' title='bbox 2471 1147 2640 1189; x_wconf 96'><strong>snuffed</strong></span> <span class='ocrx_word' id='word_1_401' title='bbox 2666 1148 2794 1189; x_wconf 96'><strong>about</strong></span> <span class='ocrx_word' id='word_1_402' title='bbox 2817 1148 2876 1201; x_wconf 96'><strong>by</strong></span>
</span>
<span class='ocr_line' id='line_1_50' title="bbox 1757 1223 2875 1276; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_403' title='bbox 1757 1223 1865 1276; x_wconf 95'><strong>pigs,</strong></span> <span class='ocrx_word' id='word_1_404' title='bbox 1906 1223 1989 1264; x_wconf 93'><strong>and</strong></span> <span class='ocrx_word' id='word_1_405' title='bbox 2026 1223 2196 1265; x_wconf 92'><strong>roosted</strong></span> <span class='ocrx_word' id='word_1_406' title='bbox 2234 1223 2279 1264; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_407' title='bbox 2316 1223 2374 1276; x_wconf 96'><strong>by</strong></span> <span class='ocrx_word' id='word_1_408' title='bbox 2412 1223 2587 1276; x_wconf 96'><strong>poultry,</strong></span> <span class='ocrx_word' id='word_1_409' title='bbox 2626 1223 2767 1265; x_wconf 96'><strong>which</strong></span> <span class='ocrx_word' id='word_1_410' title='bbox 2804 1223 2875 1264; x_wconf 96'><strong>the</strong></span>
</span>
<span class='ocr_line' id='line_1_51' title="bbox 1758 1298 2874 1352; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_411' title='bbox 1758 1300 1932 1348; x_wconf 96'><strong>Farmer,</strong></span> <span class='ocrx_word' id='word_1_412' title='bbox 1958 1298 2107 1348; x_wconf 96'><strong>Death,</strong></span> <span class='ocrx_word' id='word_1_413' title='bbox 2134 1298 2218 1340; x_wconf 96'><strong>had</strong></span> <span class='ocrx_word' id='word_1_414' title='bbox 2242 1298 2410 1352; x_wconf 96'><strong>already</strong></span> <span class='ocrx_word' id='word_1_415' title='bbox 2435 1304 2499 1340; x_wconf 96'><strong>set</strong></span> <span class='ocrx_word' id='word_1_416' title='bbox 2523 1304 2637 1352; x_wconf 96'><strong>apart</strong></span> <span class='ocrx_word' id='word_1_417' title='bbox 2660 1304 2705 1340; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_418' title='bbox 2729 1298 2783 1340; x_wconf 96'><strong>be</strong></span> <span class='ocrx_word' id='word_1_419' title='bbox 2809 1298 2874 1340; x_wconf 96'><strong>his</strong></span>
</span>
<span class='ocr_line' id='line_1_52' title="bbox 1757 1373 2876 1415; baseline 0 0; x_size 54.160507; x_descenders 12.160509; x_ascenders 14"><span class='ocrx_word' id='word_1_420' title='bbox 1757 1373 1946 1415; x_wconf 92'><strong>tumbrils</strong></span> <span class='ocrx_word' id='word_1_421' title='bbox 1972 1373 2026 1415; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_422' title='bbox 2041 1373 2112 1415; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_423' title='bbox 2135 1373 2400 1415; x_wconf 95'><strong>Revolution.</strong></span> <span class='ocrx_word' id='word_1_424' title='bbox 2426 1375 2511 1415; x_wconf 96'><strong>But</strong></span> <span class='ocrx_word' id='word_1_425' title='bbox 2533 1373 2619 1415; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_426' title='bbox 2642 1373 2876 1415; x_wconf 96'><strong>Woodman</strong></span>
</span>
<span class='ocr_line' id='line_1_53' title="bbox 1759 1449 2875 1502; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_427' title='bbox 1759 1449 1841 1490; x_wconf 95'><strong>and</strong></span> <span class='ocrx_word' id='word_1_428' title='bbox 1859 1449 1946 1490; x_wconf 95'><strong>that</strong></span> <span class='ocrx_word' id='word_1_429' title='bbox 1964 1451 2139 1499; x_wconf 96'><strong>Farmer,</strong></span> <span class='ocrx_word' id='word_1_430' title='bbox 2160 1449 2319 1502; x_wconf 96'><strong>though</strong></span> <span class='ocrx_word' id='word_1_431' title='bbox 2338 1449 2438 1502; x_wconf 96'><strong>they</strong></span> <span class='ocrx_word' id='word_1_432' title='bbox 2455 1449 2575 1490; x_wconf 93'><strong>work</strong></span> <span class='ocrx_word' id='word_1_433' title='bbox 2592 1449 2875 1502; x_wconf 91'><strong>unceasingly,</strong></span>
</span>
<span class='ocr_line' id='line_1_54' title="bbox 1757 1524 2877 1578; baseline 0.001 -13; x_size 55; x_descenders 13; x_ascenders 14"><span class='ocrx_word' id='word_1_434' title='bbox 1757 1538 1848 1566; x_wconf 96'><strong>work</strong></span> <span class='ocrx_word' id='word_1_435' title='bbox 1846 1524 2078 1578; x_wconf 95'><strong>silently,</strong></span> <span class='ocrx_word' id='word_1_436' title='bbox 2107 1524 2190 1566; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_437' title='bbox 2215 1538 2272 1566; x_wconf 96'><strong>no</strong></span> <span class='ocrx_word' id='word_1_438' title='bbox 2301 1538 2382 1566; x_wconf 96'><strong>one</strong></span> <span class='ocrx_word' id='word_1_439' title='bbox 2409 1524 2536 1566; x_wconf 96'><strong>heard</strong></span> <span class='ocrx_word' id='word_1_440' title='bbox 2562 1524 2677 1566; x_wconf 96'><strong>them</strong></span> <span class='ocrx_word' id='word_1_441' title='bbox 2704 1538 2750 1566; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_442' title='bbox 2778 1524 2877 1578; x_wconf 96'><strong>they</strong></span>
</span>
<span class='ocr_line' id='line_1_55' title="bbox 1757 1599 2876 1650; baseline 0 -9; x_size 51; x_descenders 9; x_ascenders 14"><span class='ocrx_word' id='word_1_443' title='bbox 1757 1605 1870 1641; x_wconf 96'><strong>went</strong></span> <span class='ocrx_word' id='word_1_444' title='bbox 1887 1599 2014 1641; x_wconf 96'><strong>about</strong></span> <span class='ocrx_word' id='word_1_445' title='bbox 2030 1599 2132 1641; x_wconf 96'><strong>with</strong></span> <span class='ocrx_word' id='word_1_446' title='bbox 2149 1599 2330 1641; x_wconf 96'><strong>muffled</strong></span> <span class='ocrx_word' id='word_1_447' title='bbox 2346 1599 2472 1641; x_wconf 96'><strong>tread:</strong></span> <span class='ocrx_word' id='word_1_448' title='bbox 2493 1599 2563 1641; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_449' title='bbox 2580 1599 2724 1650; x_wconf 93'><strong>rather,</strong></span> <span class='ocrx_word' id='word_1_450' title='bbox 2745 1599 2876 1641; x_wconf 93'><strong>foras-</strong></span>
</span>
<span class='ocr_line' id='line_1_56' title="bbox 1757 1675 2877 1728; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_451' title='bbox 1757 1675 1885 1716; x_wconf 96'><strong>much</strong></span> <span class='ocrx_word' id='word_1_452' title='bbox 1916 1688 1962 1716; x_wconf 96'><strong>as</strong></span> <span class='ocrx_word' id='word_1_453' title='bbox 1993 1681 2038 1716; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_454' title='bbox 2071 1675 2271 1716; x_wconf 96'><strong>entertain</strong></span> <span class='ocrx_word' id='word_1_455' title='bbox 2301 1688 2383 1728; x_wconf 96'><strong>any</strong></span> <span class='ocrx_word' id='word_1_456' title='bbox 2416 1675 2631 1728; x_wconf 96'><strong>suspicion</strong></span> <span class='ocrx_word' id='word_1_457' title='bbox 2661 1675 2747 1716; x_wconf 96'><strong>that</strong></span> <span class='ocrx_word' id='word_1_458' title='bbox 2777 1675 2877 1728; x_wconf 96'><strong>they</strong></span>
</span>
<span class='ocr_line' id='line_1_57' title="bbox 1757 1750 2857 1800; baseline 0.001 -9; x_size 51; x_descenders 9; x_ascenders 14"><span class='ocrx_word' id='word_1_459' title='bbox 1757 1763 1867 1792; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_460' title='bbox 1883 1750 2027 1792; x_wconf 96'><strong>awake,</strong></span> <span class='ocrx_word' id='word_1_461' title='bbox 2029 1763 2124 1800; x_wconf 95'><strong>was</strong></span> <span class='ocrx_word' id='word_1_462' title='bbox 2125 1756 2203 1792; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_463' title='bbox 2217 1750 2271 1792; x_wconf 92'><strong>be</strong></span> <span class='ocrx_word' id='word_1_464' title='bbox 2287 1750 2517 1792; x_wconf 90'><strong>atheistical</strong></span> <span class='ocrx_word' id='word_1_465' title='bbox 2532 1750 2615 1792; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_466' title='bbox 2627 1750 2857 1792; x_wconf 96'><strong>traitorous.</strong></span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_5' title="bbox 1757 1837 2882 2493">
<p class='ocr_par' id='par_1_5' lang='eng' title="bbox 1757 1837 2882 2493">
<span class='ocr_line' id='line_1_58' title="bbox 1814 1837 2882 1891; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_467' title='bbox 1814 1839 1862 1879; x_wconf 96'><strong>In</strong></span> <span class='ocrx_word' id='word_1_468' title='bbox 1882 1837 2085 1891; x_wconf 96'><strong>England,</strong></span> <span class='ocrx_word' id='word_1_469' title='bbox 2107 1837 2221 1879; x_wconf 96'><strong>there</strong></span> <span class='ocrx_word' id='word_1_470' title='bbox 2242 1851 2330 1879; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_471' title='bbox 2354 1837 2540 1891; x_wconf 96'><strong>scarcely</strong></span> <span class='ocrx_word' id='word_1_472' title='bbox 2561 1851 2614 1879; x_wconf 96'><strong>an</strong></span> <span class='ocrx_word' id='word_1_473' title='bbox 2636 1843 2808 1879; x_wconf 96'><strong>amount</strong></span> <span class='ocrx_word' id='word_1_474' title='bbox 2828 1837 2882 1879; x_wconf 96'><strong>of</strong></span>
</span>
<span class='ocr_line' id='line_1_59' title="bbox 1758 1913 2876 1966; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_475' title='bbox 1758 1913 1879 1954; x_wconf 96'><strong>order</strong></span> <span class='ocrx_word' id='word_1_476' title='bbox 1909 1913 1992 1954; x_wconf 96'><strong>and</strong></span> <span class='ocrx_word' id='word_1_477' title='bbox 2020 1913 2253 1966; x_wconf 95'><strong>protection</strong></span> <span class='ocrx_word' id='word_1_478' title='bbox 2283 1919 2327 1954; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_479' title='bbox 2353 1913 2505 1966; x_wconf 96'><strong>justify</strong></span> <span class='ocrx_word' id='word_1_480' title='bbox 2535 1913 2662 1954; x_wconf 96'><strong>much</strong></span> <span class='ocrx_word' id='word_1_481' title='bbox 2692 1913 2876 1954; x_wconf 96'><strong>national</strong></span>
</span>
<span class='ocr_line' id='line_1_60' title="bbox 1757 1988 2877 2042; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_482' title='bbox 1757 1988 1962 2042; x_wconf 96'><strong>boasting.</strong></span> <span class='ocrx_word' id='word_1_483' title='bbox 1987 1988 2145 2042; x_wconf 96'><strong>Daring</strong></span> <span class='ocrx_word' id='word_1_484' title='bbox 2166 1988 2393 2042; x_wconf 96'><strong>burglaries</strong></span> <span class='ocrx_word' id='word_1_485' title='bbox 2415 1988 2474 2042; x_wconf 96'><strong>by</strong></span> <span class='ocrx_word' id='word_1_486' title='bbox 2495 1988 2638 2030; x_wconf 96'><strong>armed</strong></span> <span class='ocrx_word' id='word_1_487' title='bbox 2659 2002 2770 2038; x_wconf 96'><strong>men,</strong></span> <span class='ocrx_word' id='word_1_488' title='bbox 2794 1988 2877 2030; x_wconf 96'><strong>and</strong></span>
</span>
<span class='ocr_line' id='line_1_61' title="bbox 1758 2063 2875 2117; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_489' title='bbox 1758 2063 1954 2117; x_wconf 96'><strong>highway</strong></span> <span class='ocrx_word' id='word_1_490' title='bbox 1987 2063 2213 2114; x_wconf 96'><strong>robberies,</strong></span> <span class='ocrx_word' id='word_1_491' title='bbox 2249 2063 2351 2105; x_wconf 96'><strong>took</strong></span> <span class='ocrx_word' id='word_1_492' title='bbox 2383 2063 2505 2117; x_wconf 96'><strong>place</strong></span> <span class='ocrx_word' id='word_1_493' title='bbox 2540 2063 2585 2105; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_494' title='bbox 2618 2063 2688 2105; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_495' title='bbox 2723 2063 2875 2117; x_wconf 96'><strong>capital</strong></span>
</span>
<span class='ocr_line' id='line_1_62' title="bbox 1759 2139 2874 2192; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_496' title='bbox 1759 2139 1878 2180; x_wconf 96'><strong>itself</strong></span> <span class='ocrx_word' id='word_1_497' title='bbox 1900 2152 2026 2192; x_wconf 96'><strong>every</strong></span> <span class='ocrx_word' id='word_1_498' title='bbox 2052 2139 2184 2192; x_wconf 96'><strong>night;</strong></span> <span class='ocrx_word' id='word_1_499' title='bbox 2215 2139 2396 2180; x_wconf 95'><strong>families</strong></span> <span class='ocrx_word' id='word_1_500' title='bbox 2423 2152 2535 2180; x_wconf 96'><strong>were</strong></span> <span class='ocrx_word' id='word_1_501' title='bbox 2561 2139 2749 2192; x_wconf 93'><strong>publicly</strong></span> <span class='ocrx_word' id='word_1_502' title='bbox 2777 2152 2874 2180; x_wconf 92'><strong>cau-</strong></span>
</span>
<span class='ocr_line' id='line_1_63' title="bbox 1757 2214 2877 2267; baseline 0 -11; x_size 54; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_503' title='bbox 1757 2214 1901 2256; x_wconf 96'><strong>tioned</strong></span> <span class='ocrx_word' id='word_1_504' title='bbox 1921 2220 1996 2256; x_wconf 96'><strong>not</strong></span> <span class='ocrx_word' id='word_1_505' title='bbox 2016 2220 2061 2256; x_wconf 96'><strong>to</strong></span> <span class='ocrx_word' id='word_1_506' title='bbox 2083 2227 2139 2267; x_wconf 96'><strong>go</strong></span> <span class='ocrx_word' id='word_1_507' title='bbox 2162 2220 2236 2256; x_wconf 96'><strong>out</strong></span> <span class='ocrx_word' id='word_1_508' title='bbox 2257 2214 2311 2256; x_wconf 96'><strong>of</strong></span> <span class='ocrx_word' id='word_1_509' title='bbox 2325 2220 2440 2256; x_wconf 96'><strong>town</strong></span> <span class='ocrx_word' id='word_1_510' title='bbox 2460 2214 2637 2256; x_wconf 96'><strong>without</strong></span> <span class='ocrx_word' id='word_1_511' title='bbox 2657 2214 2877 2267; x_wconf 96'><strong>removing</strong></span>
</span>
<span class='ocr_line' id='line_1_64' title="bbox 1757 2289 2876 2343; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_512' title='bbox 1757 2289 1863 2331; x_wconf 96'><strong>their</strong></span> <span class='ocrx_word' id='word_1_513' title='bbox 1892 2289 2090 2331; x_wconf 96'><strong>furniture</strong></span> <span class='ocrx_word' id='word_1_514' title='bbox 2120 2295 2164 2331; x_wconf 92'><strong>to</strong></span> <span class='ocrx_word' id='word_1_515' title='bbox 2193 2289 2482 2343; x_wconf 92'><strong>upholsterers&#39;</strong></span> <span class='ocrx_word' id='word_1_516' title='bbox 2512 2289 2778 2331; x_wconf 96'><strong>warehouses</strong></span> <span class='ocrx_word' id='word_1_517' title='bbox 2810 2289 2876 2331; x_wconf 96'><strong>for</strong></span>
</span>
<span class='ocr_line' id='line_1_65' title="bbox 1759 2364 2876 2418; baseline 0 -12; x_size 54; x_descenders 12; x_ascenders 14"><span class='ocrx_word' id='word_1_518' title='bbox 1759 2364 1952 2418; x_wconf 96'><strong>security;</strong></span> <span class='ocrx_word' id='word_1_519' title='bbox 1969 2365 2039 2406; x_wconf 96'><strong>the</strong></span> <span class='ocrx_word' id='word_1_520' title='bbox 2056 2364 2351 2418; x_wconf 96'><strong>highwayman</strong></span> <span class='ocrx_word' id='word_1_521' title='bbox 2367 2364 2412 2406; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_522' title='bbox 2427 2365 2496 2406; x_wconf 95'><strong>the</strong></span> <span class='ocrx_word' id='word_1_523' title='bbox 2513 2365 2615 2406; x_wconf 96'><strong>dark</strong></span> <span class='ocrx_word' id='word_1_524' title='bbox 2629 2378 2718 2406; x_wconf 96'><strong>was</strong></span> <span class='ocrx_word' id='word_1_525' title='bbox 2736 2378 2762 2406; x_wconf 95'><strong>a</strong></span> <span class='ocrx_word' id='word_1_526' title='bbox 2777 2364 2876 2418; x_wconf 95'><strong>City</strong></span>
</span>
<span class='ocr_line' id='line_1_66' title="bbox 1757 2440 2877 2493; baseline 0 -12; x_size 53; x_descenders 12; x_ascenders 13"><span class='ocrx_word' id='word_1_527' title='bbox 1757 2440 1992 2481; x_wconf 96'><strong>tradesman</strong></span> <span class='ocrx_word' id='word_1_528' title='bbox 2007 2440 2051 2481; x_wconf 96'><strong>in</strong></span> <span class='ocrx_word' id='word_1_529' title='bbox 2063 2440 2134 2481; x_wconf 95'><strong>the</strong></span> <span class='ocrx_word' id='word_1_530' title='bbox 2150 2440 2265 2493; x_wconf 96'><strong>light,</strong></span> <span class='ocrx_word' id='word_1_531' title='bbox 2282 2440 2376 2490; x_wconf 96'><strong>and,</strong></span> <span class='ocrx_word' id='word_1_532' title='bbox 2391 2440 2519 2493; x_wconf 96'><strong>being</strong></span> <span class='ocrx_word' id='word_1_533' title='bbox 2533 2440 2781 2493; x_wconf 96'><strong>recognised</strong></span> <span class='ocrx_word' id='word_1_534' title='bbox 2794 2440 2877 2481; x_wconf 96'><strong>and</strong></span>
</span>
</p>
</div>
</div>
</body>
</html>
@@ -1 +1,71 @@
with a plain face, on the throne of England;
there were a king with a large jaw and a queen
with a fair face, on the throne of France. In both
countries it was clearer than crystal to the lords
of the State preserves of loaves and fishes, that
things in general were settled for ever.
It was the year of Our Lord one thousand
seven hundred and seventy-five. Spiritual reve-
lations were conceded to England at that
favoured period, as at this. Mrs. Southcott had
recently attained her five-and-twentieth blessed
birthday, of whom a prophetic private in the Life
Guards had heralded the sublime appearance by
announcing that arrangements were made for the
swallowing up of London and Westminster.
Even the Cock-lane ghost had been laid only a
round dozen of years, after rapping out its mes-
sages, as the spirits of this very year last past
(supernaturally deficient in originality) rapped
out theirs. Mere messages in the earthly order of
events had lately come to the English Crown and
People, from a congress of British subjects in
America: which, strange to relate, have proved
more important to the human race than any com-
munications yet received through any of the
chickens of the Cock-lane brood.
France, less favoured on the whole as to mat-
ters spiritual than her sister of the shield and tri-
dent, rolled with exceeding smoothness down
hill, making paper money and spending it. Under
the guidance of her Christian pastors, she enter-
tained herself, besides, with such humane
achievements as sentencing a youth to have his
hands cut off, his tongue torn out with pincers,
and his body burned alive, because he had not
kneeled down in the rain to do honour to a dirty
procession of monks which passed within his
view, at a distance of some fifty or sixty yards. It
is likely enough that, rooted in the woods of
France and Norway, there were growing trees,
when that sufferer was put to death, already
marked by the Woodman, Fate, to come down
and be sawn into boards, to make a certain mov-
able framework with a sack and a knife in it, ter-
rible in history. It is likely enough that in the
rough outhouses of some tillers of the heavy
lands adjacent to Paris, there were sheltered
from the weather that very day, rude carts,
bespattered with rustic mire, snuffed about by
pigs, and roosted in by poultry, which the
Farmer, Death, had already set apart to be his
tumbrils of the Revolution. But that Woodman
and that Farmer, though they work unceasingly,
work silently, and no one heard them as they
went about with muffled tread: the rather, foras-
much as to entertain any suspicion that they
were awake, was to be atheistical and traitorous.
In England, there was scarcely an amount of
order and protection to justify much national
boasting. Daring burglaries by armed men, and
highway robberies, took place in the capital
itself every night; families were publicly cau-
tioned not to go out of town without removing
their furniture to upholsterers' warehouses for
security; the highwayman in the dark was a City
tradesman in the light, and, being recognised and
@@ -9,7 +9,7 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.qdd9eyjq/000001.ocr.png"; bbox 0 0 2550 3300; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.jaxhgo79/000001.ocr.png"; bbox 0 0 2550 3300; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 627 120 2013 309">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 627 120 2013 309">
<span class='ocr_line' id='line_1_1' title="bbox 931 120 1705 222; baseline 0.032 -33; x_size 87; x_descenders 17; x_ascenders 20"><span class='ocrx_word' id='word_1_1' title='bbox 931 120 1084 194; x_wconf 93'><strong>The</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 1108 126 1705 222; x_wconf 91'><strong>LinnSequencer</strong></span>
@@ -9,7 +9,7 @@
<meta name='ocr-capabilities' content='ocr_page ocr_carea ocr_par ocr_line ocrx_word'/>
</head>
<body>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.9b6v5qah/000001.ocr.png"; bbox 0 0 2975 3850; ppageno 0'>
<div class='ocr_page' id='page_1' title='image "/var/folders/37/78_114p552q16vv6vmgm5kr00000gn/T/com.github.ocrmypdf.i_4ik0vk/000001.ocr.png"; bbox 0 0 2975 3850; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 732 141 2349 361">
<p class='ocr_par' id='par_1_1' lang='eng' title="bbox 732 141 2349 361">
<span class='ocr_line' id='line_1_1' title="bbox 1086 141 1990 259; baseline 0.032 -38; x_size 102; x_descenders 20; x_ascenders 24"><span class='ocrx_word' id='word_1_1' title='bbox 1086 141 1265 227; x_wconf 93'><strong>The</strong></span> <span class='ocrx_word' id='word_1_2' title='bbox 1293 147 1990 259; x_wconf 92'><strong>LinnSequencer</strong></span>
+54 -35
View File
@@ -46,81 +46,99 @@ The following test resources were crafted specifically for this project, and are
licensed under the specified license.
.. list-table::
:widths: 20 20 60
:widths: 20 40 15 15 10
:header-rows: 1
* - File
- Contributor
- Purpose
- Contributor
- Copyright Holder
- License
* - aspect.pdf
- @jbarlow83
- test image with 200 x 100 DPI resolution
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - blank.pdf
- @jbarlow83
- blank PDF generated by Adobe Illustrator CC 17, containing a lot of application-specific metadata/bloat
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - cmyk.pdf
- @jbarlow83
- a CMYK image created in Photoshop
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - crom.png
- @jbarlow83
- test for non-dictionary words
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - enormous.pdf
- @jbarlow83
- very large PDF page
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - epson.pdf
- a linearized PDF containing some unusual indirect objects, created by an Epson printer; printout of a Wikipedia article (CC-BY-SA)
- @lowesjam
- a linearized PDF containing some unusual indirect objects, created by an Epson printer; printout of a Wikipedia article (CC BY-SA)
- MIT
- Wikipedia authors
- CC-BY-SA 3.0
* - formxobject.pdf
- @jbarlow83
- hand-crafted PDF containing an image inside a Form XObject
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - francais.pdf
- @jbarlow83
- a page containing French accents (diacritics)
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - hugemono.pdf
- @jbarlow83
- large monochrome 35000x35000 image in JBIG2 encoding
- CC BY-SA 4.0
* - invalid.pdf
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - invalid.pdf
- a PDF file header followed by EOF marker
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - masks.pdf
- file containing explicit masks and a stencil mask drawn without a proper transformation matrix; printout of a German Wikipedia article (CC-BY-SA)
- @supergrobi
- file containing explicit masks and a stencil mask drawn without a proper transformation matrix; printout of a German Wikipedia article (CC BY-SA)
- MIT
- Wikipedia authors
- CC-BY-SA 3.0
* - missing_docinfo.pdf
- @jbarlow83
- @jbarlow83
- PDF file with no /DocumentInfo section
- CC BY-SA 4.0
- CC-BY-SA 4.0
* - overlay.pdf
- @maxandersen
- PDF file generated by PDFPen pro that triggered content stream parse errors
- MIT
- @maxandersen
- @maxandersen
- CC-BY-SA 4.0
* - negzero.pdf
- @jbarlow83
- copy of formxobject.pdf with token that qpdf doesn't like
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - no_contents.pdf
- @jbarlow83
- synthetic PDF with a blank page that has no /Contents entry
- CC BY-SA 4.0
* - trivial.pdf
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - trivial.pdf
- smallest possible valid PDF-1.3 with all required fields
- CC BY-SA 4.0
- @jbarlow83
- @jbarlow83
- CC-BY-SA 4.0
* - vector.pdf
- @Catscratch
- a PDF with vector art and text rendered as curves with no fonts
- MIT
- @Catscratch
- @Catscratch
- CC-BY-SA 4.0
Assemblies
@@ -129,6 +147,7 @@ Assemblies
These test resources are assemblies or derivatives from other previously mentioned files, released under the same license terms as their input files.
- baiona_gray.png (from baiona.png)
- baiona_colormapped.png (from baiona.png)
- cardinal.pdf (four cardinal directions, baked-in rotated copies of LinnSequencer.jpg)
- ccitt.pdf (LinnSequencer.jpg, converted to CCITT encoding)
- encrypted_algo4.pdf (congress.jpg, encrypted with algorithm 4 - not supported by PyPDF2)
Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

+13 -4
View File
@@ -29,6 +29,7 @@ import subprocess
import argparse
import json
import platform
import re
"""Cache output of tesseract to speed up test suite
@@ -85,7 +86,8 @@ parser.add_argument('-c', action='append')
parser.add_argument('--psm', type=int)
parser.add_argument('--oem', type=int)
CACHE_ROOT = Path(__file__).resolve().parent.parent / 'cache'
TESTS_ROOT = Path(__file__).resolve().parent.parent
CACHE_ROOT = TESTS_ROOT / 'cache'
def real_tesseract():
tess_args = ['tesseract'] + sys.argv[1:]
@@ -104,6 +106,8 @@ def main():
source = os.environ['_OCRMYPDF_TEST_INFILE'] # required
args = parser.parse_args()
cache_disabled = os.environ.get('_OCRMYPDF_CACHE_DISABLED', False)
if args.imagename == 'stdin':
real_tesseract()
@@ -126,7 +130,7 @@ def main():
print("Tesseract cache folder {} - ".format(cache_folder), end='',
file=sys.stderr)
if (cache_folder / 'stderr.bin').exists():
if (cache_folder / 'stderr.bin').exists() and not cache_disabled:
# Cache hit
print("HIT", file=sys.stderr)
@@ -178,12 +182,17 @@ def main():
manifest['tesseract_version'] = __version__.replace('\n', ' ')
manifest['platform'] = platform.platform()
manifest['python'] = platform.python_version()
manifest['args'] = sys.argv[1:]
manifest['argv_slug'] = argv_slug
manifest['sourcefile'] = source
manifest['sourcefile'] = str(Path(source).relative_to(TESTS_ROOT))
def clean_sys_argv():
for arg in sys.argv[1:]:
yield re.sub(r'.*/com.github.ocrmypdf[^/]+[/](.*)',
r'$TMPDIR/\1', arg)
manifest['args'] = list(clean_sys_argv())
with (Path(CACHE_ROOT) / 'manifest.jsonl').open('a') as f:
json.dump(manifest, f)
f.write('\n')
f.flush()
if __name__ == '__main__':
+30
View File
@@ -0,0 +1,30 @@
# © 2018 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 <http://www.gnu.org/licenses/>.
import os
import shutil
import pytest
import sys
import ocrmypdf.leptonica as lept
def test_colormap_backgroundnorm(resources):
# Issue #262 - unclear how to reproduce exactly, so just ensure leptonica
# can handle that case
pix = lept.Pix.read(resources / 'baiona-colormapped.png')
pix.background_norm()
+37 -17
View File
@@ -300,7 +300,8 @@ def test_autorotate_threshold(
@pytest.mark.parametrize('renderer',RENDERERS)
def test_ocr_timeout(renderer, resources, outpdf):
out = check_ocrmypdf(resources / 'skew.pdf', outpdf,
'--tesseract-timeout', '1.0')
'--tesseract-timeout', '0.01',
'--pdf-renderer', renderer)
pdfinfo = PdfInfo(out)
assert not pdfinfo[0].has_text
@@ -472,7 +473,7 @@ def test_tesseract_image_too_big(renderer, spoof_tesseract_big_image_error,
resources, outpdf):
check_ocrmypdf(
resources / 'hugemono.pdf', outpdf, '-r',
'--pdf-renderer', renderer,
'--pdf-renderer', renderer,
'--max-image-mpixels', '0',
env=spoof_tesseract_big_image_error)
@@ -607,7 +608,10 @@ def test_closed_streams(spoof_tesseract_noop, ocrmypdf_exec, resources, outpdf):
def test_masks(spoof_tesseract_noop, resources, outpdf):
check_ocrmypdf(resources / 'masks.pdf', outpdf, env=spoof_tesseract_noop)
p, out, err = run_ocrmypdf(
resources / 'masks.pdf', outpdf, env=spoof_tesseract_noop)
assert p.returncode == ExitCode.ok
def test_linearized_pdf_and_indirect_object(spoof_tesseract_noop,
@@ -715,7 +719,7 @@ def test_tesseract_config_notfound(renderer, resources, outdir):
'--pdf-renderer', renderer,
'--tesseract-config', cfg_file)
assert "Can't open" in err, "No error message about missing config file"
assert p.returncode == ExitCode.ok
assert p.returncode == ExitCode.ok, err
@pytest.mark.parametrize('renderer', RENDERERS)
@@ -825,6 +829,7 @@ def test_no_contents(spoof_tesseract_noop, resources, outpdf):
@pytest.mark.parametrize('image', [
'baiona.png',
'baiona_gray.png',
'baiona_alpha.png',
'congress.jpg'
])
def test_compression_preserved(spoof_tesseract_noop, ocrmypdf_exec,
@@ -835,7 +840,6 @@ def test_compression_preserved(spoof_tesseract_noop, ocrmypdf_exec,
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 + [
@@ -845,7 +849,12 @@ def test_compression_preserved(spoof_tesseract_noop, ocrmypdf_exec,
stdin=input_stream, env=spoof_tesseract_noop)
out, err = p.communicate()
assert p.returncode == ExitCode.ok
if im.mode in ('RGBA', 'LA'):
# If alpha image is input, expect an error
assert p.returncode != ExitCode.ok and b'alpha' in err
return
assert p.returncode == ExitCode.ok, err.decode('utf-8')
pdfinfo = PdfInfo(output_file)
@@ -890,7 +899,7 @@ def test_compression_changed(spoof_tesseract_noop, ocrmypdf_exec,
stdin=input_stream, env=spoof_tesseract_noop)
out, err = p.communicate()
assert p.returncode == ExitCode.ok
assert p.returncode == ExitCode.ok, err
pdfinfo = PdfInfo(output_file)
@@ -898,8 +907,14 @@ def test_compression_changed(spoof_tesseract_noop, ocrmypdf_exec,
if compression == "jpeg":
assert pdfimage.enc == Encoding.jpeg
elif compression == 'lossless':
assert pdfimage.enc not in (Encoding.jpeg, Encoding.jpeg2000)
else:
if ghostscript.jpeg_passthrough_available():
# Ghostscript 9.23 adds JPEG passthrough, which allows a JPEG to be
# copied without transcoding - so report
if image.endswith('jpg'):
assert pdfimage.enc == Encoding.jpeg
else:
assert pdfimage.enc not in (Encoding.jpeg, Encoding.jpeg2000)
if im.mode.startswith('RGB') or im.mode.startswith('BGR'):
assert pdfimage.color == Colorspace.rgb, \
@@ -942,17 +957,22 @@ def test_sidecar_nonempty(spoof_tesseract_cache, resources, outpdf):
assert 'the' in ocr_text
def test_pdfa_1(spoof_tesseract_cache, resources, outpdf):
@pytest.mark.parametrize('pdfa_level', ['1', '2', '3'])
def test_pdfa_n(spoof_tesseract_cache, pdfa_level, resources, outpdf):
if pdfa_level == '3' and ghostscript.version() < '9.19':
pytest.xfail(reason='Ghostscript >= 9.19 required')
check_ocrmypdf(
resources / 'ccitt.pdf', outpdf,
'--output-type', 'pdfa-1',
'--output-type', 'pdfa-' + pdfa_level,
env=spoof_tesseract_cache
)
pdfa_info = file_claims_pdfa(outpdf)
assert pdfa_info['conformance'] == 'PDF/A-1B'
assert pdfa_info['conformance'] == 'PDF/A-{}B'.format(pdfa_level)
@pytest.mark.skipif(sys.version_info >= (3, 7, 0), reason='fixed')
def test_bad_locale():
env = os.environ.copy()
env['LC_ALL'] = 'C'
@@ -980,7 +1000,7 @@ def test_bad_utf8(spoof_tess_bad_utf8, renderer, resources, no_outpdf):
@pytest.mark.skipif(
not tesseract.has_textonly_pdf(),
not tesseract.has_textonly_pdf(),
reason="issue only affects sandwich")
def test_rotate_deskew_timeout(resources, outdir):
check_ocrmypdf(
@@ -1003,7 +1023,7 @@ def test_rotate_deskew_timeout(resources, outdir):
@pytest.mark.skipif(
PIL.PILLOW_VERSION < '5.0.0',
PIL.__version__ < '5.0.0',
reason="Pillow < 5.0.0 doesn't raise the exception")
def test_decompression_bomb(resources, outpdf):
p, out, err = run_ocrmypdf(
@@ -1030,10 +1050,10 @@ def test_text_curves(spoof_tesseract_noop, resources, outpdf):
check_ocrmypdf(
resources / 'vector.pdf', outpdf, '--force-ocr',
env=spoof_tesseract_noop)
info = PdfInfo(outpdf)
assert len(info.pages[0].images) != 0, "force did not rasterize"
def test_dev_null(spoof_tesseract_noop, resources):
p, out, err = run_ocrmypdf(
@@ -1076,4 +1096,4 @@ def test_skip_repair(spoof_tesseract_noop, resources, outpdf):
outpdf,
'--skip-repair',
env=spoof_tesseract_noop
)
)
+49 -5
View File
@@ -18,8 +18,10 @@
import pytest
import PyPDF2 as pypdf
import datetime
from datetime import timezone
from ocrmypdf.pdfa import file_claims_pdfa
from ocrmypdf.pdfa import file_claims_pdfa, encode_pdf_date, decode_pdf_date
from ocrmypdf.exceptions import ExitCode
from ocrmypdf.lib import fitz
@@ -71,11 +73,16 @@ def test_override_metadata(spoof_tesseract_noop, output_type, resources,
assert p.returncode == ExitCode.ok, err
reader = pypdf.PdfFileReader(outpdf)
before = pypdf.PdfFileReader(str(input_file))
after = pypdf.PdfFileReader(outpdf)
assert reader.documentInfo['/Title'] == german
assert reader.documentInfo['/Author'] == chinese
assert reader.documentInfo.get('/Keywords', '') == ''
assert after.documentInfo['/Title'] == german
assert after.documentInfo['/Author'] == chinese
assert after.documentInfo.get('/Keywords', '') == ''
before_date = decode_pdf_date(before.documentInfo['/CreationDate'])
after_date = decode_pdf_date(after.documentInfo['/CreationDate'])
assert before_date == after_date
pdfa_info = file_claims_pdfa(outpdf)
assert pdfa_info['output'] == output_type
@@ -115,3 +122,40 @@ def test_bookmarks_preserved(spoof_tesseract_noop, output_type, ocr_option,
print(before_toc)
print(after_toc)
assert before_toc == after_toc
def seconds_between_dates(date1, date2):
return (date2 - date1).total_seconds()
@pytest.mark.parametrize('infile', ['trivial.pdf', 'jbig2.pdf'])
@pytest.mark.parametrize('output_type', ['pdf', 'pdfa'])
def test_creation_date_preserved(spoof_tesseract_noop, output_type, resources,
infile, outpdf):
input_file = resources / infile
before = pypdf.PdfFileReader(str(input_file)).getDocumentInfo()
check_ocrmypdf(
input_file, outpdf, '--output-type', output_type,
env=spoof_tesseract_noop)
after = pypdf.PdfFileReader(str(outpdf)).getDocumentInfo()
if not before:
# If there was input creation date, none should be output
# because of Ghostscript quirks we set it to null
# This test would be better if we had a test file with /DocumentInfo but
# no /CreationDate, which we don't
assert not after['/CreationDate'] or \
isinstance(after['/CreationDate'], pypdf.generic.NullObject)
else:
# We expect that the creation date stayed the same
date_before = decode_pdf_date(before['/CreationDate'])
date_after = decode_pdf_date(after['/CreationDate'])
assert seconds_between_dates(date_before, date_after) < 1000
# We expect that the modified date is quite recent
date_after = decode_pdf_date(after['/ModDate'])
assert seconds_between_dates(
date_after, datetime.datetime.now(timezone.utc)) < 1000
-1
View File
@@ -26,7 +26,6 @@ import os
import shutil
import pytest
import img2pdf
import pytest
import sys
import PyPDF2 as pypdf