diff --git a/image_prediction/transformer/transformers/coordinate/fitz.py b/image_prediction/transformer/transformers/coordinate/fitz.py new file mode 100644 index 0000000..17605f1 --- /dev/null +++ b/image_prediction/transformer/transformers/coordinate/fitz.py @@ -0,0 +1,8 @@ +from image_prediction.transformer.transformer import Transformer + + +class FitzCoordinateTransformer(Transformer): + + def transform(self, metadata: dict): + """Fitz uses top left corner as origin; we take this as the reference coordinate system.""" + return metadata diff --git a/test/unit_tests/coordinate_transformer_test.py b/test/unit_tests/coordinate_transformer_test.py index a8db94a..3154589 100644 --- a/test/unit_tests/coordinate_transformer_test.py +++ b/test/unit_tests/coordinate_transformer_test.py @@ -1,10 +1,13 @@ import numpy as np import pytest from fpdf import fpdf +from funcy import project, second from pdf2image import pdf2image from image_prediction.image_extractor.extractor import ImageMetadataPair +from image_prediction.image_extractor.extractors.parsable import ParsablePDFImageExtractor from image_prediction.info import Info +from image_prediction.transformer.transformers.coordinate.fitz import FitzCoordinateTransformer from image_prediction.transformer.transformers.coordinate.fpdf import FPDFCoordinateTransformer from test.conftest import array_to_image, add_image @@ -23,10 +26,22 @@ def coordinate_test_fpdf(): def get_fpdf_coordinates(corner): metadata = base_position_metadata() - if corner == "top left": + if corner == "top_left": metadata.update({Info.X1: 0, Info.Y1: 0}) - elif corner == "bottom left": + elif corner == "bottom_left": + metadata.update({Info.X1: 0, Info.Y1: 100}) + + return metadata + + +def get_fitz_coordinates(corner): + metadata = base_position_metadata() + + if corner == "top_left": + metadata.update({Info.X1: 0, Info.Y1: 0}) + + elif corner == "bottom_left": metadata.update({Info.X1: 0, Info.Y1: 100}) return metadata @@ -41,6 +56,12 @@ def position_metadata(corner, coordinate_system): if coordinate_system == "fpdf": return get_fpdf_coordinates(corner) + elif coordinate_system == "fitz": + return get_fitz_coordinates(corner) + + else: + raise ValueError(f"Unknown coordinate system: {coordinate_system}") + @pytest.fixture def coordinate_test_pdf(position_metadata, coordinate_test_image, coordinate_test_fpdf): @@ -53,9 +74,20 @@ def coordinate_test_page_image(coordinate_test_pdf): return pdf2image.convert_from_bytes(coordinate_test_pdf)[0] -@pytest.mark.parametrize("corner", ["top left", "bottom left"]) +@pytest.mark.parametrize("corner", ["top_left", "bottom_left"]) @pytest.mark.parametrize("coordinate_system", ["fpdf"]) -def test_coordinate_transformer(position_metadata, coordinate_test_page_image): +def test_fpdf_coordinate_transformer(position_metadata): + assert FPDFCoordinateTransformer()(position_metadata) == position_metadata + + +@pytest.mark.parametrize("corner", ["top_left", "bottom_left"]) +@pytest.mark.parametrize("coordinate_system", ["fitz"]) +def test_coordinate_transformer(position_metadata, coordinate_test_pdf): # coordinate_test_pdf.output("/tmp/x.pdf") # coordinate_test_page_image.show() - assert FPDFCoordinateTransformer()(position_metadata) == position_metadata + + metadata_extracted = next(map(second, ParsablePDFImageExtractor()(coordinate_test_pdf))) + position_extracted = project(metadata_extracted, list(position_metadata.keys())) + + assert position_extracted == position_metadata + assert FitzCoordinateTransformer()(position_metadata) == position_metadata