From 6230f42fcf1bfe25d4742670653aa8fe8a27b744 Mon Sep 17 00:00:00 2001 From: Philipp Schramm Date: Thu, 25 Nov 2021 16:40:26 +0100 Subject: [PATCH] RED-2756 Bugfix for 'Redaction is not continuous', compare line height and y position instead of rounding y values --- .../service/RedactionLogCreatorService.java | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) 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 7754cf8b..3f0d9580 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,5 +1,15 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + import com.iqser.red.service.redaction.v1.model.Point; import com.iqser.red.service.redaction.v1.model.Rectangle; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; @@ -10,12 +20,8 @@ import com.iqser.red.service.redaction.v1.server.redaction.model.EntityPositionS import com.iqser.red.service.redaction.v1.server.redaction.model.Image; import com.iqser.red.service.redaction.v1.server.redaction.model.PageEntities; import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; -import lombok.RequiredArgsConstructor; -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Service; -import java.util.*; -import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor @@ -24,7 +30,8 @@ public class RedactionLogCreatorService { private final DictionaryService dictionaryService; - public List createRedactionLog(PageEntities pageEntities, int numberOfPages, String dossierTemplateId) { + public List createRedactionLog(PageEntities pageEntities, int numberOfPages, + String dossierTemplateId) { List entries = new ArrayList<>(); @@ -130,13 +137,19 @@ public class RedactionLogCreatorService { rectangles.add(TextPositionSequence.fromData(textPositions, page).getRectangle()); } else { float y = textPositions.get(0).getYDirAdj(); + float height = textPositions.get(0).getHeightDir(); int startIndex = 0; + for (int i = 1; i < textPositions.size(); i++) { float yDirAdj = textPositions.get(i).getYDirAdj(); - if (round(yDirAdj,3) != round(y, 3)) { + float heightDir = textPositions.get(i).getHeightDir(); + + if (!isCharInSameLine(y, yDirAdj, height, heightDir)) { + rectangles.add(TextPositionSequence.fromData(textPositions.subList(startIndex, i), page) .getRectangle()); y = yDirAdj; + height = heightDir; startIndex = i; } } @@ -149,9 +162,21 @@ public class RedactionLogCreatorService { return rectangles; } - private double round(float value, int decimalPoints) { - var d = Math.pow(10, decimalPoints); - return Math.round(value * d) / d; + + private boolean isCharInSameLine(float y, float yCompare, float height, float heightCompare) { + + float offsetHeight = heightCompare / 5; + float minHeight = heightCompare - offsetHeight; + float maxHeight = heightCompare + offsetHeight; + + float offsetY = heightCompare / 22; + float minY = y - offsetY; + float maxY = y + offsetY; + + if (yCompare > minY && yCompare < maxY && height > minHeight && height < maxHeight) { + return true; + } + return false; } @@ -204,5 +229,4 @@ public class RedactionLogCreatorService { return dictionaryService.isRecommendation(type, dossierTemplateId); } - }