Refactor pdf_get_all_pageinfo to PdfInfo
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user