diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/PropertiesMapper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/PropertiesMapper.java index 8468a719..c6a13cc4 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/PropertiesMapper.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/data/mapper/PropertiesMapper.java @@ -1,6 +1,6 @@ package com.iqser.red.service.redaction.v1.server.layoutparsing.document.data.mapper; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations.parseRectangle2D; +import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleMapper.parseRectangle2D; import java.util.HashMap; import java.util.Map; @@ -9,7 +9,7 @@ import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.no import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SectionNode; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableCellNode; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.TableNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleMapper; import com.iqser.red.service.redaction.v1.server.redaction.model.ImageType; public class PropertiesMapper { @@ -19,7 +19,7 @@ public class PropertiesMapper { Map properties = new HashMap<>(); properties.put("imageType", image.getImageType().toString()); properties.put("transparency", String.valueOf(image.isTransparent())); - properties.put("position", RectangleTransformations.toString(image.getPosition())); + properties.put("position", RectangleMapper.toString(image.getPosition())); properties.put("id", image.getId()); return properties; } @@ -35,7 +35,7 @@ public class PropertiesMapper { if (tableCell.getPages().size() > 1 || tableCell.getBBox().keySet().size() > 1) { throw new IllegalArgumentException("TableCell can only occur on a single page!"); } - String bBoxString = RectangleTransformations.toString(tableCell.getBBox().get(tableCell.getPages().stream().findFirst().get())); + String bBoxString = RectangleMapper.toString(tableCell.getBBox().get(tableCell.getPages().stream().findFirst().get())); properties.put("bBox", bBoxString); return properties; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/DocumentGraphFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/DocumentGraphFactory.java index 85f8f1c0..49a41047 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/DocumentGraphFactory.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/factory/DocumentGraphFactory.java @@ -32,7 +32,7 @@ import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.no import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SectionNode; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleMapper; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.TextPositionOperations; import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; @@ -108,7 +108,7 @@ public class DocumentGraphFactory { public void addImage(SectionNode sectionNode, ClassifiedImage image, Context context) { - Rectangle2D position = RectangleTransformations.toRectangle2D(image.getPosition()); + Rectangle2D position = RectangleMapper.toRectangle2D(image.getPosition()); PageNode page = context.getPage(image.getPage()); ImageNode imageNode = ImageNode.builder() .id(IdBuilder.buildId(Set.of(page), List.of(position))) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/ManualRedactionApplicationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/ManualRedactionApplicationService.java index 0929f62d..98034bf9 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/ManualRedactionApplicationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/services/ManualRedactionApplicationService.java @@ -8,7 +8,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionPosition; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleMapper; import lombok.RequiredArgsConstructor; @@ -27,7 +27,7 @@ public class ManualRedactionApplicationService { .findFirst() .orElseThrow(() -> new NoSuchElementException("No redaction position with matching annotation id found!")); - redactionPositionToBeResized.setRectanglePerLine(manualResizeRedaction.getPositions().stream().map(RectangleTransformations::toRectangle2D).toList()); + redactionPositionToBeResized.setRectanglePerLine(manualResizeRedaction.getPositions().stream().map(RectangleMapper::toRectangle2D).toList()); int newStartOffset; if (manualResizeRedaction.getValue().length() > entityToBeResized.getValue().length()) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleMapper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleMapper.java new file mode 100644 index 00000000..346d49ae --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleMapper.java @@ -0,0 +1,79 @@ +package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; + +import static java.lang.String.format; + +import java.awt.geom.Rectangle2D; +import java.util.Arrays; +import java.util.List; + +import org.apache.pdfbox.pdmodel.common.PDRectangle; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; +import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; +import com.iqser.red.service.redaction.v1.server.redaction.model.RedRectangle2D; + +public class RectangleMapper { + + public static Rectangle2D toRectangle2D(AbstractPageBlock abstractPageBlock) { + + return new Rectangle2D.Float(abstractPageBlock.getMinX(), abstractPageBlock.getMinY(), abstractPageBlock.getWidth(), abstractPageBlock.getHeight()); + } + + + public static Rectangle2D toRectangle2D(RedRectangle2D redRectangle2D) { + + return new Rectangle2D.Double(redRectangle2D.getX(), redRectangle2D.getY(), redRectangle2D.getWidth(), redRectangle2D.getHeight()); + } + + + public static Rectangle2D toRectangle2D(Rectangle redactionLogRectangle) { + + return new Rectangle2D.Double(redactionLogRectangle.getTopLeft().getX(), + redactionLogRectangle.getTopLeft().getY(), + redactionLogRectangle.getWidth(), + redactionLogRectangle.getHeight()); + } + + + public static Rectangle2D toRectangle2D(PDRectangle rectangle) { + + return new Rectangle2D.Double(rectangle.getLowerLeftX(), rectangle.getLowerLeftY(), rectangle.getWidth(), rectangle.getHeight()); + } + + + public static Rectangle toRedactionLogRectangle(Rectangle2D rectangle2D, int pageNumber) { + + return new Rectangle(new Point((float) rectangle2D.getMinX(), (float) rectangle2D.getMinY()), (float) rectangle2D.getWidth(), (float) rectangle2D.getHeight(), pageNumber); + } + + + public static com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle toAnnotationRectangle(Rectangle2D rectangle2D, int pageNumber) { + + return new com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle((float) rectangle2D.getMaxX(), + (float) rectangle2D.getMaxY(), + (float) rectangle2D.getWidth(), + (float) rectangle2D.getHeight(), + pageNumber); + } + + + public static String toString(Rectangle2D rectangle2D) { + + return format("%f,%f,%f,%f", rectangle2D.getX(), rectangle2D.getY(), rectangle2D.getWidth(), rectangle2D.getHeight()); + } + + + public static Rectangle2D parseRectangle2D(String bBox) { + + List floats = Arrays.stream(bBox.split(",")).map(Float::parseFloat).toList(); + return new Rectangle2D.Float(floats.get(0), floats.get(1), floats.get(2), floats.get(3)); + } + + + public static Rectangle2D toRectangle2D(com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle rect) { + + return new Rectangle2D.Double(rect.getTopLeftX() - rect.getWidth(), rect.getTopLeftY() - rect.getHeight(), rect.getWidth(), rect.getHeight()); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformations.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformations.java index 31d62e79..9226e794 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformations.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/document/utils/RectangleTransformations.java @@ -1,10 +1,7 @@ package com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils; -import static java.lang.String.format; - import java.awt.geom.Area; import java.awt.geom.Rectangle2D; -import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.function.BiConsumer; @@ -15,11 +12,9 @@ import java.util.stream.Collector; import org.apache.pdfbox.pdmodel.common.PDRectangle; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.redaction.model.RedRectangle2D; public class RectangleTransformations { @@ -31,52 +26,7 @@ public class RectangleTransformations { public static Rectangle2D bBoxUnionAbstractTextContainer(List abstractPageBlocks) { - return abstractPageBlocks.stream().map(RectangleTransformations::toRectangle2D).collect(new Rectangle2DUnion()); - } - - - public static Rectangle2D bBoxUnionAtomicTextBlock(List atomicTextBlocks) { - - return atomicTextBlocks.stream().flatMap(atomicTextBlock -> atomicTextBlock.getPositions().stream()).collect(new Rectangle2DUnion()); - } - - - public static Rectangle2D bBoxUnionRectangle(List rectangles) { - - return rectangles.stream().map(RectangleTransformations::toRectangle2D).collect(new Rectangle2DUnion()); - } - - - public static Rectangle2D rectangleUnion(List rectangle2DList) { - - return rectangle2DList.stream().collect(new Rectangle2DUnion()); - } - - - public static Rectangle2D toRectangle2D(AbstractPageBlock abstractPageBlock) { - - return new Rectangle2D.Float(abstractPageBlock.getMinX(), abstractPageBlock.getMinY(), abstractPageBlock.getWidth(), abstractPageBlock.getHeight()); - } - - - public static Rectangle2D toRectangle2D(RedRectangle2D redRectangle2D) { - - return new Rectangle2D.Double(redRectangle2D.getX(), redRectangle2D.getY(), redRectangle2D.getWidth(), redRectangle2D.getHeight()); - } - - - public static Rectangle2D toRectangle2D(Rectangle rectangle) { - - return new Rectangle2D.Double(rectangle.getTopLeft().getX() - rectangle.getWidth(), - rectangle.getTopLeft().getY() - rectangle.getHeight(), - rectangle.getWidth(), - rectangle.getHeight()); - } - - - public static Rectangle2D toRectangle2D(PDRectangle rectangle) { - - return new Rectangle2D.Double(rectangle.getLowerLeftX(), rectangle.getLowerLeftY(), rectangle.getWidth(), rectangle.getHeight()); + return abstractPageBlocks.stream().map(RectangleMapper::toRectangle2D).collect(new Rectangle2DUnion()); } @@ -93,38 +43,21 @@ public class RectangleTransformations { } - public static Rectangle toRectangle(Rectangle2D rectangle2D, int pageNumber) { + public static Rectangle2D bBoxUnionAtomicTextBlock(List atomicTextBlocks) { - return new Rectangle(new Point((float) rectangle2D.getMaxX(), (float) rectangle2D.getMaxY()), (float) rectangle2D.getWidth(), (float) rectangle2D.getHeight(), pageNumber); + return atomicTextBlocks.stream().flatMap(atomicTextBlock -> atomicTextBlock.getPositions().stream()).collect(new Rectangle2DUnion()); } - public static com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle toAnnotationRectangle(Rectangle2D rectangle2D, int pageNumber) { + public static Rectangle2D bBoxUnionRectangle(List rectangles) { - return new com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle((float) rectangle2D.getMaxX(), - (float) rectangle2D.getMaxY(), - (float) rectangle2D.getWidth(), - (float) rectangle2D.getHeight(), - pageNumber); + return rectangles.stream().map(RectangleMapper::toRectangle2D).collect(new Rectangle2DUnion()); } - public static String toString(Rectangle2D rectangle2D) { + public static Rectangle2D rectangleUnion(List rectangle2DList) { - return format("%f,%f,%f,%f", rectangle2D.getX(), rectangle2D.getY(), rectangle2D.getWidth(), rectangle2D.getHeight()); - } - - - public static Rectangle2D parseRectangle2D(String bBox) { - - List floats = Arrays.stream(bBox.split(",")).map(Float::parseFloat).toList(); - return new Rectangle2D.Float(floats.get(0), floats.get(1), floats.get(2), floats.get(3)); - } - - - public static Rectangle2D toRectangle2D(com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle rect) { - - return new Rectangle2D.Double(rect.getTopLeftX() - rect.getWidth(), rect.getTopLeftY() - rect.getHeight(), rect.getWidth(), rect.getHeight()); + return rectangle2DList.stream().collect(new Rectangle2DUnion()); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java index 883dbc5a..ac8511bb 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogCreatorService.java @@ -1,6 +1,6 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations.toRectangle; +import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleMapper.toRedactionLogRectangle; import java.util.ArrayList; import java.util.HashSet; @@ -66,7 +66,7 @@ public class RedactionLogCreatorService { List rectanglesPerLine = redactionPosition.getRectanglePerLine() .stream() - .map(rectangle2D -> toRectangle(rectangle2D, redactionPosition.getPageNode().getNumber())) + .map(rectangle2D -> toRedactionLogRectangle(rectangle2D, redactionPosition.getPageNode().getNumber())) .toList(); redactionLogEntry.setPositions(rectanglesPerLine); @@ -125,7 +125,7 @@ public class RedactionLogCreatorService { .isHint(dictionaryService.isHint(image.getImageType().toString(), dossierTemplateId)) .isDictionaryEntry(false) .isRecommendation(false) - .positions(List.of(toRectangle(image.getPosition(), image.getPage().getNumber()))) + .positions(List.of(toRedactionLogRectangle(image.getPosition(), image.getPage().getNumber()))) .sectionNumber(image.getTocId().get(0)) .section(image.getParent().buildTextBlock().getSearchText()) .imageHasTransparency(image.isTransparent()) diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java index 22d37282..b754cae1 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java @@ -37,7 +37,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionRectangle; import com.iqser.red.service.redaction.v1.server.exception.RedactionException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleTransformations; +import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RectangleMapper; import com.iqser.red.service.redaction.v1.server.redaction.service.DictionaryService; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; @@ -175,7 +175,7 @@ public class AnnotationService { public static List toQuadPoints(List rectangles) { - return rectangles.stream().map(RectangleTransformations::toRectangle2D).flatMap(AnnotationService::toQuadPoints).toList(); + return rectangles.stream().map(RectangleMapper::toRectangle2D).flatMap(AnnotationService::toQuadPoints).toList(); }