Add Tesseract spoofing

This commit is contained in:
James R. Barlow
2015-12-17 11:36:47 -08:00
parent 102bd07019
commit 45113676a3
3 changed files with 73 additions and 8 deletions
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env python3
import sys
VERSION_STRING = '''tesseract 3.04.00
leptonica-1.72
libjpeg 8d : libpng 1.6.19 : libtiff 4.0.6 : zlib 1.2.5
SPOOFED
'''
HOCR_TEMPLATE = '''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name='ocr-system' content='tesseract 3.02.02' />
<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 "x.tif"; bbox 0 0 {0} {1}; ppageno 0'>
<div class='ocr_carea' id='block_1_1' title="bbox 0 1 {0} {1}">
<p class='ocr_par' dir='ltr' id='par_1' title="bbox 0 1 {0} {1}">
<span class='ocr_line' id='line_1' title="bbox 0 1 {0} {1}"><span class='ocrx_word' id='word_1' title="bbox 0 1 {0} {1}"> </span>
</span>
</p>
</div>
</div>
</body>
</html>'''
def main():
if sys.argv[1] == '--version':
print(VERSION_STRING, file=sys.stderr)
sys.exit(0)
elif sys.argv[1] == '--list-langs':
print('List of available languages (1):\neng', file=sys.stderr)
sys.exit(0)
elif sys.argv[-1] == 'hocr':
output = sys.argv[-2]
with open(output + '.hocr', 'w', encoding='utf-8') as f:
f.write(HOCR_TEMPLATE.format('1000', '1000'))
else:
print("Spoof doesn't understand arguments", file=sys.stderr)
print(sys.argv, file=sys.stderr)
sys.exit(1)
sys.exit(0)
if __name__ == '__main__':
main()
+19 -8
View File
@@ -2,7 +2,7 @@
# © 2015 James R. Barlow: github.com/jbarlow83
from __future__ import print_function
from subprocess import Popen, PIPE, check_output
from subprocess import Popen, PIPE, check_output, check_call
import os
import shutil
from contextlib import suppress
@@ -18,6 +18,7 @@ if sys.version_info.major < 3:
sys.exit(1)
TESTS_ROOT = os.path.abspath(os.path.dirname(__file__))
SPOOF_PATH = os.path.join(TESTS_ROOT, 'spoof')
PROJECT_ROOT = os.path.dirname(TESTS_ROOT)
OCRMYPDF = os.path.join(PROJECT_ROOT, 'OCRmyPDF.sh')
TEST_RESOURCES = os.path.join(PROJECT_ROOT, 'tests', 'resources')
@@ -34,11 +35,11 @@ def setup_module():
os.mkdir(TEST_OUTPUT)
def run_ocrmypdf_sh(input_file, output_file, *args):
def run_ocrmypdf_sh(input_file, output_file, *args, env=None):
sh_args = ['sh', OCRMYPDF] + list(args) + [input_file, output_file]
sh = Popen(
sh_args, close_fds=True, stdout=PIPE, stderr=PIPE,
universal_newlines=True)
universal_newlines=True, env=env)
out, err = sh.communicate()
return sh, out, err
@@ -51,11 +52,11 @@ def _make_output(output_basename):
return os.path.join(TEST_OUTPUT, output_basename)
def check_ocrmypdf(input_basename, output_basename, *args):
def check_ocrmypdf(input_basename, output_basename, *args, env=None):
input_file = _make_input(input_basename)
output_file = _make_output(output_basename)
sh, _, err = run_ocrmypdf_sh(input_file, output_file, *args)
sh, _, err = run_ocrmypdf_sh(input_file, output_file, *args, env=env)
assert sh.returncode == 0, err
assert os.path.exists(output_file), "Output file not created"
assert os.stat(output_file).st_size > 100, "PDF too small or empty"
@@ -81,9 +82,19 @@ def test_quick():
check_ocrmypdf('c02-22.pdf', 'test_quick.pdf')
def test_deskew():
@pytest.fixture
def spoof_tesseract_hocr_empty():
env = os.environ.copy()
program = os.path.join(SPOOF_PATH, 'tesseract_hocr_empty.py')
check_call(['chmod', "+x", program])
env['OCRMYPDF_TESSERACT'] = program
return env
def test_deskew(spoof_tesseract_hocr_empty):
# Run with deskew
deskewed_pdf = check_ocrmypdf('skew.pdf', 'test_deskew.pdf', '-d')
deskewed_pdf = check_ocrmypdf(
'skew.pdf', 'test_deskew.pdf', '-d', env=spoof_tesseract_hocr_empty)
# Now render as an image again and use Leptonica to find the skew angle
# to confirm that it was deskewed
@@ -310,7 +321,7 @@ def test_input_file_not_a_pdf():
def test_qpdf_repair_fails():
env = os.environ.copy()
env['OCRMYPDF_QPDF'] = os.path.abspath('./qpdf_dummy_return2.py')
env['OCRMYPDF_QPDF'] = os.path.abspath('./spoof/qpdf_dummy_return2.py')
p, out, err = run_ocrmypdf_env(
'-v', '1',
'c02-22.pdf', 'wont_be_created.pdf', env=env)