From 8f77576dc4558f31e4bbe193c4685a36323939ab Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Thu, 28 Jul 2016 16:20:59 -0700 Subject: [PATCH] Fix non-square image resolution for "hocr" case; use img2pdf 0.2.1 Tesseract renderer not immediately fixable. --- ocrmypdf/main.py | 24 +++++++++++++----------- tests/resources/README.rst | 1 + tests/resources/aspect.pdf | Bin 0 -> 8874 bytes tests/test_main.py | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 tests/resources/aspect.pdf diff --git a/ocrmypdf/main.py b/ocrmypdf/main.py index 17d1a6cd..aa9959bd 100755 --- a/ocrmypdf/main.py +++ b/ocrmypdf/main.py @@ -637,10 +637,14 @@ def rasterize_with_ghostscript( device = 'pnggray' log.debug("Rasterize {0} with {1}".format( - os.path.basename(input_file), device)) + os.path.basename(input_file), device)) - xres, yres = get_page_dpi(pageinfo) - ghostscript.rasterize_pdf(input_file, output_file, xres, yres, device, log) + # Produce the page image with square resolution or else deskew and OCR + # will not work properly + dpi = get_page_square_dpi(pageinfo) + ghostscript.rasterize_pdf( + input_file, output_file, xres=dpi, yres=dpi, raster_device=device, + log=log) @transform( @@ -767,18 +771,16 @@ def select_image_layer( re_symlink(page_pdf, output_file) else: pageinfo = get_pageinfo(image, pdfinfo, pdfinfo_lock) - - dpi = round(get_page_square_dpi(pageinfo)) - imgsize = ((img2pdf.ImgSize.dpi, dpi), (img2pdf.ImgSize.dpi, dpi)) - - layout_fun = img2pdf.get_layout_fun(None, imgsize, None, None, None) + dpi = get_page_dpi(pageinfo) + dpi = float(dpi[0]), float(dpi[1]) + layout_fun = img2pdf.get_fixed_dpi_layout_fun(dpi) with open(image, 'rb') as imfile, \ open(output_file, 'wb') as pdf: rawdata = imfile.read() - pdf.write(img2pdf.convert( - rawdata, producer="img2pdf", with_pdfrw=False, - layout_fun=layout_fun)) + img2pdf.convert( + rawdata, with_pdfrw=False, + layout_fun=layout_fun, outputstream=pdf) @active_if(options.pdf_renderer == 'hocr') diff --git a/tests/resources/README.rst b/tests/resources/README.rst index e91fd878..13bc3778 100644 --- a/tests/resources/README.rst +++ b/tests/resources/README.rst @@ -31,6 +31,7 @@ Files generated for this project The following test resources were crafted specifically for this project, and can be used under the terms of the license in LICENSE.rst. +- aspect.pdf (a page with an image with 200 x 100 DPI resolution) - blank.pdf (a blank PDF page) - cmyk.pdf (a CMYK image created in Photoshop) - enormous.pdf (a very lage page) diff --git a/tests/resources/aspect.pdf b/tests/resources/aspect.pdf new file mode 100644 index 0000000000000000000000000000000000000000..06795d8caabb7e7bdb8f520b5bf22be849a24aff GIT binary patch literal 8874 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 M@JdM?Gt%b$CwKVv$p8QV literal 0 HcmV?d00001 diff --git a/tests/test_main.py b/tests/test_main.py index f36eb3ab..e820d064 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -562,3 +562,22 @@ def test_old_unpaper(): def test_algo4(): sh, _, _ = run_ocrmypdf_env('encrypted_algo4.pdf', 'wontwork.pdf') assert sh.returncode == ExitCode.encrypted_pdf + + +@pytest.mark.parametrize('renderer', [ + 'hocr']) +def test_non_square_resolution(renderer): + # Confirm input image is non-square resolution + in_pageinfo = pdf_get_all_pageinfo(_infile('aspect.pdf')) + assert in_pageinfo[0]['xres'] != in_pageinfo[0]['yres'] + + out = 'aspect_%s.pdf' % renderer + check_ocrmypdf( + 'aspect.pdf', out, + '--pdf-renderer', renderer) + + out_pageinfo = pdf_get_all_pageinfo(_outfile(out)) + + # Confirm resolution was kept the same + assert in_pageinfo[0]['xres'] == out_pageinfo[0]['xres'] + assert in_pageinfo[0]['yres'] == out_pageinfo[0]['yres']