pdfnet coordinate transformer wip
This commit is contained in:
parent
41f783dc5d
commit
f6a7a14a20
@ -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
|
||||
|
||||
@ -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}}
|
||||
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user