2015-07-22 02:59:25 -07:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
2015-07-25 00:57:07 -07:00
|
|
|
from __future__ import print_function
|
2015-07-22 02:59:25 -07:00
|
|
|
from subprocess import Popen, PIPE
|
|
|
|
import os
|
2015-07-22 04:00:59 -07:00
|
|
|
import shutil
|
|
|
|
from contextlib import suppress
|
2015-07-22 11:21:33 -07:00
|
|
|
import sys
|
2015-07-27 15:39:54 -07:00
|
|
|
from unittest.mock import patch
|
2015-07-22 11:21:33 -07:00
|
|
|
|
|
|
|
if sys.version_info.major < 3:
|
|
|
|
print("Requires Python 3.4+")
|
|
|
|
sys.exit(1)
|
2015-07-22 02:59:25 -07:00
|
|
|
|
|
|
|
TESTS_ROOT = os.path.abspath(os.path.dirname(__file__))
|
|
|
|
PROJECT_ROOT = os.path.dirname(TESTS_ROOT)
|
|
|
|
OCRMYPDF = os.path.join(PROJECT_ROOT, 'OCRmyPDF.sh')
|
|
|
|
TEST_RESOURCES = os.path.join(PROJECT_ROOT, 'tests', 'resources')
|
2015-07-22 03:16:19 -07:00
|
|
|
TEST_OUTPUT = os.path.join(PROJECT_ROOT, 'tests', 'output')
|
2015-07-22 02:59:25 -07:00
|
|
|
|
|
|
|
|
2015-07-22 03:16:19 -07:00
|
|
|
def setup_module():
|
2015-07-22 04:00:59 -07:00
|
|
|
with suppress(FileNotFoundError):
|
|
|
|
shutil.rmtree(TEST_OUTPUT)
|
|
|
|
with suppress(FileExistsError):
|
2015-07-22 03:16:19 -07:00
|
|
|
os.mkdir(TEST_OUTPUT)
|
|
|
|
|
|
|
|
|
2015-07-27 15:39:54 -07:00
|
|
|
def run_ocrmypdf_sh(input_file, output_file, *args):
|
2015-07-22 04:00:59 -07:00
|
|
|
sh_args = ['sh', OCRMYPDF] + list(args) + [input_file, output_file]
|
2015-07-22 02:59:25 -07:00
|
|
|
sh = Popen(
|
|
|
|
sh_args, close_fds=True, stdout=PIPE, stderr=PIPE,
|
|
|
|
universal_newlines=True)
|
|
|
|
out, err = sh.communicate()
|
|
|
|
return sh, out, err
|
|
|
|
|
|
|
|
|
2015-07-27 15:39:54 -07:00
|
|
|
def check_ocrmypdf_sh(input_basename, output_basename, *args):
|
2015-07-22 04:00:59 -07:00
|
|
|
input_file = os.path.join(TEST_RESOURCES, input_basename)
|
|
|
|
output_file = os.path.join(TEST_OUTPUT, output_basename or input_basename)
|
|
|
|
|
2015-07-27 15:39:54 -07:00
|
|
|
sh, _, err = run_ocrmypdf_sh(input_file, output_file, *args)
|
2015-07-22 02:59:25 -07:00
|
|
|
assert sh.returncode == 0, err
|
2015-07-22 04:00:59 -07:00
|
|
|
assert os.path.exists(output_file), "Output file not created"
|
2015-07-27 15:39:54 -07:00
|
|
|
assert os.stat(output_file).st_size > 100, "PDF too small or empty"
|
|
|
|
|
|
|
|
|
|
|
|
def run_ocrmypdf(input_basename, output_basename, *args):
|
|
|
|
input_file = os.path.join(TEST_RESOURCES, input_basename)
|
|
|
|
output_file = os.path.join(TEST_OUTPUT, output_basename or input_basename)
|
|
|
|
|
|
|
|
sys_argv = list(args) + [input_file, output_file]
|
|
|
|
with patch.object(sys, 'argv', sys_argv):
|
|
|
|
try:
|
|
|
|
import ocrmypdf.main
|
|
|
|
ocrmypdf.main.run_pipeline()
|
|
|
|
except SystemExit as e:
|
|
|
|
assert e.code == 0
|
|
|
|
return output_file
|
2015-07-22 02:59:25 -07:00
|
|
|
|
|
|
|
|
|
|
|
def test_quick():
|
2015-07-27 15:39:54 -07:00
|
|
|
check_ocrmypdf_sh('c02-22.pdf', 'test_quick.pdf')
|
2015-07-22 04:00:59 -07:00
|
|
|
|
|
|
|
|
|
|
|
def test_deskew():
|
2015-07-27 15:39:54 -07:00
|
|
|
deskewed_pdf = run_ocrmypdf('skew.pdf', 'test_deskew.pdf', '-d')
|
|
|
|
from ocrmypdf.ghostscript import rasterize_pdf
|
|
|
|
import logging
|
|
|
|
log = logging.getLogger()
|
|
|
|
|
|
|
|
deskewed_png = os.path.join(TEST_OUTPUT, 'deskewed.png')
|
|
|
|
|
|
|
|
rasterize_pdf(
|
|
|
|
deskewed_pdf,
|
|
|
|
deskewed_png,
|
|
|
|
xres=150,
|
|
|
|
yres=150,
|
|
|
|
raster_device='pngmono',
|
|
|
|
log=log)
|
|
|
|
|
|
|
|
from ocrmypdf.leptonica import pixRead, pixDestroy, pixFindSkew
|
|
|
|
pix = pixRead(deskewed_png)
|
|
|
|
skew_angle, skew_confidence = pixFindSkew(pix)
|
|
|
|
pix = pixDestroy(pix)
|
|
|
|
|
|
|
|
print(skew_angle)
|
|
|
|
assert -0.5 < skew_angle < 0.5, "Deskewing failed"
|
2015-07-22 04:00:59 -07:00
|
|
|
|
|
|
|
|
|
|
|
def test_clean():
|
2015-07-27 15:39:54 -07:00
|
|
|
check_ocrmypdf_sh('skew.pdf', 'test_clean.pdf', '-c')
|
|
|
|
|
|
|
|
|