From 334a07c8390cfc76842ccea93dbca66fe69789d9 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sun, 19 Nov 2023 23:51:27 -0800 Subject: [PATCH] Refactor debug printing --- src/ocrmypdf/hocrtransform/__init__.py | 50 ++++++++++++++------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/ocrmypdf/hocrtransform/__init__.py b/src/ocrmypdf/hocrtransform/__init__.py index 15c8c5f4..925b48a3 100755 --- a/src/ocrmypdf/hocrtransform/__init__.py +++ b/src/ocrmypdf/hocrtransform/__init__.py @@ -11,6 +11,7 @@ from __future__ import annotations import argparse import os import re +from dataclasses import dataclass from math import atan, cos, sin from pathlib import Path from typing import Any, NamedTuple @@ -113,6 +114,16 @@ class Rect(NamedTuple): ) +@dataclass +class DebugRenderOptions: + """A class for managing rendering options.""" + + render_paragraph_bbox: bool + render_baseline: bool + render_triangle: bool + render_word_bbox: bool + + class HocrTransformError(Exception): """Error while applying hOCR transform.""" @@ -160,6 +171,12 @@ class HocrTransform: break if self.width is None or self.height is None: raise HocrTransformError("hocr file is missing page dimensions") + self.render_options = DebugRenderOptions( + render_baseline=True, + render_triangle=True, + render_word_bbox=False, + render_paragraph_bbox=False, + ) def __str__(self): # pragma: no cover """Return the textual content of the HTML body.""" @@ -276,7 +293,8 @@ class HocrTransform: pxl_coords = self.element_coordinates(elem) pt = self.pt_from_pixel(pxl_coords, bottomup=True) # draw cyan box around paragraph - if show_bounding_boxes and False: # pragma: no cover + if self.render_options.render_paragraph_bbox: + # pragma: no cover pdf.set_stroke_color(cyan) pdf.set_line_width(0.1) # no line for bounding box pdf.rect(pt.x1, pt.y2, pt.x2 - pt.x1, pt.y2 - pt.y1, fill=0) @@ -296,7 +314,6 @@ class HocrTransform: fontname, invisible_text, interword_spaces, - show_bounding_boxes, ) if not found_lines: @@ -309,7 +326,6 @@ class HocrTransform: fontname, invisible_text, interword_spaces, - show_bounding_boxes, ) # put the image on the page, scaled to fill the page if image_filename is not None: @@ -331,7 +347,6 @@ class HocrTransform: fontname: str, invisible_text: bool, interword_spaces: bool, - show_bounding_boxes: bool, ): if line is None: return @@ -372,9 +387,7 @@ class HocrTransform: # origin bottom left, y2 > y1. baseline_y1 = -intercept - self._do_debug_baseline( - pdf, show_bounding_boxes, slope, cm_line_box, baseline_y1 - ) + self._do_debug_baseline(pdf, slope, cm_line_box, baseline_y1) text.set_text_transform(1, 0, 0, 1, line_box.x1, baseline_y1) pdf.set_fill_color(black) # text in black @@ -384,7 +397,6 @@ class HocrTransform: pdf, fontname, interword_spaces, - show_bounding_boxes, line_height, line_matrix, cm_line_box, @@ -401,7 +413,6 @@ class HocrTransform: pdf, fontname, interword_spaces, - show_bounding_boxes, line_height, line_matrix, cm_line_box, @@ -438,10 +449,8 @@ class HocrTransform: font_width = pdf.string_width(elemtxt, fontname, fontsize) # draw the bbox border - self._do_debug_word_triangle(pdf, show_bounding_boxes, cm_box) - self._do_debug_bbox( - pdf, show_bounding_boxes, line_height, cm_line_box, cm_box, box_width - ) + self._do_debug_word_triangle(pdf, cm_box) + self._do_debug_bbox(pdf, line_height, cm_line_box, cm_box, box_width) # Adjust relative position of cursor # This is equivalent to: @@ -478,10 +487,9 @@ class HocrTransform: def _do_debug_word_triangle( self, pdf, - show_bounding_boxes, cm_box, ): - if not show_bounding_boxes: # pragma: no cover + if not self.render_options.render_triangle: # pragma: no cover return pdf._cs.push() pdf.set_dashes() @@ -493,10 +501,8 @@ class HocrTransform: pdf.line(cm_box.x1, cm_box.y1, cm_box.x1, cm_box.y2) # rise pdf._cs.pop() - def _do_debug_bbox( - self, pdf, show_bounding_boxes, line_height, cm_line_box, cm_box, box_width - ): - if not show_bounding_boxes: # pragma: no cover + def _do_debug_bbox(self, pdf, line_height, cm_line_box, cm_box, box_width): + if not self.render_options.render_word_bbox: # pragma: no cover return pdf._cs.push() pdf.set_dashes() @@ -505,10 +511,8 @@ class HocrTransform: pdf.rect(cm_box.x1, cm_line_box.y1, box_width, line_height, fill=0) pdf._cs.pop() - def _do_debug_baseline( - self, pdf, show_bounding_boxes, slope, line_box, baseline_y1 - ): - if not show_bounding_boxes: + def _do_debug_baseline(self, pdf, slope, line_box, baseline_y1): + if not self.render_options.render_baseline: return # draw the baseline in magenta, dashed pdf.set_dashes()