Attempt to deal with oddball mediaboxes

This commit is contained in:
James R. Barlow
2024-02-11 15:34:54 -08:00
parent 11f53fe9a9
commit 3b9d4b7f0a
4 changed files with 41 additions and 10 deletions
+32 -5
View File
@@ -718,9 +718,8 @@ def create_pdf_page_from_image(
if swap_axis:
pagesize = pagesize[1], pagesize[0]
# Create a new single page PDF to hold
bio = BytesIO()
# This create a single page PDF
with open(image, 'rb') as imfile:
log.debug('convert')
@@ -795,19 +794,47 @@ def ocr_engine_textonly_pdf(
return output_pdf, output_text
def _offset_rect(rect: tuple[float, float, float, float], offset: tuple[float, float]):
"""Offset a rectangle by a given amount."""
return (
rect[0] + offset[0],
rect[1] + offset[1],
rect[2] + offset[0],
rect[3] + offset[1],
)
def fix_pagepdf_boxes(
infile: Path | BinaryIO,
out_file: Path,
page_context: PageContext,
swap_axis: bool = False,
) -> Path:
"""Fix the bounding boxes in a single page PDF."""
"""Fix the bounding boxes in a single page PDF.
The single page PDF is created with a normal MediaBox with its lower left corner
at (0, 0). infile is the single page PDF. page_context.mediabox has the original
file's mediabox, which may have a different origin. We needto adjust the other
boxes in the single page PDF to match the effect they had on the original page.
When correcting page rotation, we create a single page PDF that is correctly
rotated instead of an incorrectly rotated and then setting page.Rotate on it.
If rotation is either 90 or 270 degrees, then this function can be called
with swap_axis to swap the X and Y coordinates of all the boxes.
We are not concerned with solving degenerate cases where the boxes overlap or
or express invalid rectangles. We merely pass the boxes, producing a
transformation equivalent to the change made by constructing a new page image.
"""
with pikepdf.open(infile) as pdf:
for page in pdf.pages:
# page.BleedBox = page_context.pageinfo.bleedbox
# page.ArtBox = page_context.pageinfo.artbox
cropbox = page_context.pageinfo.cropbox
trimbox = page_context.pageinfo.trimbox
mediabox = page_context.pageinfo.mediabox
offset = mediabox[0], mediabox[1]
cropbox = _offset_rect(page_context.pageinfo.cropbox, offset)
trimbox = _offset_rect(page_context.pageinfo.trimbox, offset)
if swap_axis:
cropbox = cropbox[1], cropbox[0], cropbox[3], cropbox[2]
trimbox = trimbox[1], trimbox[0], trimbox[3], trimbox[2]
-4
View File
@@ -22,7 +22,6 @@ from ocrmypdf._graft import OcrGrafter
from ocrmypdf._jobcontext import PageContext, PdfContext
from ocrmypdf._pipeline import (
copy_final,
fix_pagepdf_boxes,
get_pdfinfo,
is_ocr_required,
merge_sidecars,
@@ -81,9 +80,6 @@ def _exec_page_sync(page_context: PageContext) -> PageResult:
page_context
)
ocr_out, text_out = _image_to_ocr_text(page_context, ocr_image_out)
# fix_pagepdf_boxes(ocr_out, page_context)
return PageResult(
pageno=page_context.pageno,
pdf_page_from_image=pdf_page_from_image_out,
+2
View File
@@ -26,6 +26,7 @@ from typing import (
import img2pdf
import pikepdf
from deprecation import deprecated
log = logging.getLogger(__name__)
@@ -136,6 +137,7 @@ class Resolution(Generic[T]):
return self._isclose(self.x, other.x) and self._isclose(self.y, other.y)
@deprecated(deprecated_in='15.4.0')
class NeverRaise(Exception):
"""An exception that is never raised."""
+7 -1
View File
@@ -857,6 +857,7 @@ class PageInfo:
# self._artbox = [float(d) for d in page.artbox.as_list()]
# self._bleedbox = [float(d) for d in page.bleedbox.as_list()]
self._cropbox = [float(d) for d in page.cropbox.as_list()]
self._mediabox = [float(d) for d in page.mediabox.as_list()]
self._trimbox = [float(d) for d in page.trimbox.as_list()]
check_this_page = pageno in check_pages
@@ -977,9 +978,14 @@ class PageInfo:
@property
def cropbox(self) -> FloatRect:
"""Return trimbox of page in PDF coordinates."""
"""Return cropbox of page in PDF coordinates."""
return self._cropbox
@property
def mediabox(self) -> FloatRect:
"""Return mediabox of page in PDF coordinates."""
return self._mediabox
@property
def trimbox(self) -> FloatRect:
"""Return trimbox of page in PDF coordinates."""