From f6a7a14a20adb3ea33b787adfbaf9955dddcb327 Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Sun, 3 Apr 2022 03:19:46 +0200 Subject: [PATCH] pdfnet coordinate transformer wip --- .../coordinate/coordinate_transformer.py | 15 +++++ .../transformers/coordinate/pdfnet.py | 18 ++++++ .../unit_tests/coordinate_transformer_test.py | 62 ++++++++++++++++--- 3 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 image_prediction/transformer/transformers/coordinate/coordinate_transformer.py create mode 100644 image_prediction/transformer/transformers/coordinate/pdfnet.py diff --git a/image_prediction/transformer/transformers/coordinate/coordinate_transformer.py b/image_prediction/transformer/transformers/coordinate/coordinate_transformer.py new file mode 100644 index 0000000..9a4df05 --- /dev/null +++ b/image_prediction/transformer/transformers/coordinate/coordinate_transformer.py @@ -0,0 +1,15 @@ +import abc + +from image_prediction.transformer.transformer import Transformer + + +class PDFNetCoordinateTransformer(Transformer): + + @abc.abstractmethod + def forward(self, metadata): + raise NotImplementedError + + @abc.abstractmethod + def backward(self, metadata): + raise NotImplementedError + diff --git a/image_prediction/transformer/transformers/coordinate/pdfnet.py b/image_prediction/transformer/transformers/coordinate/pdfnet.py new file mode 100644 index 0000000..48367b5 --- /dev/null +++ b/image_prediction/transformer/transformers/coordinate/pdfnet.py @@ -0,0 +1,18 @@ +from operator import itemgetter + +from funcy import omit + +from image_prediction.info import Info +from image_prediction.transformer.transformer import Transformer + + +class PDFNetCoordinateTransformer(Transformer): + + def transform(self, metadata: dict): + y1, y2, page_height = itemgetter(Info.Y1, Info.Y2, Info.PAGE_HEIGHT)(metadata) + y1_t = page_height - y2 + y2_t = page_height - y1 + return {**omit(metadata, [Info.Y1, Info.Y2]), **{Info.Y1: y1_t, Info.Y2: y2_t}} + + + diff --git a/test/unit_tests/coordinate_transformer_test.py b/test/unit_tests/coordinate_transformer_test.py index 53a9f59..2369af9 100644 --- a/test/unit_tests/coordinate_transformer_test.py +++ b/test/unit_tests/coordinate_transformer_test.py @@ -1,14 +1,21 @@ +import os +import tempfile +import time + import numpy as np import pytest from fpdf import fpdf from funcy import project, second from pdf2image import pdf2image +from image_prediction.formatter.formatters.enum import EnumFormatter 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 image_prediction.transformer.transformers.coordinate.pdfnet import PDFNetCoordinateTransformer +from image_prediction.utils.pdf_annotation import annotate_pdf, draw_metadata_box from test.conftest import array_to_image, add_image @@ -19,7 +26,7 @@ def coordinate_test_image(): @pytest.fixture def coordinate_test_fpdf(): - pdf = fpdf.FPDF(unit="pt", format=(200, 200)) + pdf = fpdf.FPDF(unit="pt", format=(300, 300)) return pdf @@ -27,20 +34,38 @@ def get_fpdf_coordinates(corner): metadata = base_position_metadata() if corner == "top_left": - metadata.update({Info.X1: 0, Info.Y1: 0}) + metadata.update({Info.X1: 0, Info.Y1: 0, Info.X2: 100, Info.Y2: 100}) elif corner == "bottom_left": - metadata.update({Info.X1: 0, Info.Y1: 100}) + metadata.update({Info.X1: 0, Info.Y1: 200, Info.X2: 100, Info.Y2: 300}) return metadata def get_fitz_coordinates(corner): - return get_fpdf_coordinates(corner) # Identical coordinate systems + metadata = base_position_metadata() + + if corner == "top_left": + metadata.update({Info.X1: 0, Info.Y1: 0, Info.X2: 100, Info.Y2: 100}) + + elif corner == "bottom_left": + metadata.update({Info.X1: 0, Info.Y1: 200, Info.X2: 100, Info.Y2: 300}) + + return metadata -def base_position_metadata(): - return {Info.X1: 0, Info.Y1: 0, Info.WIDTH: 100, Info.HEIGHT: 100, Info.PAGE_IDX: 0} +def base_position_metadata(width=100, height=100): + return { + Info.X1: 0, + Info.Y1: 0, + Info.X2: width, + Info.Y2: height, + Info.WIDTH: width, + Info.HEIGHT: height, + Info.PAGE_IDX: 0, + Info.PAGE_WIDTH: 300, + Info.PAGE_HEIGHT: 300, + } @pytest.fixture @@ -79,10 +104,10 @@ def test_fpdf_coordinate_transformer(position_metadata_in_given_system, position @pytest.mark.parametrize("corner", ["top_left", "bottom_left"]) @pytest.mark.parametrize("coordinate_system", ["fitz"]) -def test_coordinate_transformer( - position_metadata_in_given_system, position_metadata_in_reference_system, coordinate_test_pdf +def test_fitz_coordinate_transformer( + position_metadata_in_given_system, position_metadata_in_reference_system, coordinate_test_pdf, coordinate_test_fpdf ): - # coordinate_test_pdf.output("/tmp/x.pdf") + # coordinate_test_fpdf.output("/tmp/x.pdf") # coordinate_test_page_image.show() metadata_extracted = next(map(second, ParsablePDFImageExtractor()(coordinate_test_pdf))) @@ -90,3 +115,22 @@ def test_coordinate_transformer( assert position_extracted == position_metadata_in_given_system assert FitzCoordinateTransformer()(position_metadata_in_given_system) == position_metadata_in_reference_system + + +@pytest.mark.parametrize("corner", ["bottom_left"]) +@pytest.mark.parametrize("coordinate_system", ["fitz"]) +def test_pdfnet_coordinate_transformer( + position_metadata_in_given_system, position_metadata_in_reference_system, coordinate_test_fpdf, coordinate_test_page_image +): + # coordinate_test_page_image.show() + # coordinate_test_fpdf.output("/tmp/xyz.pdf") + + position_metadata_transformed = PDFNetCoordinateTransformer()(position_metadata_in_given_system) + + with tempfile.NamedTemporaryFile(suffix=".pdf") as f: + coordinate_test_fpdf.output(f.name) + draw_metadata_box(f.name, EnumFormatter()(position_metadata_transformed), + # os.path.join("/tmp", os.path.basename(f.name.replace(".pdf", "_annotated.pdf"))) + "/tmp/bla.pdf" + ) + input()