feat: enable document orientation detection for scanned PDFs
- Enable PP-StructureV3's use_doc_orientation_classify feature - Detect rotation angle from doc_preprocessor_res.angle - Swap page dimensions (width <-> height) for 90°/270° rotations - Output PDF now correctly displays landscape-scanned content Also includes: - Archive completed openspec proposals - Add simplify-frontend-ocr-config proposal (pending) - Code cleanup and frontend simplification 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -15,6 +15,8 @@ from datetime import datetime
|
||||
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
from app.utils.bbox_utils import normalize_bbox
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Color palette for different element types (RGB)
|
||||
@@ -238,42 +240,8 @@ class PPStructureDebug:
|
||||
draw.text((legend_x + 18, legend_y), "raw_ocr", fill=(0, 0, 0), font=font)
|
||||
|
||||
def _normalize_bbox(self, bbox: Any) -> Optional[Tuple[float, float, float, float]]:
|
||||
"""Normalize bbox to (x0, y0, x1, y1) format."""
|
||||
if not bbox:
|
||||
return None
|
||||
|
||||
try:
|
||||
# Handle nested list format [[x1,y1], [x2,y2], [x3,y3], [x4,y4]]
|
||||
if isinstance(bbox, (list, tuple)) and len(bbox) >= 1:
|
||||
if isinstance(bbox[0], (list, tuple)):
|
||||
xs = [pt[0] for pt in bbox if len(pt) >= 2]
|
||||
ys = [pt[1] for pt in bbox if len(pt) >= 2]
|
||||
if xs and ys:
|
||||
return (min(xs), min(ys), max(xs), max(ys))
|
||||
|
||||
# Handle flat list [x0, y0, x1, y1]
|
||||
if isinstance(bbox, (list, tuple)) and len(bbox) == 4:
|
||||
return (float(bbox[0]), float(bbox[1]), float(bbox[2]), float(bbox[3]))
|
||||
|
||||
# Handle flat polygon [x1, y1, x2, y2, ...]
|
||||
if isinstance(bbox, (list, tuple)) and len(bbox) >= 8:
|
||||
xs = [bbox[i] for i in range(0, len(bbox), 2)]
|
||||
ys = [bbox[i] for i in range(1, len(bbox), 2)]
|
||||
return (min(xs), min(ys), max(xs), max(ys))
|
||||
|
||||
# Handle dict format
|
||||
if isinstance(bbox, dict):
|
||||
return (
|
||||
float(bbox.get('x0', bbox.get('x_min', 0))),
|
||||
float(bbox.get('y0', bbox.get('y_min', 0))),
|
||||
float(bbox.get('x1', bbox.get('x_max', 0))),
|
||||
float(bbox.get('y1', bbox.get('y_max', 0)))
|
||||
)
|
||||
|
||||
except (TypeError, ValueError, IndexError) as e:
|
||||
logger.warning(f"Failed to normalize bbox {bbox}: {e}")
|
||||
|
||||
return None
|
||||
"""Normalize bbox to (x0, y0, x1, y1) format. Uses shared bbox utility."""
|
||||
return normalize_bbox(bbox)
|
||||
|
||||
def _generate_summary(
|
||||
self,
|
||||
|
||||
Reference in New Issue
Block a user