deskew and clean

This commit is contained in:
Jim Barlow
2014-09-27 15:03:07 -07:00
parent fccfb4589e
commit dabbddb04e
+73 -11
View File
@@ -7,6 +7,7 @@ import sys
import os.path
from parse import parse
from subprocess import Popen, PIPE, check_call
from tempfile import NamedTemporaryFile
logger = logging.getLogger(__name__)
@@ -51,13 +52,17 @@ def pdf_get_pageinfo(infile, page, width_pt, height_pt):
image['dpi'] = (image['dpi_w'] * image['dpi_h']) ** 0.5
pageinfo['images'].append(image)
xres = max(image['dpi_w'] for image in pageinfo['images'])
yres = max(image['dpi_h'] for image in pageinfo['images'])
pageinfo['xres'], pageinfo['yres'] = xres, yres
pageinfo['width_pixels'] = int(round(xres * pageinfo['width_inches']))
pageinfo['height_pixels'] = int(round(yres * pageinfo['height_inches']))
return pageinfo
def unpack_with_pdftoppm(pageinfo, infile, output_folder, prefix,
force_ppm=False):
xres = max(image['dpi_w'] for image in pageinfo['images'])
yres = max(image['dpi_h'] for image in pageinfo['images'])
colorspace = 'color'
compression = 'deflate'
@@ -76,8 +81,8 @@ def unpack_with_pdftoppm(pageinfo, infile, output_folder, prefix,
args_pdftoppm = [
'pdftoppm',
'-f', str(pageinfo['pageno']), '-l', str(pageinfo['pageno']),
'-rx', str(int(round(xres))),
'-ry', str(int(round(yres))),
'-rx', str(pageinfo['xres']),
'-ry', str(pageinfo['yres'])
]
if not force_ppm:
@@ -96,11 +101,49 @@ def unpack_with_pdftoppm(pageinfo, infile, output_folder, prefix,
args_pdftoppm.extend([str(infile)])
with open(
os.path.join(output_folder, "%04i.ppm" % pageinfo['pageno']), 'wb'
) as output_file:
print(output_file.name)
check_call(args_pdftoppm, close_fds=True, stdout=output_file)
with NamedTemporaryFile(prefix=prefix + "%04i.ppm" % pageinfo['pageno'],
suffix='.ppm', dir=output_folder,
delete=False) as tmpfile:
check_call(args_pdftoppm, close_fds=True, stdout=tmpfile)
return tmpfile.name
def deskew_imagemagick(pageinfo, infile, prefix, output_folder):
args_convert = [
'convert',
infile,
'-deskew', '40%',
'-gravity', 'center',
'-extent', '{width_pixels}x{height_pixels}'.format(**pageinfo)
]
with NamedTemporaryFile(prefix=prefix + "%04i.ppm" % pageinfo['pageno'],
suffix='.ppm', dir=output_folder,
delete=False) as tmpfile:
args_convert.append(tmpfile.name)
check_call(args_convert, close_fds=True)
return tmpfile.name
def clean_unpaper(pageinfo, infile, prefix, output_folder):
args_unpaper = [
'unpaper',
'--dpi', int(round((pageinfo['xres'] * pageinfo['yres']) ** 0.5)),
'--mask-scan-size', '100',
'--no-deskew',
'--no-grayfilter',
'--no-blackfilter',
'--no-mask-center',
'--no-border-align',
infile
]
with NamedTemporaryFile(prefix=prefix + "%04i.ppm" % pageinfo['pageno'],
suffix='.ppm', dir=output_folder,
delete=False) as tmpfile:
args_unpaper.append(tmpfile.name)
check_call(args_unpaper, close_fds=True)
return tmpfile.name
parser = argparse.ArgumentParser(
@@ -156,6 +199,7 @@ parser.add_argument(
def main():
args = parser.parse_args()
tmpfiles = {}
pageno, width_pt, height_pt = map(int, args.page_info.split(' ', 3))
@@ -174,8 +218,26 @@ def main():
if len(pageinfo['images']) > 1:
logger.warn("Page has more than one single image, proceeding anyway")
unpack_with_pdftoppm(pageinfo, args.input_pdf, args.tmp_fld, prefix='',
force_ppm=True)
tmpfiles['pixmap'] = unpack_with_pdftoppm(
pageinfo, args.input_pdf, args.tmp_fld, prefix='', force_ppm=True)
if args.preprocess_deskew:
tmpfiles['deskew'] = deskew_imagemagick(
pageinfo, tmpfiles['pixmap'],
prefix='deskew', output_folder=args.tmp_fld)
else:
tmpfiles['deskew'] = tmpfiles['pixmap']
if args.preprocess_clean:
tmpfiles['clean'] = clean_unpaper(
pageinfo,
tmpfiles['deskew'])
else:
tmpfiles['clean'] = tmpfiles['deskew']
if __name__ == '__main__':