Refactor pdf_get_all_pageinfo to PdfInfo

This commit is contained in:
James R. Barlow
2017-05-18 16:31:18 -07:00
parent 0a2f732267
commit 6a0b68298f
4 changed files with 89 additions and 25 deletions
+64
View File
@@ -8,6 +8,7 @@ import re
import sys
import PyPDF2 as pypdf
from collections import namedtuple
import warnings
matrix_mult = pypdf.pdf.utils.matrixMultiply
@@ -520,6 +521,69 @@ def pdf_get_all_pageinfo(infile):
return [_pdf_get_pageinfo(infile, n) for n in range(pdf.numPages)]
class PageInfo:
def __init__(self, infile, pageno):
self._infile = infile
self._pageno = pageno
self._pageinfo = _pdf_get_pageinfo(infile, pageno)
@property
def pageno(self):
return self._pageno
@property
def has_text(self):
return self._pageinfo['has_text']
@property
def width_inches(self):
return self._pageinfo['width_inches']
@property
def height_inches(self):
return self._pageinfo['height_inches']
@property
def rotation(self):
return self._pageinfo['rotate']
@property
def images(self):
return self._pageinfo['images']
@property
def xres(self):
return self._pageinfo['xres']
@property
def yres(self):
return self._pageinfo['yres']
def __getitem__(self, item):
warnings.warn("pageinfo[item] is deprecated", DeprecationWarning)
return self._pageinfo[item]
def __setitem__(self, item, value):
warnings.warn("pageinfo[item] is deprecated", DeprecationWarning)
self._pageinfo[item] = value
class PdfInfo:
def __init__(self, infile):
self._pages = pdf_get_all_pageinfo(infile)
@property
def pages(self, index):
return self._pages[index]
def __getitem__(self, item):
warnings.warn("pageinfo[item] is deprecated", DeprecationWarning)
return self._pages[item]
def __len__(self):
return len(self._pages)
def main():
import argparse
parser = argparse.ArgumentParser()
+3 -3
View File
@@ -22,7 +22,7 @@ from PIL import Image
from ruffus import formatter, regex, Pipeline, suffix
from .hocrtransform import HocrTransform
from .pageinfo import pdf_get_all_pageinfo
from .pageinfo import PdfInfo
from .pdfa import generate_pdfa_ps, file_claims_pdfa
from .helpers import re_symlink, is_iterable_notstr, page_number
from .exec import ghostscript, tesseract, qpdf
@@ -50,7 +50,7 @@ class JobContext:
"""
def __init__(self):
self.pdfinfo = []
self.pdfinfo = None
def get_pdfinfo(self):
"What we know about the input PDF"
@@ -183,7 +183,7 @@ def repair_pdf(
context):
qpdf.repair(input_file, output_file, log)
pdfinfo = pdf_get_all_pageinfo(output_file)
pdfinfo = PdfInfo(output_file)
context.set_pdfinfo(pdfinfo)
log.debug(pdfinfo)
+16 -16
View File
@@ -5,7 +5,7 @@ from subprocess import Popen, PIPE, check_output, check_call, DEVNULL
import os
import shutil
import pytest
from ocrmypdf.pageinfo import pdf_get_all_pageinfo
from ocrmypdf.pageinfo import PdfInfo
import PyPDF2 as pypdf
from ocrmypdf.exceptions import ExitCode
from ocrmypdf import leptonica
@@ -230,7 +230,7 @@ def test_oversample(spoof_tesseract_cache, renderer, resources, outpdf):
'-f',
'--pdf-renderer', renderer, env=spoof_tesseract_cache)
pdfinfo = pdf_get_all_pageinfo(str(oversampled_pdf))
pdfinfo = PdfInfo(str(oversampled_pdf))
print(pdfinfo[0]['xres'])
assert abs(pdfinfo[0]['xres'] - 350) < 1
@@ -244,7 +244,7 @@ def test_repeat_ocr(resources, no_outpdf):
def test_force_ocr(spoof_tesseract_cache, resources, outpdf):
out = check_ocrmypdf(resources / 'graph_ocred.pdf', outpdf, '-f',
env=spoof_tesseract_cache)
pdfinfo = pdf_get_all_pageinfo(out)
pdfinfo = PdfInfo(out)
assert pdfinfo[0]['has_text']
@@ -358,14 +358,14 @@ def test_autorotate_threshold(
def test_ocr_timeout(renderer, resources, outpdf):
out = check_ocrmypdf(resources / 'skew.pdf', outpdf,
'--tesseract-timeout', '1.0')
pdfinfo = pdf_get_all_pageinfo(str(out))
pdfinfo = PdfInfo(str(out))
assert not pdfinfo[0]['has_text']
def test_skip_big(spoof_tesseract_cache, resources, outpdf):
out = check_ocrmypdf(resources / 'enormous.pdf', outpdf,
'--skip-big', '10', env=spoof_tesseract_cache)
pdfinfo = pdf_get_all_pageinfo(str(out))
pdfinfo = PdfInfo(str(out))
assert not pdfinfo[0]['has_text']
@@ -562,14 +562,14 @@ def test_algo4(resources, no_outpdf):
def test_non_square_resolution(renderer, spoof_tesseract_cache,
resources, outpdf):
# Confirm input image is non-square resolution
in_pageinfo = pdf_get_all_pageinfo(str(resources / 'aspect.pdf'))
in_pageinfo = PdfInfo(str(resources / 'aspect.pdf'))
assert in_pageinfo[0]['xres'] != in_pageinfo[0]['yres']
check_ocrmypdf(
resources / 'aspect.pdf', outpdf,
'--pdf-renderer', renderer, env=spoof_tesseract_cache)
out_pageinfo = pdf_get_all_pageinfo(str(outpdf))
out_pageinfo = PdfInfo(str(outpdf))
# Confirm resolution was kept the same
assert in_pageinfo[0]['xres'] == out_pageinfo[0]['xres']
@@ -585,7 +585,7 @@ def test_convert_to_square_resolution(renderer, spoof_tesseract_cache,
from math import isclose
# Confirm input image is non-square resolution
in_pageinfo = pdf_get_all_pageinfo(str(resources / 'aspect.pdf'))
in_pageinfo = PdfInfo(str(resources / 'aspect.pdf'))
assert in_pageinfo[0]['xres'] != in_pageinfo[0]['yres']
# --force-ocr requires means forced conversion to square resolution
@@ -594,7 +594,7 @@ def test_convert_to_square_resolution(renderer, spoof_tesseract_cache,
'--force-ocr',
'--pdf-renderer', renderer, env=spoof_tesseract_cache)
out_pageinfo = pdf_get_all_pageinfo(str(outpdf))
out_pageinfo = PdfInfo(str(outpdf))
in_p0, out_p0 = in_pageinfo[0], out_pageinfo[0]
@@ -628,7 +628,7 @@ def test_jbig2_passthrough(spoof_tesseract_cache, resources, outpdf):
'--pdf-renderer', 'hocr',
env=spoof_tesseract_cache)
out_pageinfo = pdf_get_all_pageinfo(str(out))
out_pageinfo = PdfInfo(str(out))
assert out_pageinfo[0]['images'][0]['enc'] == 'jbig2'
@@ -702,7 +702,7 @@ def test_rotated_skew_timeout(resources, outpdf):
"""
input_file = str(resources / 'rotated_skew.pdf')
in_pageinfo = pdf_get_all_pageinfo(input_file)[0]
in_pageinfo = PdfInfo(input_file)[0]
assert in_pageinfo['height_pixels'] < in_pageinfo['width_pixels'], \
"Expected the input page to be landscape"
@@ -713,7 +713,7 @@ def test_rotated_skew_timeout(resources, outpdf):
'--pdf-renderer', 'hocr',
'--deskew', '--tesseract-timeout', '0')
out_pageinfo = pdf_get_all_pageinfo(str(out))[0]
out_pageinfo = PdfInfo(str(out))[0]
assert out_pageinfo['height_pixels'] > out_pageinfo['width_pixels'], \
"Expected the output page to be portrait"
@@ -743,7 +743,7 @@ def test_very_high_dpi(spoof_tesseract_cache, resources, outpdf):
"Checks for a Decimal quantize error with high DPI, etc"
check_ocrmypdf(resources / '2400dpi.pdf', outpdf,
env=spoof_tesseract_cache)
pdfinfo = pdf_get_all_pageinfo(outpdf)
pdfinfo = PdfInfo(outpdf)
image = pdfinfo[0]['images'][0]
assert image['dpi_w'] == image['dpi_h']
@@ -900,7 +900,7 @@ def test_compression_preserved(spoof_tesseract_noop, ocrmypdf_exec,
assert p.returncode == ExitCode.ok
pdfinfo = pdf_get_all_pageinfo(output_file)
pdfinfo = PdfInfo(output_file)
pdfimage = pdfinfo[0]['images'][0]
@@ -945,7 +945,7 @@ def test_compression_changed(spoof_tesseract_noop, ocrmypdf_exec,
assert p.returncode == ExitCode.ok
pdfinfo = pdf_get_all_pageinfo(output_file)
pdfinfo = PdfInfo(output_file)
pdfimage = pdfinfo[0]['images'][0]
@@ -970,7 +970,7 @@ def test_sidecar_pagecount(spoof_tesseract_cache, resources, outpdf):
'--sidecar', sidecar,
env=spoof_tesseract_cache)
pdfinfo = pdf_get_all_pageinfo(str(resources / 'multipage.pdf'))
pdfinfo = PdfInfo(str(resources / 'multipage.pdf'))
num_pages = len(pdfinfo)
with open(sidecar, 'r') as f:
+6 -6
View File
@@ -26,7 +26,7 @@ def test_single_page_text(outdir):
pdf.showPage()
pdf.save()
pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename))
pdfinfo = pageinfo.PdfInfo(str(filename))
assert len(pdfinfo) == 1
page = pdfinfo[0]
@@ -53,7 +53,7 @@ def test_single_page_image(outdir):
layout_fun=layout_fun)
filename.write_bytes(pdf_bytes)
pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename))
pdfinfo = pageinfo.PdfInfo(str(filename))
assert len(pdfinfo) == 1
page = pdfinfo[0]
@@ -83,7 +83,7 @@ def test_single_page_inline_image(outdir):
pdf.showPage()
pdf.save()
pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename))
pdfinfo = pageinfo.PdfInfo(str(filename))
print(pdfinfo)
pdfimage = pdfinfo[0]['images'][0]
assert (pdfimage['dpi_w'] - 8) < 1e-5
@@ -94,7 +94,7 @@ def test_single_page_inline_image(outdir):
def test_jpeg(resources, outdir):
filename = resources / 'c02-22.pdf'
pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename))
pdfinfo = pageinfo.PdfInfo(str(filename))
pdfimage = pdfinfo[0]['images'][0]
assert pdfimage['enc'] == 'jpeg'
@@ -104,7 +104,7 @@ def test_jpeg(resources, outdir):
def test_form_xobject(resources):
filename = resources / 'formxobject.pdf'
pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename))
pdfinfo = pageinfo.PdfInfo(str(filename))
pdfimage = pdfinfo[0]['images'][0]
assert pdfimage['width'] == 50
@@ -112,6 +112,6 @@ def test_form_xobject(resources):
def test_no_contents(resources):
filename = resources / 'no_contents.pdf'
pdfinfo = pageinfo.pdf_get_all_pageinfo(str(filename))
pdfinfo = pageinfo.PdfInfo(str(filename))
assert len(pdfinfo[0]['images']) == 0
assert pdfinfo[0]['has_text'] == False