From 3dd215288acff0eb8cadd68b8c29a1625b421937 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Wed, 17 Apr 2024 17:26:04 +0200 Subject: [PATCH] RED-8825: improve layoutparsing * added improved debugging capabilities to viewer-doc * refactored coordinates (wip) * refactored line intersection algorithm * removed cropbox correction from pdfbox text positions --- .../processor/LayoutParsingPipeline.java | 103 ++++--- .../docstrum/DocstrumSegmentationService.java | 12 +- .../processor/docstrum/model/Character.java | 5 +- .../processor/docstrum/model/Line.java | 28 +- .../processor/docstrum/model/Zone.java | 21 +- .../docstrum/service/LineBuilderService.java | 34 +-- .../docstrum/service/ZoneBuilderService.java | 87 +++--- .../model/ClassificationDocument.java | 2 + .../processor/model/graph/nodes/Document.java | 3 + .../processor/model/table/Ruling.java | 188 ++----------- .../processor/model/text/RedTextPosition.java | 49 +++- .../model/text/TextPositionSequence.java | 34 ++- .../services/BodyTextFrameService.java | 1 + .../services/RulingCleaningService.java | 6 +- .../DocstrumBlockificationService.java | 121 +++++---- .../DocuMineBlockificationService.java | 2 +- .../factory/DocumentGraphFactory.java | 26 +- .../SearchTextWithTextPositionFactory.java | 37 +-- .../parsing/LegacyPDFStreamEngine.java | 95 +++---- .../services/parsing/PDFTextStripper.java | 10 +- .../visualization/LayoutGridService.java | 4 +- .../processor/utils/MarkedContentUtils.java | 96 +++++-- .../utils/RectangleTransformations.java | 39 ++- .../utils/RectangularIntersectionFinder.java | 30 ++- .../utils/RulingIntersectionFinder.java | 201 ++++++++++++++ .../LayoutparsingVisualizations.java | 252 ++++++++++++++++++ .../server/LayoutparserEnd2EndTest.java | 67 ++++- .../server/graph/ViewerDocumentTest.java | 18 +- .../server/utils/AbstractTest.java | 83 ++++-- .../server/utils/BuildDocumentTest.java | 32 ++- .../SinglePages/AbsolutelyEnormousTable.pdf | Bin 0 -> 333828 bytes .../service/viewerdoc/ContentStreams.java | 28 +- .../viewerdoc/model/Visualizations.java | 4 +- .../service/ViewerDocumentService.java | 28 +- 34 files changed, 1147 insertions(+), 599 deletions(-) create mode 100644 layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RulingIntersectionFinder.java create mode 100644 layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/visualization/LayoutparsingVisualizations.java create mode 100644 layoutparser-service/layoutparser-service-server/src/test/resources/files/SinglePages/AbsolutelyEnormousTable.pdf diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java index 4b390ac..fd8119c 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/LayoutParsingPipeline.java @@ -101,29 +101,33 @@ public class LayoutParsingPipeline { log.info("Starting layout parsing for {}", layoutParsingRequest.identifier()); File originFile = layoutParsingStorageService.getOriginFile(layoutParsingRequest.originFileStorageId()); - File viewerDocumentFile = layoutParsingStorageService.getViewerDocFile(layoutParsingRequest.viewerDocumentStorageId()).orElse(originFile); + File viewerDocumentFile = layoutParsingStorageService.getViewerDocFile(layoutParsingRequest.viewerDocumentStorageId()) + .orElse(originFile); VisualLayoutParsingResponse visualLayoutParsingResponse = new VisualLayoutParsingResponse(); - if (layoutParsingRequest.visualLayoutParsingFileId().isPresent()) { + if (layoutParsingRequest.visualLayoutParsingFileId() + .isPresent()) { visualLayoutParsingResponse = layoutParsingStorageService.getVisualLayoutParsingFile(layoutParsingRequest.visualLayoutParsingFileId().get()); } ImageServiceResponse imageServiceResponse = new ImageServiceResponse(); - if (layoutParsingRequest.imagesFileStorageId().isPresent()) { + if (layoutParsingRequest.imagesFileStorageId() + .isPresent()) { imageServiceResponse = layoutParsingStorageService.getImagesFile(layoutParsingRequest.imagesFileStorageId().get()); } TableServiceResponse tableServiceResponse = new TableServiceResponse(); - if (layoutParsingRequest.tablesFileStorageId().isPresent()) { + if (layoutParsingRequest.tablesFileStorageId() + .isPresent()) { tableServiceResponse = layoutParsingStorageService.getTablesFile(layoutParsingRequest.tablesFileStorageId().get()); } ClassificationDocument classificationDocument = parseLayout(layoutParsingRequest.layoutParsingType(), - originFile, - imageServiceResponse, - tableServiceResponse, - visualLayoutParsingResponse, - layoutParsingRequest.identifier()); + originFile, + imageServiceResponse, + tableServiceResponse, + visualLayoutParsingResponse, + layoutParsingRequest.identifier()); log.info("Building document graph for {}", layoutParsingRequest.identifier()); @@ -155,25 +159,25 @@ public class LayoutParsingPipeline { .numberOfPages(documentGraph.getNumberOfPages()) .duration(System.currentTimeMillis() - start) .message(format(""" - Layout parsing has finished in %.02f s. - identifiers: %s - %s - Files have been saved with Ids: - Structure: %s - Text: %s - Positions: %s - PageData: %s - Simplified Text: %s - Viewer Doc: %s""", - ((float) (System.currentTimeMillis() - start)) / 1000, - layoutParsingRequest.identifier(), - buildSemanticNodeCountMessage(documentGraph.getNumberOfPages(), documentGraph.buildSemanticNodeCounts()), - layoutParsingRequest.structureFileStorageId(), - layoutParsingRequest.textBlockFileStorageId(), - layoutParsingRequest.positionBlockFileStorageId(), - layoutParsingRequest.pageFileStorageId(), - layoutParsingRequest.simplifiedTextStorageId(), - layoutParsingRequest.viewerDocumentStorageId())) + Layout parsing has finished in %.02f s. + identifiers: %s + %s + Files have been saved with Ids: + Structure: %s + Text: %s + Positions: %s + PageData: %s + Simplified Text: %s + Viewer Doc: %s""", + ((float) (System.currentTimeMillis() - start)) / 1000, + layoutParsingRequest.identifier(), + buildSemanticNodeCountMessage(documentGraph.getNumberOfPages(), documentGraph.buildSemanticNodeCounts()), + layoutParsingRequest.structureFileStorageId(), + layoutParsingRequest.textBlockFileStorageId(), + layoutParsingRequest.positionBlockFileStorageId(), + layoutParsingRequest.pageFileStorageId(), + layoutParsingRequest.simplifiedTextStorageId(), + layoutParsingRequest.viewerDocumentStorageId())) .build(); } @@ -194,14 +198,14 @@ public class LayoutParsingPipeline { private String buildSemanticNodeCountMessage(int numberOfPages, Map semanticNodeCounts) { return String.format("%d pages with %d sections, %d headlines, %d paragraphs, %d tables with %d cells, %d headers, and %d footers parsed", - numberOfPages, - semanticNodeCounts.get(NodeType.SECTION) == null ? 0 : semanticNodeCounts.get(NodeType.SECTION), - semanticNodeCounts.get(NodeType.HEADLINE) == null ? 0 : semanticNodeCounts.get(NodeType.HEADLINE), - semanticNodeCounts.get(NodeType.PARAGRAPH) == null ? 0 : semanticNodeCounts.get(NodeType.PARAGRAPH), - semanticNodeCounts.get(NodeType.TABLE) == null ? 0 : semanticNodeCounts.get(NodeType.TABLE), - semanticNodeCounts.get(NodeType.TABLE_CELL) == null ? 0 : semanticNodeCounts.get(NodeType.TABLE_CELL), - semanticNodeCounts.get(NodeType.HEADER) == null ? 0 : semanticNodeCounts.get(NodeType.HEADER), - semanticNodeCounts.get(NodeType.FOOTER) == null ? 0 : semanticNodeCounts.get(NodeType.FOOTER)); + numberOfPages, + semanticNodeCounts.get(NodeType.SECTION) == null ? 0 : semanticNodeCounts.get(NodeType.SECTION), + semanticNodeCounts.get(NodeType.HEADLINE) == null ? 0 : semanticNodeCounts.get(NodeType.HEADLINE), + semanticNodeCounts.get(NodeType.PARAGRAPH) == null ? 0 : semanticNodeCounts.get(NodeType.PARAGRAPH), + semanticNodeCounts.get(NodeType.TABLE) == null ? 0 : semanticNodeCounts.get(NodeType.TABLE), + semanticNodeCounts.get(NodeType.TABLE_CELL) == null ? 0 : semanticNodeCounts.get(NodeType.TABLE_CELL), + semanticNodeCounts.get(NodeType.HEADER) == null ? 0 : semanticNodeCounts.get(NodeType.HEADER), + semanticNodeCounts.get(NodeType.FOOTER) == null ? 0 : semanticNodeCounts.get(NodeType.FOOTER)); } @@ -220,6 +224,9 @@ public class LayoutParsingPipeline { Map> pdfImages = imageServiceResponseAdapter.buildClassifiedImagesPerPage(imageServiceResponse); Map> signatures = visualLayoutParsingAdapter.buildExtractedSignaturesPerPage(visualLayoutParsingResponse); ClassificationDocument classificationDocument = new ClassificationDocument(); + + classificationDocument.getVisualizations().setActive(identifier.containsKey("debug")); + List classificationPages = new ArrayList<>(); long pageCount = originDocument.getNumberOfPages(); @@ -249,6 +256,8 @@ public class LayoutParsingPipeline { } stripper.getText(originDocument); + classificationDocument.getVisualizations().addTextVisualizations(stripper.getTextPositionSequences(), pageNumber); + PDRectangle pdr = pdPage.getMediaBox(); int rotation = pdPage.getRotation(); @@ -257,6 +266,8 @@ public class LayoutParsingPipeline { PDRectangle cropbox = pdPage.getCropBox(); CleanRulings cleanRulings = rulingCleaningService.getCleanRulings(pdfTableCells.get(pageNumber), stripper.getRulings()); + classificationDocument.getVisualizations().addCleanRulingVisualization(cleanRulings, pageNumber); + List emptyTableCells = TableExtractionService.findCells(cleanRulings.getHorizontal(), cleanRulings.getVertical()); var graphics = graphicExtractorService.extractPathElementGraphics(originDocument, @@ -272,11 +283,16 @@ public class LayoutParsingPipeline { .map(g -> new ClassifiedImage(new Rectangle2D.Double(g.x1, g.y1, g.width(), g.height()), ImageType.GRAPHIC, false, stripper.getPageNumber())) .toList()); + classificationDocument.getVisualizations().addCellVisualizations(emptyTableCells, pageNumber); + ClassificationPage classificationPage = switch (layoutParsingType) { - case REDACT_MANAGER_OLD -> redactManagerBlockificationService.blockify(stripper.getTextPositionSequences(), emptyTableCells); + case REDACT_MANAGER_OLD -> + redactManagerBlockificationService.blockify(stripper.getTextPositionSequences(), emptyTableCells); case DOCUMINE -> docuMineBlockificationService.blockify(stripper.getTextPositionSequences(), cleanRulings.getHorizontal(), cleanRulings.getVertical()); - case REDACT_MANAGER, REDACT_MANAGER_PARAGRAPH_DEBUG -> docstrumBlockificationService.blockify(stripper.getTextPositionSequences(), emptyTableCells, true); - case CLARIFYND, CLARIFYND_PARAGRAPH_DEBUG -> docstrumBlockificationService.blockify(stripper.getTextPositionSequences(), emptyTableCells, false); + case REDACT_MANAGER, REDACT_MANAGER_PARAGRAPH_DEBUG -> + docstrumBlockificationService.blockify(stripper.getTextPositionSequences(), emptyTableCells, true, classificationDocument.getVisualizations()); + case CLARIFYND, CLARIFYND_PARAGRAPH_DEBUG -> + docstrumBlockificationService.blockify(stripper.getTextPositionSequences(), emptyTableCells, false, classificationDocument.getVisualizations()); }; classificationPage.setCleanRulings(cleanRulings); @@ -286,8 +302,9 @@ public class LayoutParsingPipeline { classificationPage.setPageWidth(cropbox.getWidth()); classificationPage.setPageHeight(cropbox.getHeight()); + classificationDocument.getVisualizations().addMarkedContentVisualizations(stripper.getMarkedContents(), pageNumber, pdPage); // MarkedContent needs to be converted at this point, otherwise it leads to GC Problems in Pdfbox. - classificationPage.setMarkedContentBboxPerType(convertMarkedContents(stripper.getMarkedContents())); + classificationPage.setMarkedContentBboxPerType(convertMarkedContents(stripper.getMarkedContents(), pdPage)); // If images is ocr needs to be calculated before textBlocks are moved into tables, otherwise findOcr algorithm needs to be adopted. if (pdfImages != null && pdfImages.containsKey(pageNumber)) { @@ -361,11 +378,11 @@ public class LayoutParsingPipeline { } - private Map> convertMarkedContents(List pdMarkedContents) { + private Map> convertMarkedContents(List pdMarkedContents, PDPage pdPage) { Map> markedContentBboxes = new HashMap<>(); - markedContentBboxes.put(MarkedContentUtils.HEADER, MarkedContentUtils.getMarkedContentBboxPerLine(pdMarkedContents, MarkedContentUtils.HEADER)); - markedContentBboxes.put(MarkedContentUtils.FOOTER, MarkedContentUtils.getMarkedContentBboxPerLine(pdMarkedContents, MarkedContentUtils.FOOTER)); + markedContentBboxes.put(MarkedContentUtils.HEADER, MarkedContentUtils.getMarkedContentBboxPerLine(pdMarkedContents, MarkedContentUtils.HEADER, pdPage)); + markedContentBboxes.put(MarkedContentUtils.FOOTER, MarkedContentUtils.getMarkedContentBboxPerLine(pdMarkedContents, MarkedContentUtils.FOOTER, pdPage)); return markedContentBboxes; } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/DocstrumSegmentationService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/DocstrumSegmentationService.java index eb62ce2..b2e4087 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/DocstrumSegmentationService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/DocstrumSegmentationService.java @@ -7,12 +7,14 @@ import java.util.stream.Collectors; import org.springframework.stereotype.Service; import com.knecon.fforesight.service.layoutparser.processor.docstrum.model.Character; +import com.knecon.fforesight.service.layoutparser.processor.docstrum.model.Line; import com.knecon.fforesight.service.layoutparser.processor.docstrum.model.Zone; import com.knecon.fforesight.service.layoutparser.processor.docstrum.service.LineBuilderService; import com.knecon.fforesight.service.layoutparser.processor.docstrum.service.NearestNeighbourService; import com.knecon.fforesight.service.layoutparser.processor.docstrum.service.ReadingOrderService; import com.knecon.fforesight.service.layoutparser.processor.docstrum.service.SpacingService; import com.knecon.fforesight.service.layoutparser.processor.docstrum.service.ZoneBuilderService; +import com.knecon.fforesight.service.layoutparser.processor.model.text.RedTextPosition; import com.knecon.fforesight.service.layoutparser.processor.model.text.TextDirection; import com.knecon.fforesight.service.layoutparser.processor.model.text.TextPositionSequence; @@ -43,16 +45,16 @@ public class DocstrumSegmentationService { private List computeZones(List textPositions, TextDirection direction) { - var positions = textPositions.stream().filter(t -> t.getDir() == direction).map(TextPositionSequence::getTextPositions).flatMap(List::stream).toList(); + List positions = textPositions.stream().filter(t -> t.getDir() == direction).map(TextPositionSequence::getTextPositions).flatMap(List::stream).toList(); - var characters = positions.stream().map(Character::new).collect(Collectors.toList()); + List characters = positions.stream().map(Character::new).collect(Collectors.toList()); nearestNeighbourService.findNearestNeighbors(characters); - var characterSpacing = spacingService.computeCharacterSpacing(characters); - var lineSpacing = Math.min(spacingService.computeLineSpacing(characters), 20); + double characterSpacing = spacingService.computeCharacterSpacing(characters); + double lineSpacing = Math.min(spacingService.computeLineSpacing(characters), 20); - var lines = lineBuilderService.buildLines(characters, characterSpacing, lineSpacing); + List lines = lineBuilderService.buildLines(characters, characterSpacing, lineSpacing); return zoneBuilderService.buildZones(lines, characterSpacing, lineSpacing); } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Character.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Character.java index b4e2616..40bc95c 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Character.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Character.java @@ -27,8 +27,8 @@ public class Character { public Character(RedTextPosition chunk) { - this.x = chunk.getXDirAdj() + chunk.getWidthDirAdj() / 2; - this.y = chunk.getYDirAdj() + chunk.getHeightDir() / 2; + this.x = chunk.getDirectionAdjustedPosition().getCenterX(); + this.y = chunk.getDirectionAdjustedPosition().getCenterY(); this.textPosition = chunk; } @@ -82,5 +82,4 @@ public class Character { return FastAtan2.fastAtan2(character.getY() - getY(), character.getX() - getX()); } } - } \ No newline at end of file diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Line.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Line.java index fa85249..71fcbb5 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Line.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Line.java @@ -1,11 +1,12 @@ package com.knecon.fforesight.service.layoutparser.processor.docstrum.model; -import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import com.knecon.fforesight.service.layoutparser.processor.model.text.RedTextPosition; import com.knecon.fforesight.service.layoutparser.processor.model.text.TextPositionSequence; +import com.knecon.fforesight.service.layoutparser.processor.utils.RectangleTransformations; import lombok.Data; import lombok.EqualsAndHashCode; @@ -84,7 +85,9 @@ public class Line extends BoundingBox { private double computeHeight() { - return characters.stream().map(Character::getHeight).reduce(0d, Double::sum) / characters.size(); + return characters.stream() + .map(Character::getHeight) + .reduce(0d, Double::sum) / characters.size(); } @@ -116,7 +119,7 @@ public class Line extends BoundingBox { double ym = (y0 + y1) / 2; double yn = (other.y0 + other.y1) / 2; - return Math.abs(ym - yn) / Math.sqrt(1); + return Math.abs(ym - yn); } @@ -141,21 +144,10 @@ public class Line extends BoundingBox { private void buildBBox() { - double minX = Double.POSITIVE_INFINITY; - double minY = Double.POSITIVE_INFINITY; - double maxX = Double.NEGATIVE_INFINITY; - double maxY = Double.NEGATIVE_INFINITY; - - for (Character character : characters) { - - minX = Math.min(minX, character.getTextPosition().getXDirAdj()); - minY = Math.min(minY, character.getTextPosition().getYDirAdj()); - maxX = Math.max(maxX, character.getTextPosition().getXDirAdj() + character.getTextPosition().getWidthDirAdj()); - maxY = Math.max(maxY, character.getTextPosition().getYDirAdj() + character.getTextPosition().getHeightDir()); - - } - - this.setBBox(new Rectangle2D.Double(minX, minY, maxX - minX, maxY - minY)); + this.setBBox(characters.stream() + .map(Character::getTextPosition) + .map(RedTextPosition::getInitialUserSpacePosition) + .collect(RectangleTransformations.collectBBox())); } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Zone.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Zone.java index 85facd2..aaf96ac 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Zone.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/model/Zone.java @@ -1,9 +1,10 @@ package com.knecon.fforesight.service.layoutparser.processor.docstrum.model; -import java.awt.geom.Rectangle2D; import java.util.Comparator; import java.util.List; +import com.knecon.fforesight.service.layoutparser.processor.utils.RectangleTransformations; + import lombok.Data; @Data @@ -23,21 +24,9 @@ public class Zone extends BoundingBox { public void buildBBox() { - double minX = Double.POSITIVE_INFINITY; - double minY = Double.POSITIVE_INFINITY; - double maxX = Double.NEGATIVE_INFINITY; - double maxY = Double.NEGATIVE_INFINITY; - - for (Line line : lines) { - - minX = Math.min(minX, line.getX()); - minY = Math.min(minY, line.getY()); - maxX = Math.max(maxX, line.getX() + line.getWidth()); - maxY = Math.max(maxY, line.getY() + line.getHeight()); - - } - - this.setBBox(new Rectangle2D.Double(minX, minY, maxX - minX, maxY - minY)); + this.setBBox(getLines().stream() + .map(BoundingBox::getBBox) + .collect(RectangleTransformations.collectBBox())); } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/LineBuilderService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/LineBuilderService.java index 66536a5..195a0fd 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/LineBuilderService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/LineBuilderService.java @@ -1,6 +1,5 @@ package com.knecon.fforesight.service.layoutparser.processor.docstrum.service; -import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; import java.util.List; @@ -30,24 +29,25 @@ public class LineBuilderService { AngleFilter filter = new AngleFilter(-ANGLE_TOLERANCE, ANGLE_TOLERANCE); characters.forEach(character -> { - character.getNeighbors().forEach(neighbor -> { - double x = neighbor.getHorizontalDistance() / maxHorizontalDistance; - double y = neighbor.getVerticalDistance() / maxVerticalDistance; - if (character.getTextPosition().getDir() == neighbor.getCharacter().getTextPosition().getDir() && filter.matches(neighbor) && Math.pow(x, 2) + Math.pow(y, - 2) <= 1) { - unionFind.union(character, neighbor.getCharacter()); - } - }); + character.getNeighbors() + .forEach(neighbor -> { + double normalizedHorizontalDistance = neighbor.getHorizontalDistance() / maxHorizontalDistance; + double normalizedVerticalDistance = neighbor.getVerticalDistance() / maxVerticalDistance; + if (character.getTextPosition().getDir() == neighbor.getCharacter().getTextPosition().getDir() // + && filter.matches(neighbor) // + && Math.pow(normalizedHorizontalDistance, 2) + Math.pow(normalizedVerticalDistance, 2) <= 1) { + unionFind.union(character, neighbor.getCharacter()); + } + }); }); - List lines = new ArrayList<>(); - unionFind.getGroups().forEach(group -> { - List lineCharacters = new ArrayList<>(group); - lineCharacters.sort(Comparator.comparingDouble(Character::getX)); - lines.add(new Line(lineCharacters, characterSpacing)); - }); - - return lines; + return unionFind.getGroups() + .stream() + .map(lineCharacters -> lineCharacters.stream() + .sorted(Comparator.comparingDouble(Character::getX)) + .toList()) + .map(lineCharacters -> new Line(lineCharacters, characterSpacing)) + .toList(); } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/ZoneBuilderService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/ZoneBuilderService.java index 4520163..6acd4cb 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/ZoneBuilderService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/docstrum/service/ZoneBuilderService.java @@ -45,29 +45,35 @@ public class ZoneBuilderService { double meanHeight = calculateMeanHeight(lines); - lines.forEach(outerLine -> // - lines.forEach(innerLine -> { + lines.forEach(outerLine -> { + lines.forEach(innerLine -> { - double scale = Math.min(outerLine.getHeight(), innerLine.getHeight()) / meanHeight; - scale = Math.max(MIN_LINE_SIZE_SCALE, Math.min(scale, MAX_LINE_SIZE_SCALE)); + if (innerLine == outerLine // + || unionFind.inSameSet(outerLine, innerLine)// + || outerLine.angularDifference(innerLine) > ANGLE_TOLERANCE) { + return; + } - if (!unionFind.inSameSet(outerLine, innerLine) && outerLine.angularDifference(innerLine) <= ANGLE_TOLERANCE) { + double scale = Math.min(outerLine.getHeight(), innerLine.getHeight()) / meanHeight; + scale = Math.max(MIN_LINE_SIZE_SCALE, Math.min(scale, MAX_LINE_SIZE_SCALE)); - double horizontalDistance = outerLine.horizontalDistance(innerLine) / scale; - double verticalDistance = outerLine.verticalDistance(innerLine) / scale; + double horizontalDistance = outerLine.horizontalDistance(innerLine) / scale; + double verticalDistance = outerLine.verticalDistance(innerLine) / scale; - if (minHorizontalDistance <= horizontalDistance && verticalDistance <= maxVerticalDistance // - || minHorizontalMergeDistance <= horizontalDistance && verticalDistance <= maxVerticalMergeDistance) { - unionFind.union(outerLine, innerLine); - } - } - })); + if (minHorizontalDistance <= horizontalDistance && verticalDistance <= maxVerticalDistance // + || minHorizontalMergeDistance <= horizontalDistance && verticalDistance <= maxVerticalMergeDistance) { - List zones = new ArrayList<>(); - unionFind.getGroups().forEach(group -> { - zones.add(mergeLinesInZone(new ArrayList<>(group), characterSpacing, lineSpacing)); + unionFind.union(outerLine, innerLine); + } + + }); }); + List zones = unionFind.getGroups() + .stream() + .map(group -> mergeLinesInZone(new ArrayList<>(group), characterSpacing, lineSpacing)) + .toList(); + if (zones.size() > MAX_ZONES) { List oneZoneLines = new ArrayList<>(); for (Zone zone : zones) { @@ -103,35 +109,40 @@ public class ZoneBuilderService { UnionFind unionFind = new UnionFind<>(new HashSet<>(lines)); lines.forEach(outer -> { - lines.forEach(inner -> { - if (inner != outer) { + if (inner == outer) { + return; + } - double horizontalDistance = outer.horizontalDistance(inner); - double verticalDistance = outer.verticalDistance(inner); + double horizontalDistance = outer.horizontalDistance(inner); + double verticalDistance = outer.verticalDistance(inner); - if (horizontalDistance <= maxHorizontalDistance && minVerticalDistance <= verticalDistance && verticalDistance <= maxVerticalDistance) { - unionFind.union(outer, inner); - } else if (minVerticalDistance <= verticalDistance && verticalDistance <= maxVerticalDistance && Math.abs(horizontalDistance - Math.min(outer.getLength(), - inner.getLength())) < 0.1) { - boolean characterOverlap = false; - int overlappingCount = 0; - for (Character outerCharacter : outer.getCharacters()) { - for (Character innerCharacter : inner.getCharacters()) { - double characterOverlapDistance = outerCharacter.overlappingDistance(innerCharacter); - if (characterOverlapDistance > 2) { - characterOverlap = true; - } - if (characterOverlapDistance > 0) { - overlappingCount++; - } + if (horizontalDistance <= maxHorizontalDistance && minVerticalDistance <= verticalDistance && verticalDistance <= maxVerticalDistance) { + + unionFind.union(outer, inner); + + } else if (minVerticalDistance <= verticalDistance + && verticalDistance <= maxVerticalDistance + && Math.abs(horizontalDistance - Math.min(outer.getLength(), inner.getLength())) < 0.1) { + + boolean characterOverlap = false; + int overlappingCount = 0; + for (Character outerCharacter : outer.getCharacters()) { + for (Character innerCharacter : inner.getCharacters()) { + double characterOverlapDistance = outerCharacter.overlappingDistance(innerCharacter); + if (characterOverlapDistance > 2) { + characterOverlap = true; + } + if (characterOverlapDistance > 0) { + overlappingCount++; } } - if (!characterOverlap && overlappingCount <= 2) { - unionFind.union(outer, inner); - } + } + if (!characterOverlap && overlappingCount <= 2) { + unionFind.union(outer, inner); } } + }); }); diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/ClassificationDocument.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/ClassificationDocument.java index b3565ae..4f3f339 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/ClassificationDocument.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/ClassificationDocument.java @@ -5,6 +5,7 @@ import java.util.List; import com.knecon.fforesight.service.layoutparser.processor.model.text.StringFrequencyCounter; import com.knecon.fforesight.service.layoutparser.processor.model.text.UnclassifiedText; +import com.knecon.fforesight.service.layoutparser.processor.visualization.LayoutparsingVisualizations; import lombok.Data; import lombok.NoArgsConstructor; @@ -22,6 +23,7 @@ public class ClassificationDocument { private FloatFrequencyCounter fontSizeCounter = new FloatFrequencyCounter(); private StringFrequencyCounter fontCounter = new StringFrequencyCounter(); private StringFrequencyCounter fontStyleCounter = new StringFrequencyCounter(); + private LayoutparsingVisualizations visualizations = new LayoutparsingVisualizations(); private boolean headlines; private long rulesVersion; diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/graph/nodes/Document.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/graph/nodes/Document.java index e7b5f82..9a9d9cc 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/graph/nodes/Document.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/graph/nodes/Document.java @@ -12,6 +12,7 @@ import java.util.stream.Stream; import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.LayoutEngine; import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.NodeType; +import com.knecon.fforesight.service.layoutparser.processor.visualization.LayoutparsingVisualizations; import com.knecon.fforesight.service.layoutparser.processor.model.graph.DocumentTree; import com.knecon.fforesight.service.layoutparser.processor.model.graph.entity.RedactionEntity; import com.knecon.fforesight.service.layoutparser.processor.model.graph.textblock.TextBlock; @@ -40,6 +41,8 @@ public class Document implements GenericSemanticNode { @Builder.Default Set entities = new HashSet<>(); + LayoutparsingVisualizations visualizations; + @Override public NodeType getType() { diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/table/Ruling.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/table/Ruling.java index 7586258..aa2c8dc 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/table/Ruling.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/table/Ruling.java @@ -4,12 +4,8 @@ import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.Formatter; import java.util.List; -import java.util.Map; -import java.util.TreeMap; import com.knecon.fforesight.service.layoutparser.processor.utils.CohenSutherlandClipping; import com.knecon.fforesight.service.layoutparser.processor.utils.DoubleComparisons; @@ -60,126 +56,13 @@ public class Ruling extends Line2D.Float { } - // log(n) implementation of find_intersections - // based on http://people.csail.mit.edu/indyk/6.838-old/handouts/lec2.pdf - public static Map findIntersections(List horizontals, List verticals) { - - class SortObject { - - protected SOType type; - protected float position; - protected Ruling ruling; - - - public SortObject(SOType type, float position, Ruling ruling) { - - this.type = type; - this.position = position; - this.ruling = ruling; - } - - } - - List sos = new ArrayList<>(); - - TreeMap tree = new TreeMap<>(new Comparator() { - @Override - public int compare(Ruling o1, Ruling o2) { - - return java.lang.Double.compare(o1.getTop(), o2.getTop()); - } - }); - - TreeMap rv = new TreeMap<>(new Comparator() { - @Override - public int compare(Point2D o1, Point2D o2) { - - if (o1.getY() > o2.getY()) { - return 1; - } - if (o1.getY() < o2.getY()) { - return -1; - } - if (o1.getX() > o2.getX()) { - return 1; - } - if (o1.getX() < o2.getX()) { - return -1; - } - return 0; - } - }); - - for (Ruling h : horizontals) { - sos.add(new SortObject(SOType.HLEFT, h.getLeft() - PERPENDICULAR_UNIT_EXPAND_AMOUNT, h)); - sos.add(new SortObject(SOType.HRIGHT, h.getRight() + PERPENDICULAR_UNIT_EXPAND_AMOUNT, h)); - } - - for (Ruling v : verticals) { - sos.add(new SortObject(SOType.VERTICAL, v.getLeft(), v)); - } - - Collections.sort(sos, new Comparator() { - @Override - public int compare(SortObject a, SortObject b) { - - int rv; - if (DoubleComparisons.feq(a.position, b.position)) { - if (a.type == SOType.VERTICAL && b.type == SOType.HLEFT) { - rv = 1; - } else if (a.type == SOType.VERTICAL && b.type == SOType.HRIGHT) { - rv = -1; - } else if (a.type == SOType.HLEFT && b.type == SOType.VERTICAL) { - rv = -1; - } else if (a.type == SOType.HRIGHT && b.type == SOType.VERTICAL) { - rv = 1; - } else { - rv = java.lang.Double.compare(a.position, b.position); - } - } else { - return java.lang.Double.compare(a.position, b.position); - } - return rv; - } - }); - - for (SortObject so : sos) { - switch (so.type) { - case VERTICAL: - for (Map.Entry h : tree.entrySet()) { - try { - Point2D i = h.getKey().intersectionPoint(so.ruling); - if (i == null) { - continue; - } - rv.put(i, new Ruling[]{h.getKey().expand(PERPENDICULAR_UNIT_EXPAND_AMOUNT), so.ruling.expand(PERPENDICULAR_UNIT_EXPAND_AMOUNT)}); - } catch (UnsupportedOperationException e) { - log.info("Some line are oblique, ignoring..."); - continue; - } - } - break; - case HRIGHT: - tree.remove(so.ruling); - break; - case HLEFT: - tree.put(so.ruling, true); - break; - } - } - - return rv; - - } - - - public boolean vertical() { + public boolean isVertical() { return this.length() > 0 && DoubleComparisons.feq(this.x1, this.x2); //diff < ORIENTATION_CHECK_THRESHOLD; } - public boolean horizontal() { + public boolean isHorizontal() { return this.length() > 0 && DoubleComparisons.feq(this.y1, this.y2); //diff < ORIENTATION_CHECK_THRESHOLD; } @@ -188,36 +71,36 @@ public class Ruling extends Line2D.Float { // these are used to have a single collapse method (in page, currently) - public boolean oblique() { + public boolean isOblique() { - return !(this.vertical() || this.horizontal()); + return !(this.isVertical() || this.isHorizontal()); } public float getPosition() { - if (this.oblique()) { + if (this.isOblique()) { throw new UnsupportedOperationException(); } - return this.vertical() ? this.getLeft() : this.getTop(); + return this.isVertical() ? this.getLeft() : this.getTop(); } public float getStart() { - if (this.oblique()) { + if (this.isOblique()) { throw new UnsupportedOperationException(); } - return this.vertical() ? this.getTop() : this.getLeft(); + return this.isVertical() ? this.getTop() : this.getLeft(); } public void setStart(float v) { - if (this.oblique()) { + if (this.isOblique()) { throw new UnsupportedOperationException(); } - if (this.vertical()) { + if (this.isVertical()) { this.setTop(v); } else { this.setLeft(v); @@ -227,19 +110,19 @@ public class Ruling extends Line2D.Float { public float getEnd() { - if (this.oblique()) { + if (this.isOblique()) { throw new UnsupportedOperationException(); } - return this.vertical() ? this.getBottom() : this.getRight(); + return this.isVertical() ? this.getBottom() : this.getRight(); } public void setEnd(float v) { - if (this.oblique()) { + if (this.isOblique()) { throw new UnsupportedOperationException(); } - if (this.vertical()) { + if (this.isVertical()) { this.setBottom(v); } else { this.setRight(v); @@ -249,10 +132,10 @@ public class Ruling extends Line2D.Float { public void setStartEnd(float start, float end) { - if (this.oblique()) { + if (this.isOblique()) { throw new UnsupportedOperationException(); } - if (this.vertical()) { + if (this.isVertical()) { this.setTop(start); this.setBottom(end); } else { @@ -264,7 +147,7 @@ public class Ruling extends Line2D.Float { public boolean perpendicularTo(Ruling other) { - return this.vertical() == other.horizontal(); + return this.isVertical() == other.isHorizontal(); } @@ -318,30 +201,6 @@ public class Ruling extends Line2D.Float { } - public Point2D intersectionPoint(Ruling other) { - - Ruling this_l = this.expand(PERPENDICULAR_UNIT_EXPAND_AMOUNT); - Ruling other_l = other.expand(PERPENDICULAR_UNIT_EXPAND_AMOUNT); - Ruling horizontal, vertical; - - if (!this_l.intersectsLine(other_l)) { - return null; - } - - if (this_l.horizontal() && other_l.vertical()) { - horizontal = this_l; - vertical = other_l; - } else if (this_l.vertical() && other_l.horizontal()) { - vertical = this_l; - horizontal = other_l; - } else { - log.warn("lines must be orthogonal, vertical and horizontal"); - return null; - } - return new Point2D.Float(vertical.getLeft(), horizontal.getTop()); - } - - @Override public boolean equals(Object other) { @@ -451,16 +310,9 @@ public class Ruling extends Line2D.Float { final float TOLERANCE = 1; return Math.abs(ruling.getX1() - x1) < TOLERANCE &&// - Math.abs(ruling.getY1() - y1) < TOLERANCE &&// - Math.abs(ruling.getX2() - x2) < TOLERANCE &&// - Math.abs(ruling.getY2() - y2) < TOLERANCE; - } - - - private enum SOType { - VERTICAL, - HRIGHT, - HLEFT + Math.abs(ruling.getY1() - y1) < TOLERANCE &&// + Math.abs(ruling.getX2() - x2) < TOLERANCE &&// + Math.abs(ruling.getY2() - y2) < TOLERANCE; } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/RedTextPosition.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/RedTextPosition.java index e4a4212..b0c5ba7 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/RedTextPosition.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/RedTextPosition.java @@ -1,5 +1,8 @@ package com.knecon.fforesight.service.layoutparser.processor.model.text; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; + import org.apache.pdfbox.text.TextPosition; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -16,7 +19,9 @@ import lombok.SneakyThrows; @AllArgsConstructor public class RedTextPosition { - private float[] position; + private final static int HEIGHT_PADDING = 2; + private Rectangle2D.Float directionAdjustedPosition; + private Rectangle2D initialUserSpacePosition; @JsonIgnore private int rotation; @@ -58,43 +63,65 @@ public class RedTextPosition { pos.setFontSizeInPt(textPosition.getFontSizeInPt()); pos.setFontName(textPosition.getFont().getName()); - var position = new float[4]; + float textHeight = textPosition.getHeight() + HEIGHT_PADDING; + Rectangle2D.Float dirAdjPosition = new Rectangle2D.Float(textPosition.getXDirAdj(), + textPosition.getYDirAdj() - textHeight, + textPosition.getWidthDirAdj(), + textHeight + HEIGHT_PADDING); + pos.setDirectionAdjustedPosition(dirAdjPosition); - position[0] = textPosition.getXDirAdj(); - position[1] = textPosition.getYDirAdj(); - position[2] = textPosition.getWidthDirAdj(); - position[3] = textPosition.getHeightDir(); + AffineTransform affineTransform = getRotationMatrix(TextDirection.fromDegrees(textPosition.getDir()), textPosition.getPageWidth(), textPosition.getPageHeight()); + Rectangle2D initialUserSpacePositionRect = affineTransform.createTransformedShape(dirAdjPosition).getBounds2D(); + + pos.setInitialUserSpacePosition(initialUserSpacePositionRect); - pos.setPosition(position); return pos; } + private static AffineTransform getRotationMatrix(TextDirection textDirection, float pageWidth, float pageHeight) { + + AffineTransform transform = new AffineTransform(); + + if (textDirection == TextDirection.ZERO || textDirection == TextDirection.HALF_CIRCLE) { + transform.rotate(textDirection.getRadians(), pageWidth / 2f, pageHeight / 2f); + transform.translate(0f, pageHeight); + } else if (textDirection == TextDirection.QUARTER_CIRCLE) { + transform.rotate(textDirection.getRadians(), pageWidth / 2f, pageWidth / 2f); + transform.translate(0f, pageWidth); + } else { + transform.rotate(textDirection.getRadians(), pageHeight / 2f, pageHeight / 2f); + transform.translate(0f, pageWidth); + } + transform.scale(1., -1.); + return transform; + } + @JsonIgnore public float getXDirAdj() { - return position[0]; + return this.directionAdjustedPosition.x; } @JsonIgnore public float getYDirAdj() { - return position[1]; + return this.directionAdjustedPosition.y; } @JsonIgnore public float getWidthDirAdj() { - return position[2]; + return this.directionAdjustedPosition.width; } @JsonIgnore public float getHeightDir() { - return position[3]; + return this.directionAdjustedPosition.height; } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/TextPositionSequence.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/TextPositionSequence.java index de03144..fccecd5 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/TextPositionSequence.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/model/text/TextPositionSequence.java @@ -2,6 +2,7 @@ package com.knecon.fforesight.service.layoutparser.processor.model.text; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -11,6 +12,7 @@ import org.apache.pdfbox.text.TextPosition; 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.knecon.fforesight.service.layoutparser.processor.utils.RectangleTransformations; import lombok.AllArgsConstructor; import lombok.Builder; @@ -44,21 +46,19 @@ public class TextPositionSequence implements CharSequence { private boolean isParagraphStart; - public TextPositionSequence(int page) { + public TextPositionSequence(List textPositions, int pageNumber, boolean isParagraphStart) { - this.page = page; - } - - - public TextPositionSequence(List textPositions, int page, boolean isParagraphStart) { - - this.textPositions = textPositions.stream().map(RedTextPosition::fromTextPosition).collect(Collectors.toList()); - this.page = page; + this.textPositions = textPositions.stream() + .map(RedTextPosition::fromTextPosition) + .collect(Collectors.toList()); + this.page = pageNumber; this.dir = TextDirection.fromDegrees(textPositions.get(0).getDir()); this.rotation = textPositions.get(0).getRotation(); this.pageHeight = textPositions.get(0).getPageHeight(); this.pageWidth = textPositions.get(0).getPageWidth(); this.isParagraphStart = isParagraphStart; + + } @@ -314,10 +314,18 @@ public class TextPositionSequence implements CharSequence { topRight = transform.transform(topRight, null); return new Rectangle( // - new Point((float) bottomLeft.getX(), (float) bottomLeft.getY()), - (float) (topRight.getX() - bottomLeft.getX()), - (float) (topRight.getY() - bottomLeft.getY()), - page); + new Point((float) bottomLeft.getX(), (float) bottomLeft.getY()), + (float) (topRight.getX() - bottomLeft.getX()), + (float) (topRight.getY() - bottomLeft.getY()), + page); + } + + + public Rectangle2D getBoundingBox() { + + return getTextPositions().stream() + .map(RedTextPosition::getInitialUserSpacePosition) + .collect(RectangleTransformations.collectBBox()); } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/BodyTextFrameService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/BodyTextFrameService.java index 3cd09a8..7438843 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/BodyTextFrameService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/BodyTextFrameService.java @@ -33,6 +33,7 @@ public class BodyTextFrameService { for (ClassificationPage page : classificationDocument.getPages()) { // var updatedBodyTextFrame = getBodyTextFrameFromRulings(page, bodyTextFrame, landscapeBodyTextFrame); setBodyTextFrameAdjustedToPage(page, bodyTextFrame, landscapeBodyTextFrame); + classificationDocument.getVisualizations().addMainBodyVisualization(page.isLandscape() ? landscapeBodyTextFrame : bodyTextFrame, page.getPageNumber()); } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/RulingCleaningService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/RulingCleaningService.java index c51c90b..b57fab1 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/RulingCleaningService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/RulingCleaningService.java @@ -122,7 +122,7 @@ public class RulingCleaningService { h = ruling.y1 - ruling.y2; } - if (ruling.horizontal()) { + if (ruling.isHorizontal()) { return new Rectangle(top - THRESHOLD_Y_HORIZONTAL, left - THRESHOLD_X_HORIZONTAL, w + 2 * THRESHOLD_X_HORIZONTAL, h + 2 * THRESHOLD_Y_HORIZONTAL); } else { return new Rectangle(top - THRESHOLD_Y_VERTICAL, left - THRESHOLD_X_VERTICAL, w + 2 * THRESHOLD_X_VERTICAL, h + 2 * THRESHOLD_Y_VERTICAL); @@ -160,14 +160,14 @@ public class RulingCleaningService { List vrs = new ArrayList<>(); for (Ruling vr : rulings) { - if (vr.vertical()) { + if (vr.isVertical()) { vrs.add(vr); } } List hrs = new ArrayList<>(); for (Ruling hr : rulings) { - if (hr.horizontal()) { + if (hr.isHorizontal()) { hrs.add(hr); } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocstrumBlockificationService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocstrumBlockificationService.java index 9c087a1..883f393 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocstrumBlockificationService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocstrumBlockificationService.java @@ -15,6 +15,7 @@ import com.knecon.fforesight.service.layoutparser.processor.docstrum.utils.Doubl import com.knecon.fforesight.service.layoutparser.processor.model.AbstractPageBlock; import com.knecon.fforesight.service.layoutparser.processor.model.ClassificationPage; import com.knecon.fforesight.service.layoutparser.processor.model.FloatFrequencyCounter; +import com.knecon.fforesight.service.layoutparser.processor.visualization.LayoutparsingVisualizations; import com.knecon.fforesight.service.layoutparser.processor.model.table.Cell; import com.knecon.fforesight.service.layoutparser.processor.model.table.CleanRulings; import com.knecon.fforesight.service.layoutparser.processor.model.table.Ruling; @@ -37,11 +38,18 @@ public class DocstrumBlockificationService { static final float THRESHOLD = 1f; - public ClassificationPage blockify(List textPositions, List cells, boolean xyOrder) { + public ClassificationPage blockify(List textPositions, List cells, boolean xyOrder, LayoutparsingVisualizations visualizations) { CleanRulings usedRulings = RectangleTransformations.extractRulings(cells); var zones = docstrumSegmentationService.segmentPage(textPositions, xyOrder); + + if (!textPositions.isEmpty()) { + visualizations.addZoneVisualizations(zones, textPositions.get(0).getPage()); + visualizations.addLineVisualizations(zones, textPositions.get(0).getPage()); + visualizations.addCharactersWithNeighbours(zones, textPositions.get(0).getPage()); + } + var pageBlocks = toAbstractPageBlocks(zones, usedRulings.getHorizontal(), usedRulings.getVertical(), xyOrder); var classificationPage = new ClassificationPage(pageBlocks); @@ -58,18 +66,20 @@ public class DocstrumBlockificationService { zones.forEach(zone -> { List textPositionSequences = new ArrayList<>(); - zone.getLines().forEach(line -> { - line.getWords().forEach(word -> { - textPositionSequences.add(new TextPositionSequence(word.getTextPositions(), word.getPage())); - }); - }); + zone.getLines() + .forEach(line -> { + line.getWords() + .forEach(word -> { + textPositionSequences.add(new TextPositionSequence(word.getTextPositions(), word.getPage())); + }); + }); abstractPageBlocks.addAll(splitZonesAtRulings(textPositionSequences, horizontalRulings, verticalRulings)); }); if (xyOrder) { abstractPageBlocks.sort(Comparator.comparing(AbstractPageBlock::getMinY, (o1, o2) -> DoubleUtils.compareDouble(o1, o2, THRESHOLD)) - .thenComparing(AbstractPageBlock::getMinX, (o1, o2) -> DoubleUtils.compareDouble(o1, o2, THRESHOLD))); + .thenComparing(AbstractPageBlock::getMinX, (o1, o2) -> DoubleUtils.compareDouble(o1, o2, THRESHOLD))); abstractPageBlocks.sort(new Comparator() { @Override public int compare(AbstractPageBlock o1, AbstractPageBlock o2) { @@ -134,8 +144,8 @@ public class DocstrumBlockificationService { private boolean isOnlyIntersectingYAndOnelineOrPrevoiusTwoLines(TextPageBlock previous, TextPageBlock current, ClassificationPage page) { return current.intersectsY(previous) // - && (previous.getNumberOfLines() == 1 && current.getNumberOfLines() >= 1 || previous.getNumberOfLines() == 2 && current.getNumberOfLines() == 1) // - && numberOfYIntersectionsOfSmallerBlocksWithOtherBlocks(current, previous, page.getTextBlocks()) <= 0; + && (previous.getNumberOfLines() == 1 && current.getNumberOfLines() >= 1 || previous.getNumberOfLines() == 2 && current.getNumberOfLines() == 1) // + && numberOfYIntersectionsOfSmallerBlocksWithOtherBlocks(current, previous, page.getTextBlocks()) <= 0; } @@ -144,16 +154,16 @@ public class DocstrumBlockificationService { ClassificationPage page) { return (Math.abs(previous.getMaxY() - current.getMaxY()) < THRESHOLD || Math.abs(previous.getMinY() - current.getMinY()) < THRESHOLD) // - && (previous.getNumberOfLines() == 1 && current.getNumberOfLines() >= 1 || previous.getNumberOfLines() >= 2 && current.getNumberOfLines() == 1) // - && !hasBetween(current, previous, page.getTextBlocks()) && numberOfYIntersectionsOfSmallerBlocksWithOtherBlocks(current, previous, page.getTextBlocks()) <= 4; + && (previous.getNumberOfLines() == 1 && current.getNumberOfLines() >= 1 || previous.getNumberOfLines() >= 2 && current.getNumberOfLines() == 1) // + && !hasBetween(current, previous, page.getTextBlocks()) && numberOfYIntersectionsOfSmallerBlocksWithOtherBlocks(current, previous, page.getTextBlocks()) <= 4; } private boolean areTheOnlyTwoBlocksOnHeightsWithBothMoreThanTwoLines(TextPageBlock previous, TextPageBlock current, ClassificationPage page) { return previous.getNumberOfLines() >= 2 && current.getNumberOfLines() >= 2 // - && previous.intersectsY(current) // - && numberOfYIntersectionsOfSmallerBlocksWithOtherBlocks(current, previous, page.getTextBlocks()) == 0; + && previous.intersectsY(current) // + && numberOfYIntersectionsOfSmallerBlocksWithOtherBlocks(current, previous, page.getTextBlocks()) == 0; } @@ -213,7 +223,7 @@ public class DocstrumBlockificationService { ListIterator itty = blocks.listIterator(); while (itty.hasNext()) { AbstractPageBlock block = itty.next(); - if(block == null){ + if (block == null) { continue; } if (block instanceof TablePageBlock) { @@ -224,7 +234,7 @@ public class DocstrumBlockificationService { for (int i = 0; i < blocks.size(); i++) { - if(blocks.get(i) == null){ + if (blocks.get(i) == null) { continue; } if (blocks.get(i) == current) { @@ -249,8 +259,8 @@ public class DocstrumBlockificationService { } } var blocksIterator = blocks.iterator(); - while(blocksIterator.hasNext()){ - if(blocksIterator.next() == null){ + while (blocksIterator.hasNext()) { + if (blocksIterator.next() == null) { blocksIterator.remove(); } } @@ -338,11 +348,11 @@ public class DocstrumBlockificationService { if (textBlock == null) { textBlock = new TextPageBlock(wordBlock.getMinXDirAdj(), - wordBlock.getMaxXDirAdj(), - wordBlock.getMinYDirAdj(), - wordBlock.getMaxYDirAdj(), - wordBlockList, - wordBlock.getRotation()); + wordBlock.getMaxXDirAdj(), + wordBlock.getMinYDirAdj(), + wordBlock.getMaxYDirAdj(), + wordBlockList, + wordBlock.getRotation()); } else { TextPageBlock spatialEntity = textBlock.union(wordBlock); textBlock.resize(spatialEntity.getMinX(), spatialEntity.getMinY(), spatialEntity.getWidth(), spatialEntity.getHeight()); @@ -358,7 +368,12 @@ public class DocstrumBlockificationService { textBlock.setHighestFontSize(fontSizeFrequencyCounter.getHighest()); } - if (textBlock != null && textBlock.getSequences() != null && textBlock.getSequences().stream().map(t -> round(t.getMinYDirAdj(), 3)).collect(toSet()).size() == 1) { + if (textBlock != null + && textBlock.getSequences() != null + && textBlock.getSequences() + .stream() + .map(t -> round(t.getMinYDirAdj(), 3)) + .collect(toSet()).size() == 1) { textBlock.getSequences().sort(Comparator.comparing(TextPositionSequence::getMinXDirAdj)); } return textBlock; @@ -373,38 +388,34 @@ public class DocstrumBlockificationService { List horizontalRulingLines, List verticalRulingLines) { - return isSplitByRuling(maxX, - minY, - word.getMinXDirAdj(), - word.getMinYDirAdj(), - verticalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(minX, - minY, - word.getMinXDirAdj(), - word.getMaxYDirAdj(), - horizontalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(maxX, - minY, - word.getMinXDirAdj(), - word.getMinYDirAdj(), - horizontalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(minX, - minY, - word.getMinXDirAdj(), - word.getMaxYDirAdj(), - verticalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()); + return isSplitByRuling(maxX, minY, word.getMinXDirAdj(), word.getMinYDirAdj(), verticalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()) + // + || isSplitByRuling(minX, + minY, + word.getMinXDirAdj(), + word.getMaxYDirAdj(), + horizontalRulingLines, + word.getDir().getDegrees(), + word.getPageWidth(), + word.getPageHeight()) + // + || isSplitByRuling(maxX, + minY, + word.getMinXDirAdj(), + word.getMinYDirAdj(), + horizontalRulingLines, + word.getDir().getDegrees(), + word.getPageWidth(), + word.getPageHeight()) + // + || isSplitByRuling(minX, + minY, + word.getMinXDirAdj(), + word.getMaxYDirAdj(), + verticalRulingLines, + word.getDir().getDegrees(), + word.getPageWidth(), + word.getPageHeight()); } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocuMineBlockificationService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocuMineBlockificationService.java index ca72723..fd84be5 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocuMineBlockificationService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/blockification/DocuMineBlockificationService.java @@ -34,7 +34,7 @@ public class DocuMineBlockificationService { * This method must use text direction adjusted postions (DirAdj). Where {0,0} is on the upper left. Never try to change this! * Rulings (Table lines) must be adjusted to the text directions as well, when checking if a block is split by a ruling. * - * @param textPositions The words of a page. + * @param textPositions The textPositions of a page. * @param horizontalRulingLines Horizontal table lines. * @param verticalRulingLines Vertical table lines. * @return Page object that contains the Textblock and text statistics. diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/DocumentGraphFactory.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/DocumentGraphFactory.java index 1481776..1b6f6ca 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/DocumentGraphFactory.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/DocumentGraphFactory.java @@ -7,7 +7,6 @@ import static java.util.stream.Collectors.toList; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -15,7 +14,6 @@ import java.util.NoSuchElementException; import java.util.Set; import java.util.stream.Collectors; -import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.LayoutEngine; import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; import com.knecon.fforesight.service.layoutparser.processor.model.AbstractPageBlock; import com.knecon.fforesight.service.layoutparser.processor.model.ClassificationDocument; @@ -52,6 +50,9 @@ public class DocumentGraphFactory { public Document buildDocumentGraph(LayoutParsingType layoutParsingType, ClassificationDocument document) { Document documentGraph = new Document(); + + documentGraph.setVisualizations(document.getVisualizations()); + Context context = new Context(documentGraph); document.getPages() @@ -85,14 +86,11 @@ public class DocumentGraphFactory { GenericSemanticNode node; if (originalTextBlock.isHeadline()) { - node = Headline.builder().documentTree(context.getDocumentTree()) - .build(); + node = Headline.builder().documentTree(context.getDocumentTree()).build(); } else if (originalTextBlock.isToDuplicate()) { - node = DuplicatedParagraph.builder().documentTree(context.getDocumentTree()) - .build(); + node = DuplicatedParagraph.builder().documentTree(context.getDocumentTree()).build(); } else { - node = Paragraph.builder().documentTree(context.getDocumentTree()) - .build(); + node = Paragraph.builder().documentTree(context.getDocumentTree()).build(); } page.getMainBody().add(node); @@ -178,8 +176,7 @@ public class DocumentGraphFactory { private void addFooter(List textBlocks, Context context) { Page page = context.getPage(textBlocks.get(0).getPage()); - Footer footer = Footer.builder().documentTree(context.getDocumentTree()) - .build(); + Footer footer = Footer.builder().documentTree(context.getDocumentTree()).build(); AtomicTextBlock textBlock = context.textBlockFactory.buildAtomicTextBlock(TextPositionOperations.mergeTextPositionSequence(textBlocks), footer, context, @@ -194,8 +191,7 @@ public class DocumentGraphFactory { public void addHeader(List textBlocks, Context context) { Page page = context.getPage(textBlocks.get(0).getPage()); - Header header = Header.builder().documentTree(context.getDocumentTree()) - .build(); + Header header = Header.builder().documentTree(context.getDocumentTree()).build(); AtomicTextBlock textBlock = context.textBlockFactory.buildAtomicTextBlock(TextPositionOperations.mergeTextPositionSequence(textBlocks), header, 0, page); List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(header); header.setTreeId(tocId); @@ -207,8 +203,7 @@ public class DocumentGraphFactory { private void addEmptyFooter(int pageIndex, Context context) { Page page = context.getPage(pageIndex); - Footer footer = Footer.builder().documentTree(context.getDocumentTree()) - .build(); + Footer footer = Footer.builder().documentTree(context.getDocumentTree()).build(); AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlock(footer, context, page); List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(footer); footer.setTreeId(tocId); @@ -220,8 +215,7 @@ public class DocumentGraphFactory { private void addEmptyHeader(int pageIndex, Context context) { Page page = context.getPage(pageIndex); - Header header = Header.builder().documentTree(context.getDocumentTree()) - .build(); + Header header = Header.builder().documentTree(context.getDocumentTree()).build(); AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlock(header, 0, page); List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(header); header.setTreeId(tocId); diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/SearchTextWithTextPositionFactory.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/SearchTextWithTextPositionFactory.java index c10cbee..34cea76 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/SearchTextWithTextPositionFactory.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/factory/SearchTextWithTextPositionFactory.java @@ -29,19 +29,22 @@ public class SearchTextWithTextPositionFactory { public SearchTextWithTextPositionDto buildSearchTextToTextPositionDto(List sequences) { - if (sequences.isEmpty() || sequences.stream().allMatch(sequence -> sequence.getTextPositions().isEmpty())) { + if (sequences.isEmpty() || sequences.stream() + .allMatch(sequence -> sequence.getTextPositions().isEmpty())) { return SearchTextWithTextPositionDto.empty(); } Context context = new Context(); - RedTextPosition currentTextPosition = sequences.get(0).getTextPositions().get(0); - RedTextPosition previousTextPosition = RedTextPosition.builder().unicode(" ").position(currentTextPosition.getPosition()).build(); + RedTextPosition currentTextPosition = sequences.get(0).getTextPositions() + .get(0); + RedTextPosition previousTextPosition = RedTextPosition.builder().unicode(" ").directionAdjustedPosition(currentTextPosition.getDirectionAdjustedPosition()).build(); for (TextPositionSequence word : sequences) { for (int i = 0; i < word.getTextPositions().size(); ++i) { - currentTextPosition = word.getTextPositions().get(i); + currentTextPosition = word.getTextPositions() + .get(i); if (isLineBreak(currentTextPosition, previousTextPosition)) { removeHyphenLinebreaks(context); context.lineBreaksStringIdx.add(context.stringIdx); @@ -57,7 +60,7 @@ public class SearchTextWithTextPositionFactory { ++context.positionIdx; } - previousTextPosition = RedTextPosition.builder().unicode(" ").position(previousTextPosition.getPosition()).build(); + previousTextPosition = RedTextPosition.builder().unicode(" ").directionAdjustedPosition(previousTextPosition.getDirectionAdjustedPosition()).build(); context.stringBuilder.append(" "); context.stringIdxToPositionIdx.add(context.positionIdx); ++context.stringIdx; @@ -66,7 +69,7 @@ public class SearchTextWithTextPositionFactory { assert context.stringBuilder.length() == context.stringIdxToPositionIdx.size(); List positions = sequences.stream() - .flatMap(sequence -> sequence.getTextPositions().stream().map(textPosition -> mapRedTextPositionToInitialUserSpace(textPosition, sequence))) + .map(TextPositionSequence::getBoundingBox) .toList(); return SearchTextWithTextPositionDto.builder() @@ -153,7 +156,7 @@ public class SearchTextWithTextPositionFactory { return false; } - float deltaY = Math.abs(currentPosition.getYDirAdj() - previousPosition.getYDirAdj()); + double deltaY = Math.abs(currentPosition.getYDirAdj() - previousPosition.getYDirAdj()); return deltaY >= currentPosition.getHeightDir(); } @@ -167,16 +170,16 @@ public class SearchTextWithTextPositionFactory { private boolean isHyphen(String unicodeCharacter) { return Objects.equals(unicodeCharacter, "-") || // - Objects.equals(unicodeCharacter, "~") || // - Objects.equals(unicodeCharacter, "‐") || // - Objects.equals(unicodeCharacter, "‒") || // - Objects.equals(unicodeCharacter, "⁻") || // - Objects.equals(unicodeCharacter, "−") || // - Objects.equals(unicodeCharacter, "﹣") || // - Objects.equals(unicodeCharacter, "゠") || // - Objects.equals(unicodeCharacter, "⁓") || // - Objects.equals(unicodeCharacter, "‑") || // - Objects.equals(unicodeCharacter, "\u00AD"); + Objects.equals(unicodeCharacter, "~") || // + Objects.equals(unicodeCharacter, "‐") || // + Objects.equals(unicodeCharacter, "‒") || // + Objects.equals(unicodeCharacter, "⁻") || // + Objects.equals(unicodeCharacter, "−") || // + Objects.equals(unicodeCharacter, "﹣") || // + Objects.equals(unicodeCharacter, "゠") || // + Objects.equals(unicodeCharacter, "⁓") || // + Objects.equals(unicodeCharacter, "‑") || // + Objects.equals(unicodeCharacter, "\u00AD"); } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/LegacyPDFStreamEngine.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/LegacyPDFStreamEngine.java index ff2e665..326746d 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/LegacyPDFStreamEngine.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/LegacyPDFStreamEngine.java @@ -82,7 +82,6 @@ public class LegacyPDFStreamEngine extends PDFStreamEngine { private int pageRotation; private PDRectangle pageSize; - private Matrix translateMatrix; private final GlyphList glyphList; private final Map fontHeightMap = new WeakHashMap(); @@ -134,12 +133,6 @@ public class LegacyPDFStreamEngine extends PDFStreamEngine { this.pageRotation = page.getRotation(); this.pageSize = page.getCropBox(); - if (pageSize.getLowerLeftX() == 0 && pageSize.getLowerLeftY() == 0) { - translateMatrix = null; - } else { - // translation matrix for cropbox - translateMatrix = Matrix.getTranslateInstance(-pageSize.getLowerLeftX(), -pageSize.getLowerLeftY()); - } super.processPage(page); } @@ -265,62 +258,52 @@ public class LegacyPDFStreamEngine extends PDFStreamEngine { } } - // adjust for cropbox if needed - Matrix translatedTextRenderingMatrix; - if (translateMatrix == null) { - translatedTextRenderingMatrix = textRenderingMatrix; - } else { - translatedTextRenderingMatrix = Matrix.concatenate(translateMatrix, textRenderingMatrix); - nextX -= pageSize.getLowerLeftX(); - nextY -= pageSize.getLowerLeftY(); - } - // This is a hack for unicode letter with 2 chars e.g. RA see unicodeProblem.pdf if (unicodeMapping.length() == 2) { processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - Character.toString(unicodeMapping.charAt(0)), - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); + pageSize.getWidth(), + pageSize.getHeight(), + textRenderingMatrix, + nextX, + nextY, + Math.abs(dyDisplay), + dxDisplay, + Math.abs(spaceWidthDisplay), + Character.toString(unicodeMapping.charAt(0)), + new int[]{code}, + font, + fontSize, + (int) (fontSize * textMatrix.getScalingFactorX()))); processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - Character.toString(unicodeMapping.charAt(1)), - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); + pageSize.getWidth(), + pageSize.getHeight(), + textRenderingMatrix, + nextX, + nextY, + Math.abs(dyDisplay), + dxDisplay, + Math.abs(spaceWidthDisplay), + Character.toString(unicodeMapping.charAt(1)), + new int[]{code}, + font, + fontSize, + (int) (fontSize * textMatrix.getScalingFactorX()))); } else { processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - unicodeMapping, - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); + pageSize.getWidth(), + pageSize.getHeight(), + textRenderingMatrix, + nextX, + nextY, + Math.abs(dyDisplay), + dxDisplay, + Math.abs(spaceWidthDisplay), + unicodeMapping, + new int[]{code}, + font, + fontSize, + (int) (fontSize * textMatrix.getScalingFactorX()))); } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/PDFTextStripper.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/PDFTextStripper.java index 1ca5b43..83fafea 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/PDFTextStripper.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/parsing/PDFTextStripper.java @@ -1007,7 +1007,7 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { /** * Set the desired word separator for output text. The PDFBox text extraction algorithm will output a space - * character if there is enough space between two words. By default a space character is used. If you need and + * character if there is enough space between two textPositions. By default a space character is used. If you need and * accurate count of characters that are found in a PDF document then you might want to set the word separator to * the empty string. * @@ -1703,7 +1703,7 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { /** * Write a list of string containing a whole line of a document. * - * @param line a list with the words of the given line + * @param line a list with the textPositions of the given line * @throws IOException if something went wrong */ private void writeLine(List line, boolean isParagraphEnd) throws IOException { @@ -1744,9 +1744,9 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { /** - * Handles the LTR and RTL direction of the given words. The whole implementation stands and falls with the given - * word. If the word is a full line, the results will be the best. If the word contains of single words or - * characters, the order of the characters in a word or words in a line may wrong, due to RTL and LTR marks and + * Handles the LTR and RTL direction of the given textPositions. The whole implementation stands and falls with the given + * word. If the word is a full line, the results will be the best. If the word contains of single textPositions or + * characters, the order of the characters in a word or textPositions in a line may wrong, due to RTL and LTR marks and * characters! *

* Based on http://www.nesterovsky-bros.com/weblog/2013/07/28/VisualToLogicalConversionInJava.aspx diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java index 9159742..6e25dcb 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/services/visualization/LayoutGridService.java @@ -70,7 +70,9 @@ public class LayoutGridService { Visualizations layoutGrid = this.addLayoutGrid(document, layerVisibilityDefaultValue, false); Visualizations visualLayoutGrid = this.addLayoutGrid(document, layerVisibilityDefaultValue, true); - viewerDocumentService.addVisualizationsOnPage(originFile, destinationFile, List.of(layoutGrid, visualLayoutGrid)); + List allVisualizations = Stream.concat(Stream.of(layoutGrid, visualLayoutGrid), document.getVisualizations().streamAll()).toList(); + + viewerDocumentService.addVisualizationsOnPage(originFile, destinationFile, allVisualizations); } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/MarkedContentUtils.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/MarkedContentUtils.java index 799ac99..86d79d7 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/MarkedContentUtils.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/MarkedContentUtils.java @@ -1,12 +1,5 @@ package com.knecon.fforesight.service.layoutparser.processor.utils; -import com.knecon.fforesight.service.layoutparser.processor.model.text.TextPageBlock; -import com.knecon.fforesight.service.layoutparser.processor.model.text.TextPositionSequence; -import lombok.experimental.UtilityClass; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDMarkedContent; -import org.apache.pdfbox.text.TextPosition; - import java.awt.geom.Rectangle2D; import java.util.Collection; import java.util.Collections; @@ -14,13 +7,24 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDMarkedContent; +import org.apache.pdfbox.text.TextPosition; + +import com.knecon.fforesight.service.layoutparser.processor.model.text.TextPageBlock; +import com.knecon.fforesight.service.layoutparser.processor.model.text.TextPositionSequence; + +import lombok.experimental.UtilityClass; + @UtilityClass public class MarkedContentUtils { public static final String HEADER = "Header"; public static final String FOOTER = "Footer"; - public List getMarkedContentBboxPerLine(List markedContents, String subtype) { + + public List getMarkedContentBboxPerLine(List markedContents, String subtype, PDPage pdPage) { if (markedContents == null) { return Collections.emptyList(); @@ -31,7 +35,8 @@ public class MarkedContentUtils { .filter(m -> m.getProperties() != null) .filter(m -> m.getProperties().getItem("Subtype") != null) .filter(m -> ((COSName) m.getProperties().getItem("Subtype")).getName().equals(subtype)) - .map(PDMarkedContent::getContents).flatMap(Collection::stream) + .map(PDMarkedContent::getContents) + .flatMap(Collection::stream) .filter(t -> t instanceof TextPosition) .map(t -> (TextPosition) t) .filter(t -> !t.getUnicode().equals(" ")) @@ -41,16 +46,77 @@ public class MarkedContentUtils { return Collections.emptyList(); } - return markedContentByYPosition.values().stream() - .map(textPositions -> new TextPositionSequence(textPositions.stream() - .toList(), 0, true) - .getRectangle()) - .map(t -> new Rectangle2D.Float(t.getTopLeft().getX(), t.getTopLeft().getY() - Math.abs(t.getHeight()), t.getWidth(), Math.abs(t.getHeight()))).collect(Collectors.toList()); + return markedContentByYPosition.values() + .stream() + .map(textPositions -> new TextPositionSequence(textPositions, 0, true).getRectangle()) + .map(t -> new Rectangle2D.Float(t.getTopLeft().getX(), t.getTopLeft().getY() - Math.abs(t.getHeight()), t.getWidth(), Math.abs(t.getHeight()))) + .collect(Collectors.toList()); + } + + + public List getMarkedContentPositions(List markedContents, PDPage pdPage) { + + if (markedContents == null) { + return Collections.emptyList(); + } + + return markedContents.stream() + .filter(m -> !m.getContents().isEmpty()) + .map(markedContent -> MarkedContentPosition.fromPDMarkedContent(markedContent, pdPage)) + .toList(); } public boolean intersects(TextPageBlock textBlock, Map> markedContentBboxPerType, String type) { - return markedContentBboxPerType.get(type) != null && markedContentBboxPerType.get(type).stream().anyMatch(rectangle -> rectangle.intersects(textBlock.getPdfMinX(), textBlock.getPdfMinY(), textBlock.getWidth(), textBlock.getHeight())); + + return markedContentBboxPerType.get(type) != null && markedContentBboxPerType.get(type) + .stream() + .anyMatch(rectangle -> rectangle.intersects(textBlock.getPdfMinX(), textBlock.getPdfMinY(), textBlock.getWidth(), textBlock.getHeight())); + } + + + public record MarkedContentPosition(String type, String subType, List textPositions) { + + public static MarkedContentPosition fromPDMarkedContent(PDMarkedContent markedContent, PDPage pdPage) { + + return new MarkedContentPosition(markedContent.getTag(), parseSubType(markedContent), parseTextPositions(markedContent.getContents(), pdPage)); + } + + + private static List parseTextPositions(List contents, PDPage pdPage) { + + return contents.stream() + .filter(content -> content instanceof TextPosition) + .map(content -> (TextPosition) content) + .filter(content -> !content.getUnicode().equals(" ")) + .map(textPositions -> new TextPositionSequence(List.of(textPositions), 0, true).getRectangle()) + .map(t -> new Rectangle2D.Float(t.getTopLeft().getX(), t.getTopLeft().getY() - Math.abs(t.getHeight()), t.getWidth(), Math.abs(t.getHeight()))) + .collect(Collectors.toList()); + } + + + private static String parseSubType(PDMarkedContent markedContent) { + + if (markedContent == null || markedContent.getProperties() == null || markedContent.getProperties().getItem("Subtype") == null) { + return null; + } + + return ((COSName) markedContent.getProperties().getItem("Subtype")).getName(); + } + + + public String formattedType() { + + if (subType == null || subType.isEmpty()) { + return type; + } + if (type.equals("Artifact")) { + return subType; + } + return String.format("%s-%s", type, subType); + + } + } } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangleTransformations.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangleTransformations.java index 14df80a..e61f78b 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangleTransformations.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangleTransformations.java @@ -52,7 +52,10 @@ public class RectangleTransformations { public static Rectangle2D bBoxUnionAtomicTextBlock(List atomicTextBlocks) { - return atomicTextBlocks.stream().flatMap(atomicTextBlock -> atomicTextBlock.getPositions().stream()).collect(new Rectangle2DBBoxCollector()); + return atomicTextBlocks.stream() + .flatMap(atomicTextBlock -> atomicTextBlock.getPositions() + .stream()) + .collect(new Rectangle2DBBoxCollector()); } @@ -77,7 +80,10 @@ public class RectangleTransformations { public static Rectangle2D atomicTextBlockBBox(List atomicTextBlocks) { - return atomicTextBlocks.stream().flatMap(atomicTextBlock -> atomicTextBlock.getPositions().stream()).collect(new Rectangle2DBBoxCollector()); + return atomicTextBlocks.stream() + .flatMap(atomicTextBlock -> atomicTextBlock.getPositions() + .stream()) + .collect(new Rectangle2DBBoxCollector()); } @@ -89,16 +95,18 @@ public class RectangleTransformations { public static Rectangle2D rectangleBBox(List rectangles) { - return rectangles.stream().map(RectangleTransformations::toRectangle2D).collect(new Rectangle2DBBoxCollector()); + return rectangles.stream() + .map(RectangleTransformations::toRectangle2D) + .collect(new Rectangle2DBBoxCollector()); } public static Rectangle2D toRectangle2D(Rectangle redactionLogRectangle) { return new Rectangle2D.Double(redactionLogRectangle.getTopLeft().getX(), - redactionLogRectangle.getTopLeft().getY() + redactionLogRectangle.getHeight(), - redactionLogRectangle.getWidth(), - -redactionLogRectangle.getHeight()); + redactionLogRectangle.getTopLeft().getY() + redactionLogRectangle.getHeight(), + redactionLogRectangle.getWidth(), + -redactionLogRectangle.getHeight()); } @@ -111,15 +119,16 @@ public class RectangleTransformations { public static Rectangle toRedactionLogRectangle(Rectangle2D rectangle2D, int pageNumber) { return new Rectangle(new Point((float) rectangle2D.getMinX(), (float) (rectangle2D.getMinY() + rectangle2D.getHeight())), - (float) rectangle2D.getWidth(), - -(float) rectangle2D.getHeight(), - pageNumber); + (float) rectangle2D.getWidth(), + -(float) rectangle2D.getHeight(), + pageNumber); } public static Rectangle2D rectangle2DBBox(List rectangle2DList) { - return rectangle2DList.stream().collect(new Rectangle2DBBoxCollector()); + return rectangle2DList.stream() + .collect(new Rectangle2DBBoxCollector()); } @@ -134,7 +143,9 @@ public class RectangleTransformations { if (rectangle2DList.isEmpty()) { return Collections.emptyList(); } - double splitThreshold = rectangle2DList.stream().mapToDouble(RectangularShape::getWidth).average().orElse(5) * 5.0; + double splitThreshold = rectangle2DList.stream() + .mapToDouble(RectangularShape::getWidth).average() + .orElse(5) * 5.0; List> rectangleListsWithGaps = new LinkedList<>(); List rectangleListWithoutGaps = new LinkedList<>(); @@ -195,9 +206,9 @@ public class RectangleTransformations { public BinaryOperator combiner() { return (b1, b2) -> new BBox(Math.min(b1.lowerLeftX, b2.lowerLeftX), - Math.min(b1.lowerLeftY, b2.lowerLeftY), - Math.max(b1.upperRightX, b2.upperRightX), - Math.max(b1.upperRightY, b2.upperRightY)); + Math.min(b1.lowerLeftY, b2.lowerLeftY), + Math.max(b1.upperRightX, b2.upperRightX), + Math.max(b1.upperRightY, b2.upperRightY)); } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangularIntersectionFinder.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangularIntersectionFinder.java index 3f47b40..53128a9 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangularIntersectionFinder.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RectangularIntersectionFinder.java @@ -14,23 +14,24 @@ public class RectangularIntersectionFinder { public static List find(List horizontalRulingLines, List verticalRulingLines) { - // Fix for 211.pdf - for (Ruling r : horizontalRulingLines) { - if (r.getX2() < r.getX1()) { - double a = r.getX2(); - r.x2 = (float) r.getX1(); - r.x1 = (float) a; - } - } +// // Fix for 211.pdf +// for (Ruling r : horizontalRulingLines) { +// if (r.getX2() < r.getX1()) { +// double a = r.getX2(); +// r.x2 = (float) r.getX1(); +// r.x1 = (float) a; +// } +// } List foundRectangles = new ArrayList<>(); - Map intersectionPoints = Ruling.findIntersections(horizontalRulingLines, verticalRulingLines); + Map intersectionPoints = RulingIntersectionFinder.findNaive(horizontalRulingLines, verticalRulingLines); + List intersectionPointsList = new ArrayList<>(intersectionPoints.keySet()); intersectionPointsList.sort(Y_FIRST_POINT_COMPARATOR); for (int i = 0; i < intersectionPointsList.size(); i++) { Point2D topLeft = intersectionPointsList.get(i); - Ruling[] hv = intersectionPoints.get(topLeft); + RulingIntersectionFinder.IntersectingRulings intersectingRulingsFromTopLeft = intersectionPoints.get(topLeft); // CrossingPointsDirectlyBelow( topLeft ); List xPoints = new ArrayList<>(); @@ -48,18 +49,19 @@ public class RectangularIntersectionFinder { outer: for (Point2D xPoint : xPoints) { // is there a vertical edge b/w topLeft and xPoint? - if (!hv[1].equals(intersectionPoints.get(xPoint)[1])) { + if (!intersectingRulingsFromTopLeft.vertical().equals(intersectionPoints.get(xPoint).vertical())) { continue; } for (Point2D yPoint : yPoints) { // is there a horizontal edge b/w topLeft and yPoint ? - if (!hv[0].equals(intersectionPoints.get(yPoint)[0])) { + if (!intersectingRulingsFromTopLeft.horizontal().equals(intersectionPoints.get(yPoint).horizontal())) { continue; } Point2D btmRight = new Point2D.Float((float) yPoint.getX(), (float) xPoint.getY()); if (intersectionPoints.containsKey(btmRight) - && intersectionPoints.get(btmRight)[0].equals(intersectionPoints.get(xPoint)[0]) - && intersectionPoints.get(btmRight)[1].equals(intersectionPoints.get(yPoint)[1])) { + && intersectionPoints.get(btmRight).horizontal().equals(intersectionPoints.get(xPoint).horizontal()) + && intersectionPoints.get(btmRight).vertical().equals(intersectionPoints.get(yPoint).vertical())) { + foundRectangles.add(new Rectangle2D.Double(topLeft.getX(), topLeft.getY(), btmRight.getX() - topLeft.getX(), btmRight.getY() - topLeft.getY())); break outer; } diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RulingIntersectionFinder.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RulingIntersectionFinder.java new file mode 100644 index 0000000..70ea31b --- /dev/null +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/utils/RulingIntersectionFinder.java @@ -0,0 +1,201 @@ +package com.knecon.fforesight.service.layoutparser.processor.utils; + +import java.awt.geom.Point2D; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; + +import com.knecon.fforesight.service.layoutparser.processor.model.table.Ruling; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@UtilityClass +public class RulingIntersectionFinder { + + public static final int PERPENDICULAR_UNIT_EXPAND_AMOUNT = 2; + + public static final Comparator Y_THEN_X_POINT_COMPARATOR = Comparator.comparingDouble(Point2D::getY).thenComparing(Point2D::getX); + + + /** + * Implementation to find line intersection in O(P + n log n), where n is the number of lines and P the numer of intersections + * based on Segment Intersection by Piotr Indyk + * The algorithm assumes there are only horizontal and vertical lines which are unique in their coordinates. (E.g. no overlapping horizontal lines exist) + * As a high level overview, the algorithm uses a sweep line advancing from left to right. + * It dynamically updates the horizontal rulings which are intersected by the current sweep line. + * When the sweep line hits a vertical line, it then checks for all intersections with the currently intersected horizontal rulings. + * THe trick of the algorithm is using a binary search tree to store the currently intersected horizontal rulings. This way the lookup should be in O(log n). + * This way the initial sorting step has the highest complexity class (O(n log n) and thus determines the complexity class of the entire algorithm + * + * Unfortunately, the implementation here takes a few liberties compared to the original algorithm. The binary search tree is replaced by an ordered Set which is simply looped over. + * Therefore, this implementation's worst case, where all horizontal lines span the entire sweep, you are essentially performing the naive approach with a bunch of overhead. + * Since we are using this implementation to find table cells, one can expect this worst case to always be the case. + * + * A simple runtime comparison for a single page with the most lines we can expect (SinglePages/AbsolutelyEnormousTable.pdf with 30 horizontals and 144 verticals) shows this implementation takes roughly 14 ms, whereas the naive approach takes 7 ms. Both are negligible, but the naive approach is two times as fast. + * + * If we would like to make this faster, we would need a better data structure for 'TreeMap horizontalRulingsInCurrentSweep', where we can query the TreeMap for all horizontal rulings in a given interval in O(log n). + * + * @param horizontals a list of non-overlapping horizontal rulings + * @param verticals a list of non-overlapping vertical rulings + * @return a Map of each found intersection point pointing to the two lines forming the intersection. + */ + public Map find(List horizontals, List verticals) { + + long start = System.currentTimeMillis(); + List sweepTrajectory = buildSweepTrajectory(horizontals, verticals); + + TreeMap horizontalRulingsInCurrentSweep = new TreeMap<>(Comparator.comparingDouble(Ruling::getTop)); + + TreeMap intersections = new TreeMap<>(Y_THEN_X_POINT_COMPARATOR); + + for (SweepStep step : sweepTrajectory) { + switch (step.type) { + case VERTICAL: // check for intersections with currently intersected horizontal lines + for (Ruling horizontalRuling : horizontalRulingsInCurrentSweep.navigableKeySet()) { + + Optional intersectionPoint = findIntersectionPoint(horizontalRuling, step.ruling); + + if (intersectionPoint.isEmpty()) { + continue; + } + + intersections.put(intersectionPoint.get(), new IntersectingRulings(horizontalRuling, step.ruling)); + } + break; + case HORIZONTAL_ENTRY: // sweep line now intersects this horizontal ruling + horizontalRulingsInCurrentSweep.put(step.ruling, null); + break; + case HORIZONTAL_EXIT: // sweep line no longer intersects this horizontal ruling + horizontalRulingsInCurrentSweep.remove(step.ruling); + break; + } + } + log.debug("Finished building intersections with line sweep in {} ms", System.currentTimeMillis() - start); + + return intersections; + + } + + + /** + * Naive Approach in O(n^2) of finding intersections between lines by iterating over all lines. + * + * @param horizontals a list of non-overlapping horizontal rulings + * @param verticals a list of non-overlapping vertical rulings + * @return a Map of each found intersection point pointing to the two lines forming the intersection. + */ + public Map findNaive(List horizontals, List verticals) { + + long start = System.currentTimeMillis(); + TreeMap intersections = new TreeMap<>(Y_THEN_X_POINT_COMPARATOR); + + for (Ruling horizontal : horizontals) { + for (Ruling vertical : verticals) { + Optional intersectionPoint = findIntersectionPoint(horizontal, vertical); + + if (intersectionPoint.isEmpty()) { + continue; + } + + intersections.put(intersectionPoint.get(), new IntersectingRulings(horizontal, vertical)); + } + } + log.debug("Finished building intersections naively in {} ms", System.currentTimeMillis() - start); + + return intersections; + } + + + private static List buildSweepTrajectory(List horizontals, List verticals) { + + List sweepTrajectory = new LinkedList<>(); + + for (Ruling horizontalRuling : horizontals) { + sweepTrajectory.add(new SweepStep(SweepStep.Type.HORIZONTAL_ENTRY, horizontalRuling.getLeft() - PERPENDICULAR_UNIT_EXPAND_AMOUNT, horizontalRuling)); + sweepTrajectory.add(new SweepStep(SweepStep.Type.HORIZONTAL_EXIT, horizontalRuling.getRight() + PERPENDICULAR_UNIT_EXPAND_AMOUNT, horizontalRuling)); + } + + for (Ruling verticalRuling : verticals) { + sweepTrajectory.add(new SweepStep(SweepStep.Type.VERTICAL, verticalRuling.getLeft(), verticalRuling)); + } + + Collections.sort(sweepTrajectory); + + return sweepTrajectory; + } + + + public Optional findIntersectionPoint(Ruling horizontal, Ruling vertical) { + + if (!horizontal.isHorizontal() || !vertical.isVertical()) { + log.warn("lines must be orthogonal, vertical and horizontal"); + return Optional.empty(); + } + + Ruling expanded_horizontal = horizontal.expand(PERPENDICULAR_UNIT_EXPAND_AMOUNT); + Ruling expanded_vertical = vertical.expand(PERPENDICULAR_UNIT_EXPAND_AMOUNT); + + if (!expanded_horizontal.intersectsLine(expanded_vertical)) { + return Optional.empty(); + } + + return Optional.of(new Point2D.Float(vertical.getLeft(), horizontal.getTop())); + } + + + private class SweepStep implements Comparable { + + protected Type type; + protected float y_position; + protected Ruling ruling; + + private enum Type { + VERTICAL, + HORIZONTAL_EXIT, + HORIZONTAL_ENTRY + } + + + public SweepStep(Type type, float y_position, Ruling ruling) { + + this.type = type; + this.y_position = y_position; + this.ruling = ruling; + } + + + @Override + public int compareTo(SweepStep other) { + + int rv; + if (DoubleComparisons.feq(y_position, other.y_position)) { + if (type == SweepStep.Type.VERTICAL && other.type == SweepStep.Type.HORIZONTAL_ENTRY) { + rv = 1; + } else if (type == SweepStep.Type.VERTICAL && other.type == SweepStep.Type.HORIZONTAL_EXIT) { + rv = -1; + } else if (type == SweepStep.Type.HORIZONTAL_ENTRY && other.type == SweepStep.Type.VERTICAL) { + rv = -1; + } else if (type == SweepStep.Type.HORIZONTAL_EXIT && other.type == SweepStep.Type.VERTICAL) { + rv = 1; + } else { + rv = Double.compare(y_position, other.y_position); + } + } else { + return Double.compare(y_position, other.y_position); + } + return rv; + } + + } + + public record IntersectingRulings(Ruling horizontal, Ruling vertical) { + + } + +} diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/visualization/LayoutparsingVisualizations.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/visualization/LayoutparsingVisualizations.java new file mode 100644 index 0000000..77eb8f3 --- /dev/null +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/visualization/LayoutparsingVisualizations.java @@ -0,0 +1,252 @@ +package com.knecon.fforesight.service.layoutparser.processor.visualization; + +import java.awt.Color; +import java.awt.geom.Line2D; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Stream; + +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDMarkedContent; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; +import com.knecon.fforesight.service.layoutparser.processor.docstrum.model.BoundingBox; +import com.knecon.fforesight.service.layoutparser.processor.docstrum.model.Line; +import com.knecon.fforesight.service.layoutparser.processor.docstrum.model.Zone; +import com.knecon.fforesight.service.layoutparser.processor.model.table.CleanRulings; +import com.knecon.fforesight.service.layoutparser.processor.model.text.RedTextPosition; +import com.knecon.fforesight.service.layoutparser.processor.model.text.TextPositionSequence; +import com.knecon.fforesight.service.layoutparser.processor.utils.MarkedContentUtils; +import com.knecon.fforesight.service.layoutparser.processor.utils.RectangleTransformations; +import com.knecon.fforesight.service.viewerdoc.ContentStreams; +import com.knecon.fforesight.service.viewerdoc.model.ColoredLine; +import com.knecon.fforesight.service.viewerdoc.model.ColoredRectangle; +import com.knecon.fforesight.service.viewerdoc.model.PlacedText; +import com.knecon.fforesight.service.viewerdoc.model.Standard14EmbeddableFont; +import com.knecon.fforesight.service.viewerdoc.model.Visualizations; +import com.knecon.fforesight.service.viewerdoc.model.VisualizationsOnPage; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.FieldDefaults; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class LayoutparsingVisualizations { + + static final Standard14EmbeddableFont FONT = Standard14EmbeddableFont.helvetica(); + + static final Color WORDS_COLOR = new Color(68, 84, 147); + static final Color LINES_COLOR = new Color(152, 45, 179); + static final Color ZONES_COLOR = new Color(131, 38, 38); + static final Color RULINGS_COLOR = new Color(21, 221, 174); + static final Color CELLS_COLOR = new Color(31, 214, 27); + static final Color MAIN_BODY_COLOR = new Color(171, 131, 6); + static final Color MARKED_CONTENT_COLOR = new Color(171, 131, 6); + + static final List ROTATING_CHARACTER_COLOR = List.of(new Color(255, 87, 51), + new Color(255, 195, 0), + new Color(76, 175, 80), + new Color(33, 150, 243), + new Color(155, 89, 182), + new Color(233, 30, 99), + new Color(0, 188, 212), + new Color(121, 85, 72)); + + @Setter + boolean active = false; + + final Visualizations words = Visualizations.builder().layer(ContentStreams.WORDS).build(); + final Visualizations lines = Visualizations.builder().layer(ContentStreams.LINES).build(); + final Visualizations zones = Visualizations.builder().layer(ContentStreams.ZONES).build(); + final Visualizations mainBody = Visualizations.builder().layer(ContentStreams.MAIN_BODY).build(); + final Visualizations rulings = Visualizations.builder().layer(ContentStreams.RULINGS).build(); + final Visualizations cells = Visualizations.builder().layer(ContentStreams.CELLS).build(); + final Visualizations markedContent = Visualizations.builder().layer(ContentStreams.MARKED_CONTENT).build(); + final Visualizations neighbours = Visualizations.builder().layer(ContentStreams.NEIGHBOURS).build(); + final Visualizations characters = Visualizations.builder().layer(ContentStreams.CHARACTERS).build(); + + + public Stream streamAll() { + + if (!active) { + return Stream.empty(); + } + return Stream.of(characters, // + neighbours,// + words, // + lines, // + zones, // + rulings, // + cells, // + mainBody, // + markedContent // + ); + } + + + public void addTextVisualizations(List textPositionSequences, int pageNumber) { + + if (!active) { + return; + } + List list = textPositionSequences.stream() + .map(textPositionSequence -> textPositionSequence.getTextPositions() + .stream() + .map(RedTextPosition::getInitialUserSpacePosition) + .collect(RectangleTransformations.collectBBox())) + .map(rect -> new ColoredRectangle(rect, WORDS_COLOR, 1)) + .toList(); + this.words.getVisualizationsOnPages().put(pageNumber - 1, VisualizationsOnPage.builder().coloredRectangles(list).build()); + } + + + public void addCleanRulingVisualization(CleanRulings cleanRulings, int pageNumber) { + + if (!active) { + return; + } + this.rulings.getVisualizationsOnPages() + .put(pageNumber - 1, + VisualizationsOnPage.builder() + .coloredLines(Stream.of(cleanRulings.getHorizontal(), cleanRulings.getVertical()) + .flatMap(Collection::stream) + .map(ruling -> new ColoredLine(ruling, RULINGS_COLOR, 1)) + .toList()) + .build()); + } + + + public void addCellVisualizations(List cells, int pageNumber) { + + if (!active) { + return; + } + this.cells.getVisualizationsOnPages() + .put(pageNumber - 1, + VisualizationsOnPage.builder() + .coloredRectangles(cells.stream() + .map(ruling -> new ColoredRectangle(ruling, CELLS_COLOR, 1)) + .toList()) + .build()); + } + + + public void addZoneVisualizations(List zones, int page) { + + if (!active) { + return; + } + + this.zones.getVisualizationsOnPages() + .put(page - 1, + VisualizationsOnPage.builder() + .coloredRectangles(zones.stream() + .map(BoundingBox::getBBox) + .map(zone -> new ColoredRectangle(zone, ZONES_COLOR, 1)) + .toList()) + .build()); + + } + + + public void addLineVisualizations(List zones, int page) { + + if (!active) { + return; + } + this.lines.getVisualizationsOnPages() + .put(page - 1, + VisualizationsOnPage.builder() + .coloredRectangles(zones.stream() + .map(Zone::getLines) + .flatMap(Collection::stream) + .map(BoundingBox::getBBox) + .map(line -> new ColoredRectangle(line, LINES_COLOR, 1)) + .toList()) + .build()); + } + + + public void addMainBodyVisualization(Rectangle rectangle, int pageNumber) { + + if (!active) { + return; + } + this.mainBody.getVisualizationsOnPages() + .put(pageNumber - 1, + VisualizationsOnPage.builder() + .coloredRectangles(List.of(new ColoredRectangle(new Rectangle2D.Double(rectangle.getTopLeft().getX(), + rectangle.getTopLeft().getY(), + rectangle.getWidth(), + rectangle.getHeight()), MAIN_BODY_COLOR, 1))) + .build()); + } + + + public void addMarkedContentVisualizations(List markedContents, int pageNumber, PDPage pdPage) { + + if (!active) { + return; + } + List markedContentBBoxMapBySubType = MarkedContentUtils.getMarkedContentPositions(markedContents, pdPage); + VisualizationsOnPage visualizationsOnPage = VisualizationsOnPage.builder().build(); + this.markedContent.getVisualizationsOnPages().put(pageNumber - 1, visualizationsOnPage); + markedContentBBoxMapBySubType.forEach(markedContentPosition -> { + + var bbox = markedContentPosition.textPositions() + .stream() + .collect(RectangleTransformations.collectBBox()); + String type = markedContentPosition.formattedType(); + float translationAmount = ((FONT.getStringWidth(type) / 1000) * 10 + (2 * 1) + 4); + visualizationsOnPage.getPlacedTexts() + .add(PlacedText.textFacingUp(type, new Point2D.Double(bbox.getX() - translationAmount, bbox.getY() + bbox.getHeight()), 10, Color.BLACK, FONT)); + + visualizationsOnPage.getColoredRectangles().add(new ColoredRectangle(bbox, MARKED_CONTENT_COLOR, 1)); + } + + ); + + } + + + public void addCharactersWithNeighbours(List zones, int page) { + + if (!active) { + return; + } + + VisualizationsOnPage neighbourVisualizations = VisualizationsOnPage.builder().build(); + neighbours.getVisualizationsOnPages().put(page - 1, neighbourVisualizations); + VisualizationsOnPage characterVisualizations = VisualizationsOnPage.builder().build(); + characters.getVisualizationsOnPages().put(page - 1, characterVisualizations); + + AtomicInteger index = new AtomicInteger(0); + zones.forEach(zone -> zone.getLines() + .stream() + .map(Line::getCharacters) + .flatMap(Collection::stream) + .forEach(character -> { + Color color = ROTATING_CHARACTER_COLOR.get(index.getAndIncrement() % ROTATING_CHARACTER_COLOR.size()); + Rectangle2D charBBox = character.getTextPosition().getInitialUserSpacePosition(); + characterVisualizations.getColoredRectangles().add(new ColoredRectangle(charBBox, color, 1)); + character.getNeighbors() + .forEach(neighbor -> { + Rectangle2D neighborBBox = neighbor.getCharacter().getTextPosition().getInitialUserSpacePosition(); + Line2D line = new Line2D.Double(new Point2D.Double(charBBox.getCenterX(), charBBox.getCenterY()), + new Point2D.Double(neighborBBox.getCenterX(), neighborBBox.getCenterY())); + neighbourVisualizations.getColoredLines().add(new ColoredLine(line, color, 1)); + }); + })); + + } + +} diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/LayoutparserEnd2EndTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/LayoutparserEnd2EndTest.java index 7fde740..b5771a2 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/LayoutparserEnd2EndTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/LayoutparserEnd2EndTest.java @@ -1,10 +1,20 @@ package com.knecon.fforesight.service.layoutparser.server; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import com.iqser.red.storage.commons.utils.FileSystemBackedStorageService; import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingRequest; import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; @@ -22,26 +32,63 @@ public class LayoutparserEnd2EndTest extends AbstractTest { @Test - @SneakyThrows public void testLayoutParserEndToEnd() { - prepareStorage("files/bdr/Wie weiter bei Kristeneinrichtungen.pdf"); - LayoutParsingRequest layoutParsingRequest = buildDefaultLayoutParsingRequest(LayoutParsingType.REDACT_MANAGER); - LayoutParsingFinishedEvent finishedEvent = layoutParsingPipeline.parseLayoutAndSaveFilesToStorage(layoutParsingRequest); - Arrays.stream(finishedEvent.message().split("\n")) - .forEach(log::info); + String filePath = "files/bdr/Wie weiter bei Kristeneinrichtungen.pdf"; + + runForFile(filePath); + } + + @Test + @Disabled + @SneakyThrows + public void testLayoutParserEndToEndWithFolder() { + + String folder = "/home/kschuettler/Dokumente/TestFiles/syn-dm-testfiles-pdftron-ocred"; + List pdfFiles = Files.walk(Path.of(folder)) + .filter(path -> path.getFileName().toString().endsWith(".pdf")) + .sorted(Comparator.comparing(Path::getFileName)) + .peek(System.out::println) + .toList(); + + System.out.printf("Found %d pdf files to process %n", pdfFiles.size()); + AtomicInteger count = new AtomicInteger(0); + pdfFiles.stream() + .peek(path -> log.info("{}/{}-{}", count.getAndIncrement(), pdfFiles.size(), path.getFileName())) + .forEach(path -> runForFile(path.toFile().toString())); } - @Test @SneakyThrows - public void testLayoutParserEndToEnd_RED_8747() { + private void runForFile(String filePath) { + + String fileName = Path.of(filePath).getFileName().toString(); + File file; + if (filePath.startsWith("files")) { // from resources + file = new ClassPathResource(filePath).getFile(); + } else { // absolute path + file = new File(filePath); + } + + LayoutParsingRequest layoutParsingRequest = buildDefaultLayoutParsingRequest(fileName, LayoutParsingType.REDACT_MANAGER, true); + prepareStorage(layoutParsingRequest, file); - prepareStorage("files/syngenta/CustomerFiles/SinglePages/Page26_fRR A23317A PI0015600 CEU core part B6 - CZ.pdf"); - LayoutParsingRequest layoutParsingRequest = buildDefaultLayoutParsingRequest(LayoutParsingType.REDACT_MANAGER_OLD); LayoutParsingFinishedEvent finishedEvent = layoutParsingPipeline.parseLayoutAndSaveFilesToStorage(layoutParsingRequest); + Arrays.stream(finishedEvent.message().split("\n")) .forEach(log::info); + + File tmpFile = new File("/tmp/layout-E2E/" + fileName + "_VIEWER.pdf"); + assert tmpFile.getParentFile().exists() || tmpFile.getParentFile().mkdirs(); + + storageService.downloadTo(TENANT_ID, layoutParsingRequest.viewerDocumentStorageId(), tmpFile); + } + + + @AfterEach + public void cleanUpTmp() { + + ((FileSystemBackedStorageService) storageService).clearStorage(); } } diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/ViewerDocumentTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/ViewerDocumentTest.java index a26754a..5ebb0cc 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/ViewerDocumentTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/ViewerDocumentTest.java @@ -23,6 +23,10 @@ import lombok.SneakyThrows; public class ViewerDocumentTest extends BuildDocumentTest { + ViewerDocumentService viewerDocumentService = new ViewerDocumentService(null); + LayoutGridService layoutGridService = new LayoutGridService(viewerDocumentService); + + @Test @SneakyThrows public void testViewerDocument() { @@ -31,11 +35,9 @@ public class ViewerDocumentTest extends BuildDocumentTest { String tmpFileName = "/tmp/" + Path.of(fileName).getFileName() + "_VIEWER.pdf"; var documentFile = new ClassPathResource(fileName).getFile(); - ViewerDocumentService viewerDocumentService = new ViewerDocumentService(null); - LayoutGridService layoutGridService = new LayoutGridService(viewerDocumentService); long start = System.currentTimeMillis(); - Document document = buildGraph(fileName, LayoutParsingType.DOCUMINE); + Document document = buildGraph(fileName, LayoutParsingType.REDACT_MANAGER); layoutGridService.addLayoutGrid(documentFile, document, new File(tmpFileName), true); System.out.printf("Total time: %.2fs%n", ((float) (System.currentTimeMillis() - start)) / 1000); } @@ -55,11 +57,11 @@ public class ViewerDocumentTest extends BuildDocumentTest { var documentFile = new ClassPathResource(fileName).getFile(); var classificationDocument = layoutParsingPipeline.parseLayout(LayoutParsingType.DOCUMINE, - documentFile, - new ImageServiceResponse(), - tableResponse, - new VisualLayoutParsingResponse(), - Map.of("file", Path.of(fileName).getFileName().toFile().toString())); + documentFile, + new ImageServiceResponse(), + tableResponse, + new VisualLayoutParsingResponse(), + Map.of("file", Path.of(fileName).getFileName().toFile().toString())); ViewerDocumentService viewerDocumentService = new ViewerDocumentService(null); LayoutGridService layoutGridService = new LayoutGridService(viewerDocumentService); Document document = DocumentGraphFactory.buildDocumentGraph(LayoutParsingType.DOCUMINE, classificationDocument); diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/AbstractTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/AbstractTest.java index c0e2809..cfd8cb9 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/AbstractTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/AbstractTest.java @@ -1,6 +1,9 @@ package com.knecon.fforesight.service.layoutparser.server.utils; +import java.io.File; +import java.io.FileInputStream; import java.io.InputStream; +import java.nio.file.Path; import java.util.Map; import java.util.Optional; @@ -102,29 +105,22 @@ public abstract class AbstractTest { } - @SneakyThrows - protected LayoutParsingRequest prepareStorage(InputStream fileInputStream) { - - storageService.storeObject(TenantContext.getTenantId(), ORIGIN_FILE_ID, fileInputStream); - return buildDefaultLayoutParsingRequest(LayoutParsingType.REDACT_MANAGER_OLD); - } - - - protected LayoutParsingRequest buildDefaultLayoutParsingRequest(LayoutParsingType layoutParsingType) { + protected LayoutParsingRequest buildDefaultLayoutParsingRequest(String fileName, LayoutParsingType layoutParsingType, boolean debug) { + var identifier = debug ? Map.of("fileId", fileName, "debug", "true") : Map.of("fileId", fileName); return LayoutParsingRequest.builder() - .identifier(Map.of("fileId", "1337")) + .identifier(identifier) .layoutParsingType(layoutParsingType) - .originFileStorageId(ORIGIN_FILE_ID) - .tablesFileStorageId(Optional.of(TABLE_FILE_ID)) - .imagesFileStorageId(Optional.of(IMAGE_FILE_ID)) - .visualLayoutParsingFileId(Optional.of(VISUAL_LAYOUT_FILE)) - .structureFileStorageId(STRUCTURE_FILE_ID) - .textBlockFileStorageId(TEXT_FILE_ID) - .positionBlockFileStorageId(POSITION_FILE_ID) - .pageFileStorageId(PAGES_FILE_ID) - .simplifiedTextStorageId(SIMPLIFIED_ID) - .viewerDocumentStorageId(VIEWER_DOCUMENT_ID) + .originFileStorageId(fileName + ORIGIN_FILE_ID) + .tablesFileStorageId(Optional.of(fileName + TABLE_FILE_ID)) + .imagesFileStorageId(Optional.of(fileName + IMAGE_FILE_ID)) + .visualLayoutParsingFileId(Optional.of(fileName + VISUAL_LAYOUT_FILE)) + .structureFileStorageId(fileName + STRUCTURE_FILE_ID) + .textBlockFileStorageId(fileName + TEXT_FILE_ID) + .positionBlockFileStorageId(fileName + POSITION_FILE_ID) + .pageFileStorageId(fileName + PAGES_FILE_ID) + .simplifiedTextStorageId(fileName + SIMPLIFIED_ID) + .viewerDocumentStorageId(fileName + VIEWER_DOCUMENT_ID) .build(); } @@ -148,10 +144,28 @@ public abstract class AbstractTest { ClassPathResource imageInfoFileResource = new ClassPathResource(imageInfoFile); ClassPathResource visualLayoutParsingResponseResource = new ClassPathResource(visualLayoutParsingResponseFile); - return prepareStorage(pdfFileResource.getInputStream(), - cvServiceResponseFileResource.getInputStream(), - imageInfoFileResource.getInputStream(), - visualLayoutParsingResponseResource.getInputStream()); + return prepareStorage(Path.of(file).getFileName().toString(), + pdfFileResource.getInputStream(), + cvServiceResponseFileResource.getInputStream(), + imageInfoFileResource.getInputStream(), + visualLayoutParsingResponseResource.getInputStream()); + } + + + @SneakyThrows + protected void prepareStorage(LayoutParsingRequest layoutParsingRequest, File file) { + + ClassPathResource cvServiceResponseFileResource = new ClassPathResource("cv_table_parsing_response/empty.json"); + ClassPathResource imageInfoFileResource = new ClassPathResource("image_service_response/empty.json"); + ClassPathResource visualLayoutParsingResponseResource = new ClassPathResource("visual_layout_parsing_response/empty.json"); + + try (var in = new FileInputStream(file)) { + prepareStorage(layoutParsingRequest, + in, + cvServiceResponseFileResource.getInputStream(), + imageInfoFileResource.getInputStream(), + visualLayoutParsingResponseResource.getInputStream()); + } } @@ -162,12 +176,27 @@ public abstract class AbstractTest { storageService.storeObject(TenantContext.getTenantId(), TABLE_FILE_ID, cvServiceResponseFileStream); storageService.storeObject(TenantContext.getTenantId(), ORIGIN_FILE_ID, fileStream); - return buildDefaultLayoutParsingRequest(LayoutParsingType.REDACT_MANAGER_OLD); + return buildDefaultLayoutParsingRequest("test", LayoutParsingType.REDACT_MANAGER_OLD, true); } @SneakyThrows - protected LayoutParsingRequest prepareStorage(InputStream fileStream, + protected void prepareStorage(LayoutParsingRequest layoutParsingRequest, + InputStream fileStream, + InputStream cvServiceResponseFileStream, + InputStream imageInfoStream, + InputStream visualLayoutParsingResponseFileStream) { + + storageService.storeObject(TenantContext.getTenantId(), layoutParsingRequest.imagesFileStorageId().get(), imageInfoStream); + storageService.storeObject(TenantContext.getTenantId(), layoutParsingRequest.tablesFileStorageId().get(), cvServiceResponseFileStream); + storageService.storeObject(TenantContext.getTenantId(), layoutParsingRequest.originFileStorageId(), fileStream); + storageService.storeObject(TenantContext.getTenantId(), layoutParsingRequest.visualLayoutParsingFileId().get(), visualLayoutParsingResponseFileStream); + } + + + @SneakyThrows + protected LayoutParsingRequest prepareStorage(String fileName, + InputStream fileStream, InputStream cvServiceResponseFileStream, InputStream imageInfoStream, InputStream visualLayoutParsingResponseFileStream) { @@ -177,7 +206,7 @@ public abstract class AbstractTest { storageService.storeObject(TenantContext.getTenantId(), ORIGIN_FILE_ID, fileStream); storageService.storeObject(TenantContext.getTenantId(), VISUAL_LAYOUT_FILE, visualLayoutParsingResponseFileStream); - return buildDefaultLayoutParsingRequest(LayoutParsingType.REDACT_MANAGER_OLD); + return buildDefaultLayoutParsingRequest(fileName, LayoutParsingType.REDACT_MANAGER_OLD, true); } diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/BuildDocumentTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/BuildDocumentTest.java index af2717b..cbd6201 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/BuildDocumentTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/BuildDocumentTest.java @@ -1,11 +1,13 @@ package com.knecon.fforesight.service.layoutparser.server.utils; import java.io.File; +import java.nio.file.Path; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingRequest; import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingPipeline; import com.knecon.fforesight.service.layoutparser.processor.model.ClassificationDocument; @@ -28,11 +30,11 @@ public abstract class BuildDocumentTest extends AbstractTest { File fileResource = new ClassPathResource(filename).getFile(); prepareStorage(filename); return layoutParsingPipeline.parseLayout(layoutParsingType, - fileResource, - layoutParsingStorageService.getImagesFile(IMAGE_FILE_ID), - new TableServiceResponse(), - new VisualLayoutParsingResponse(), - Map.of("file",filename)); + fileResource, + layoutParsingStorageService.getImagesFile(IMAGE_FILE_ID), + new TableServiceResponse(), + new VisualLayoutParsingResponse(), + Map.of("file", filename, "debug", "true")); } @@ -46,13 +48,25 @@ public abstract class BuildDocumentTest extends AbstractTest { @SneakyThrows protected Document buildGraph(String filename, LayoutParsingType layoutParsingType) { - if (filename.equals("files/syngenta/CustomerFiles/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf")) { - prepareStorage(filename, "cv_table_parsing_response/empty.json", "image_service_response/S-Metolachlor_RAR_01_Volume_1_2018-09-06.IMAGE_INFO.json"); + if (!filename.startsWith("files") && filename.startsWith("/")) { + LayoutParsingRequest layoutParsingRequest = buildDefaultLayoutParsingRequest(Path.of(filename).getFileName().toString(), LayoutParsingType.REDACT_MANAGER, true); + prepareStorage(layoutParsingRequest, new File(filename)); + return DocumentGraphFactory.buildDocumentGraph(layoutParsingType, + layoutParsingPipeline.parseLayout(layoutParsingType, + new File(filename), + layoutParsingStorageService.getImagesFile(layoutParsingRequest.imagesFileStorageId().get()), + new TableServiceResponse(), + new VisualLayoutParsingResponse(), + layoutParsingRequest.identifier())); } else { - prepareStorage(filename); + if (filename.equals("files/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf")) { + prepareStorage(filename, "cv_table_parsing_response/empty.json", "image_service_response/S-Metolachlor_RAR_01_Volume_1_2018-09-06.IMAGE_INFO.json"); + } else { + prepareStorage(filename); + } + return DocumentGraphFactory.buildDocumentGraph(layoutParsingType, parseLayout(filename, layoutParsingType)); } - return DocumentGraphFactory.buildDocumentGraph(layoutParsingType, parseLayout(filename, layoutParsingType)); } } diff --git a/layoutparser-service/layoutparser-service-server/src/test/resources/files/SinglePages/AbsolutelyEnormousTable.pdf b/layoutparser-service/layoutparser-service-server/src/test/resources/files/SinglePages/AbsolutelyEnormousTable.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e6d9a0706fbe77ac83675ab37e891e59ab47ab73 GIT binary patch literal 333828 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%0A>koJ-UmdEmLkH>NqB}-^5z62gik*+1| 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%0DZA*l|R0V!~KidDw%F685_g>&oTnDw&d#*7?c% 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 z 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�vD~SR+z)x0}ho>y5uRwf_;oN0VCa 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 z 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 z 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 Oj0`z9x0)`9{Qm$q0=cyS literal 0 HcmV?d00001 diff --git a/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/ContentStreams.java b/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/ContentStreams.java index 937f75d..d92c039 100644 --- a/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/ContentStreams.java +++ b/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/ContentStreams.java @@ -26,6 +26,23 @@ public class ContentStreams { public static Identifier ESCAPE_END = new Identifier("escape start", COSName.getPDFName("ESCAPE_END"), false); + public static Identifier RULINGS = new Identifier("Rulings", COSName.getPDFName("KNECON_RULINGS"), true); + + public static Identifier WORDS = new Identifier("Words", COSName.getPDFName("KNECON_WORDS"), true); + + public static Identifier ZONES = new Identifier("Text Zones", COSName.getPDFName("KNECON_ZONES"), true); + + public static Identifier LINES = new Identifier("Text Lines", COSName.getPDFName("KNECON_LINES"), true); + + public static Identifier CELLS = new Identifier("Cells", COSName.getPDFName("KNECON_CELLS"), true); + + public static Identifier MAIN_BODY = new Identifier("Main Text Body", COSName.getPDFName("KNECON_MAIN_BODY"), true); + + public static Identifier MARKED_CONTENT = new Identifier("Marked content", COSName.getPDFName("KNECON_MARKED_CONTENT"), true); + + public static Identifier NEIGHBOURS = new Identifier("Neighbours", COSName.getPDFName("KNECON_NEIGHBOURS"), true); + public static Identifier CHARACTERS = new Identifier("Characters", COSName.getPDFName("KNECON_CHARACTERS"), true); + public static List allContentStreams = List.of(KNECON_LAYOUT, KNECON_VISUAL_PARSING, KNECON_OCR, @@ -33,7 +50,16 @@ public class ContentStreams { KNECON_OCR_TEXT_DEBUG, OTHER, ESCAPE_START, - ESCAPE_END); + ESCAPE_END, + RULINGS, + WORDS, + ZONES, + LINES, + MAIN_BODY, + MARKED_CONTENT, + NEIGHBOURS, + CHARACTERS, + CELLS); public record Identifier(String name, COSName cosName, boolean optionalContent) { diff --git a/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/model/Visualizations.java b/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/model/Visualizations.java index fb17113..6af80b9 100644 --- a/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/model/Visualizations.java +++ b/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/model/Visualizations.java @@ -1,5 +1,6 @@ package com.knecon.fforesight.service.viewerdoc.model; +import java.util.LinkedHashMap; import java.util.Map; import com.knecon.fforesight.service.viewerdoc.ContentStreams; @@ -17,7 +18,8 @@ import lombok.experimental.FieldDefaults; public class Visualizations { ContentStreams.Identifier layer; - Map visualizationsOnPages; + @Builder.Default + Map visualizationsOnPages = new LinkedHashMap<>(); boolean layerVisibilityDefaultValue; } diff --git a/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/service/ViewerDocumentService.java b/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/service/ViewerDocumentService.java index 040b81b..c761c69 100644 --- a/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/service/ViewerDocumentService.java +++ b/layoutparser-service/viewer-doc-processor/src/main/java/com/knecon/fforesight/service/viewerdoc/service/ViewerDocumentService.java @@ -53,12 +53,6 @@ public class ViewerDocumentService { private final ObservationRegistry registry; - public void addVisualizationsOnPage(File originFile, File destinationFile, Visualizations visualizations) { - - addVisualizationsOnPage(originFile, destinationFile, List.of(visualizations)); - } - - @Observed(name = "ViewerDocumentService", contextualName = "add-visualizations") @SneakyThrows public void addVisualizationsOnPage(File originFile, File destinationFile, List visualizations) { @@ -70,9 +64,14 @@ public class ViewerDocumentService { PDDocument pdDocument = openPDDocument(tmpFile.toFile()); - enrichObservation(pdDocument, visualizations.stream().map(Visualizations::getLayer).toList()); + enrichObservation(pdDocument, + visualizations.stream() + .map(Visualizations::getLayer) + .toList()); - Set allLayers = visualizations.stream().map(Visualizations::getLayer).collect(Collectors.toUnmodifiableSet()); + Set allLayers = visualizations.stream() + .map(Visualizations::getLayer) + .collect(Collectors.toUnmodifiableSet()); Map optionalContentGroupMap = addLayersToDocument(visualizations, pdDocument); @@ -186,7 +185,8 @@ public class ViewerDocumentService { contentStream.setFont(font, placedText.fontSize()); contentStream.beginText(); contentStream.setNonStrokingColor(placedText.color()); - if (placedText.renderingMode().isPresent()) { + if (placedText.renderingMode() + .isPresent()) { contentStream.setRenderingMode(placedText.renderingMode().get()); } else { contentStream.setRenderingMode(RenderingMode.FILL); @@ -229,11 +229,11 @@ public class ViewerDocumentService { Matrix textMatrix; if (placedText.textMatrix().isEmpty()) { textMatrix = new Matrix((float) textDeRotationMatrix.getScaleX(), - (float) textDeRotationMatrix.getShearX(), - (float) textDeRotationMatrix.getShearY(), - (float) textDeRotationMatrix.getScaleY(), - (float) placedText.lineStart().getX(), - (float) placedText.lineStart().getY()); + (float) textDeRotationMatrix.getShearX(), + (float) textDeRotationMatrix.getShearY(), + (float) textDeRotationMatrix.getScaleY(), + (float) placedText.lineStart().getX(), + (float) placedText.lineStart().getY()); } else { textMatrix = placedText.textMatrix().get(); }