Los resaltados se colocan mal en paginas rotadas
Ubicacion:
pdf_compare/comparator.py:94-97python
| 94 | def extract_words_with_bbox(self, page): |
| 95 | """Extract words with their bounding boxes from a page.""" |
| 96 | words = page.get_text("words") # Returns list of (x0, y0, x1, y1, "word", block_no, line_no, word_no) |
| 97 | return [{'text': w[4], 'bbox': fitz.Rect(w[:4])} for w in words] |
| 98 | |
| 99 | def compare_visuals(self): |
| 100 | """ |
Que pasa
get_text('words') devuelve las cajas en el sistema de coordenadas SIN rotar de la pagina, mientras que page.rect y show_pdf_page trabajan en el espacio ya rotado. El codigo usa la caja cruda y solo le suma los margenes, asi que en cualquier PDF con /Rotate distinto de 0 los rectangulos rojos y verdes se pintan sobre palabras que no son.
Impact
Verificado: en una pagina rotada 90 grados, una palabra cuya caja cruda es (100, 88) aparece realmente en (689, 100). Ambas caen dentro del rect de la pagina, por lo que no hay ni error ni aviso: el informe sale con aspecto correcto y senala texto equivocado. Un informe de diferencias que miente es peor que uno que falla.
Por que importa
Extraer contenido y componer una pagina son dos espacios de coordenadas distintos, y PyMuPDF no los unifica por ti: expone page.rotation_matrix precisamente porque espera que hagas la conversion. Siempre que mezcles coordenadas de dos APIs, comprueba que hablan del mismo sistema antes de sumarles un offset.
Sugerencia
Normalizar en el unico punto donde se leen las cajas, para que el resto del codigo no tenga que saber nada de rotaciones.
Recommended change
Current code
def extract_words_with_bbox(self, page):
words = page.get_text("words")
return [{'text': w[4], 'bbox': fitz.Rect(w[:4])} for w in words]Suggested code
def extract_words_with_bbox(self, page):
"""Las cajas llegan sin rotar; se pasan al espacio visible de la pagina."""
words = page.get_text("words")
rot = page.rotation_matrix
return [{'text': w[4], 'bbox': fitz.Rect(w[:4]) * rot} for w in words]Tests
No hay ningun test. Hace falta uno que compare un PDF rotado 90 grados con una variante suya y afirme que la caja resaltada cae sobre la palabra cambiada; con la rotacion a 0 el bug no se manifiesta, asi que el caso rotado es imprescindible.