diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/AnnotationHighlightService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/AnnotationHighlightService.java index 630139d3..9797d0aa 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/AnnotationHighlightService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/AnnotationHighlightService.java @@ -46,8 +46,7 @@ public class AnnotationHighlightService { private final DictionaryService dictionaryService; - public void highlight(PDDocument document, Document classifiedDoc, boolean flatRedaction, - ManualRedactions manualRedactions) throws IOException { + public void highlight(PDDocument document, Document classifiedDoc, boolean flatRedaction, ManualRedactions manualRedactions) throws IOException { Set manualRedactionPages = getManualRedactionPages(manualRedactions); @@ -85,8 +84,7 @@ public class AnnotationHighlightService { } - private void addAnnotations(PDPage pdPage, Document classifiedDoc, boolean flatRedaction, - ManualRedactions manualRedactions, int page) throws IOException { + private void addAnnotations(PDPage pdPage, Document classifiedDoc, boolean flatRedaction, ManualRedactions manualRedactions, int page) throws IOException { List annotations = pdPage.getAnnotations(); @@ -111,22 +109,24 @@ public class AnnotationHighlightService { } if (CollectionUtils.isNotEmpty(entityPositionSequence.getSequences())) { - for (Rectangle rectangle : getRectanglesPerLine(entityPositionSequence.getSequences() + List rectanglesPerline = getRectanglesPerLine(entityPositionSequence.getSequences() .stream() .flatMap(seq -> seq.getTextPositions().stream()) - .collect(Collectors.toList()), page)) { - redactionLogEntry.getPositions().add(rectangle); - annotations.add(createAnnotation(rectangle, entityPositionSequence.getId(), - createAnnotationContent(entity), getColor(entity), !flatRedaction && !isHint(entity))); - } + .collect(Collectors.toList()), page); + + redactionLogEntry.getPositions().addAll(rectanglesPerline); + annotations.add(createAnnotation(rectanglesPerline, entityPositionSequence.getId(), createAnnotationContent(entity), getColor(entity), !flatRedaction && !isHint(entity))); } - redactionLogEntry.setId(entityPositionSequence.getId()); - } - classifiedDoc.getRedactionLogEntities().add(redactionLogEntry); + + redactionLogEntry.setId(entityPositionSequence.getId()); } + classifiedDoc.getRedactionLogEntities().add(redactionLogEntry); } +} + + private List getRectanglesPerLine(List textPositions, int page) { List rectangles = new ArrayList<>(); @@ -152,8 +152,7 @@ public class AnnotationHighlightService { } - private void addManualAnnotations(PDPage pdPage, Document classifiedDoc, ManualRedactions manualRedactions, - int page) throws IOException { + private void addManualAnnotations(PDPage pdPage, Document classifiedDoc, ManualRedactions manualRedactions, int page) throws IOException { if (manualRedactions == null) { return; @@ -176,8 +175,8 @@ public class AnnotationHighlightService { foundOnPage = true; - PDAnnotationTextMarkup highlight = createAnnotation(rectangle, id, - createAnnotationContent(manualRedactionEntry), getColor(manualRedactionEntry.getType()), true); + PDAnnotationTextMarkup highlight = createAnnotation(List.of(rectangle), id, createAnnotationContent(manualRedactionEntry), getColor(manualRedactionEntry + .getType()), true); annotations.add(highlight); redactionLogEntry.getPositions().add(rectangle); @@ -221,13 +220,12 @@ public class AnnotationHighlightService { } - private PDAnnotationTextMarkup createAnnotation(Rectangle rectangle, String id, String content, float[] color, - boolean popup) { + private PDAnnotationTextMarkup createAnnotation(List rectangles, String id, String content, float[] color, boolean popup) { PDAnnotationTextMarkup annotation = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT); annotation.constructAppearances(); - annotation.setRectangle(toPDRectangle(rectangle)); - annotation.setQuadPoints(toQuadPoints(rectangle)); + annotation.setRectangle(toPDRectangle(rectangles.get(0))); + annotation.setQuadPoints(toQuadPoints(rectangles)); if (popup) { annotation.setAnnotationName(id); annotation.setTitlePopup(id); @@ -240,8 +238,7 @@ public class AnnotationHighlightService { private String createAnnotationContent(Entity entity) { - return "\nRule " + entity.getMatchedRule() + " matched" + "\n\n" + entity.getRedactionReason() + "\n\nIn " + - "Section : \"" + entity + return "\nRule " + entity.getMatchedRule() + " matched" + "\n\n" + entity.getRedactionReason() + "\n\nIn " + "Section : \"" + entity .getHeadline() + "\""; } @@ -263,13 +260,29 @@ public class AnnotationHighlightService { } - private float[] toQuadPoints(Rectangle rectangle) { + private float[] toQuadPoints(List rectangles) { + + + float[] quadPoints = new float[rectangles.size() * 8]; + int i = 0; + + for (Rectangle rectangle : rectangles) { + float[] quadPoint = toQuadPoint(rectangle); + for (int j = 0; j <= 7; j++) { + quadPoints[i + j] = quadPoint[j]; + } + i += 8; + } + return quadPoints; + } + + + private float[] toQuadPoint(Rectangle rectangle) { // quadPoints is array of x,y coordinates in Z-like order (top-left, top-right, bottom-left,bottom-right) // of the area to be highlighted return new float[]{rectangle.getTopLeft().getX(), rectangle.getTopLeft().getY(), rectangle.getTopLeft() - .getX() + rectangle.getWidth(), rectangle.getTopLeft().getY(), rectangle.getTopLeft().getX(), - rectangle.getTopLeft() + .getX() + rectangle.getWidth(), rectangle.getTopLeft().getY(), rectangle.getTopLeft().getX(), rectangle.getTopLeft() .getY() + rectangle.getHeight(), rectangle.getTopLeft() .getX() + rectangle.getWidth(), rectangle.getTopLeft().getY() + rectangle.getHeight()}; } @@ -312,15 +325,13 @@ public class AnnotationHighlightService { } - private void drawSectionFrames(PDDocument document, Document classifiedDoc, boolean flatRedaction, PDPage pdPage, - int page) throws IOException { + private void drawSectionFrames(PDDocument document, Document classifiedDoc, boolean flatRedaction, PDPage pdPage, int page) throws IOException { if (flatRedaction) { return; } - PDPageContentStream contentStream = new PDPageContentStream(document, pdPage, - PDPageContentStream.AppendMode.APPEND, true); + PDPageContentStream contentStream = new PDPageContentStream(document, pdPage, PDPageContentStream.AppendMode.APPEND, true); for (Paragraph paragraph : classifiedDoc.getParagraphs()) { for (int i = 0; i <= paragraph.getPageBlocks().size() - 1; i++) { @@ -369,8 +380,7 @@ public class AnnotationHighlightService { if (cell != null) { contentStream.setLineWidth(0.5f); contentStream.setStrokingColor(Color.CYAN); - contentStream.addRect((float) cell.getX(), (float) cell.getY(), (float) cell.getWidth(), - (float) cell + contentStream.addRect((float) cell.getX(), (float) cell.getY(), (float) cell.getWidth(), (float) cell .getHeight()); contentStream.stroke(); }