RED-2756 Bugfix for 'Redaction is not continuous', compare line height and y position instead of rounding y values

This commit is contained in:
Philipp Schramm 2021-11-25 16:40:26 +01:00
parent 571035dda1
commit 6230f42fcf

View File

@ -1,5 +1,15 @@
package com.iqser.red.service.redaction.v1.server.redaction.service; 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.Point;
import com.iqser.red.service.redaction.v1.model.Rectangle; import com.iqser.red.service.redaction.v1.model.Rectangle;
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; 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.Image;
import com.iqser.red.service.redaction.v1.server.redaction.model.PageEntities; import com.iqser.red.service.redaction.v1.server.redaction.model.PageEntities;
import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; 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 lombok.RequiredArgsConstructor;
import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@ -24,7 +30,8 @@ public class RedactionLogCreatorService {
private final DictionaryService dictionaryService; private final DictionaryService dictionaryService;
public List<RedactionLogEntry> createRedactionLog(PageEntities pageEntities, int numberOfPages, String dossierTemplateId) { public List<RedactionLogEntry> createRedactionLog(PageEntities pageEntities, int numberOfPages,
String dossierTemplateId) {
List<RedactionLogEntry> entries = new ArrayList<>(); List<RedactionLogEntry> entries = new ArrayList<>();
@ -130,13 +137,19 @@ public class RedactionLogCreatorService {
rectangles.add(TextPositionSequence.fromData(textPositions, page).getRectangle()); rectangles.add(TextPositionSequence.fromData(textPositions, page).getRectangle());
} else { } else {
float y = textPositions.get(0).getYDirAdj(); float y = textPositions.get(0).getYDirAdj();
float height = textPositions.get(0).getHeightDir();
int startIndex = 0; int startIndex = 0;
for (int i = 1; i < textPositions.size(); i++) { for (int i = 1; i < textPositions.size(); i++) {
float yDirAdj = textPositions.get(i).getYDirAdj(); 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) rectangles.add(TextPositionSequence.fromData(textPositions.subList(startIndex, i), page)
.getRectangle()); .getRectangle());
y = yDirAdj; y = yDirAdj;
height = heightDir;
startIndex = i; startIndex = i;
} }
} }
@ -149,9 +162,21 @@ public class RedactionLogCreatorService {
return rectangles; return rectangles;
} }
private double round(float value, int decimalPoints) {
var d = Math.pow(10, decimalPoints); private boolean isCharInSameLine(float y, float yCompare, float height, float heightCompare) {
return Math.round(value * d) / d;
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); return dictionaryService.isRecommendation(type, dossierTemplateId);
} }
} }