pdfnet coordinate transformer wip

This commit is contained in:
Matthias Bisping 2022-04-03 03:19:46 +02:00
parent 41f783dc5d
commit f6a7a14a20
3 changed files with 86 additions and 9 deletions

View File

@ -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

View File

@ -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}}

View File

@ -1,14 +1,21 @@
import os
import tempfile
import time
import numpy as np import numpy as np
import pytest import pytest
from fpdf import fpdf from fpdf import fpdf
from funcy import project, second from funcy import project, second
from pdf2image import pdf2image 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.extractor import ImageMetadataPair
from image_prediction.image_extractor.extractors.parsable import ParsablePDFImageExtractor from image_prediction.image_extractor.extractors.parsable import ParsablePDFImageExtractor
from image_prediction.info import Info from image_prediction.info import Info
from image_prediction.transformer.transformers.coordinate.fitz import FitzCoordinateTransformer from image_prediction.transformer.transformers.coordinate.fitz import FitzCoordinateTransformer
from image_prediction.transformer.transformers.coordinate.fpdf import FPDFCoordinateTransformer 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 from test.conftest import array_to_image, add_image
@ -19,7 +26,7 @@ def coordinate_test_image():
@pytest.fixture @pytest.fixture
def coordinate_test_fpdf(): def coordinate_test_fpdf():
pdf = fpdf.FPDF(unit="pt", format=(200, 200)) pdf = fpdf.FPDF(unit="pt", format=(300, 300))
return pdf return pdf
@ -27,20 +34,38 @@ def get_fpdf_coordinates(corner):
metadata = base_position_metadata() metadata = base_position_metadata()
if corner == "top_left": 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": 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 return metadata
def get_fitz_coordinates(corner): 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(): def base_position_metadata(width=100, height=100):
return {Info.X1: 0, Info.Y1: 0, Info.WIDTH: 100, Info.HEIGHT: 100, Info.PAGE_IDX: 0} 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 @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("corner", ["top_left", "bottom_left"])
@pytest.mark.parametrize("coordinate_system", ["fitz"]) @pytest.mark.parametrize("coordinate_system", ["fitz"])
def test_coordinate_transformer( def test_fitz_coordinate_transformer(
position_metadata_in_given_system, position_metadata_in_reference_system, coordinate_test_pdf 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() # coordinate_test_page_image.show()
metadata_extracted = next(map(second, ParsablePDFImageExtractor()(coordinate_test_pdf))) 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 position_extracted == position_metadata_in_given_system
assert FitzCoordinateTransformer()(position_metadata_in_given_system) == position_metadata_in_reference_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()