diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/model/TextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/model/TextBlock.java index 5a510adc..1d6b6fdf 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/model/TextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/model/TextBlock.java @@ -120,7 +120,7 @@ public class TextBlock extends AbstractTextContainer { } else if (getDir().getDegrees() == 180) { - return getPageHeight() - maxY; + return maxY; } @@ -129,7 +129,7 @@ public class TextBlock extends AbstractTextContainer { } else { - return minY; + return getPageHeight() - maxY; } } @@ -144,7 +144,7 @@ public class TextBlock extends AbstractTextContainer { else if (getDir().getDegrees() == 180 ) { - return getPageHeight() - minY; + return minY; } else if (getDir().getDegrees() == 270 ) { @@ -152,7 +152,7 @@ public class TextBlock extends AbstractTextContainer { } else { - return maxY; + return getPageHeight() - minY; } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BlockificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BlockificationService.java index e5948c38..ddca2792 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BlockificationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BlockificationService.java @@ -2,11 +2,13 @@ package com.iqser.red.service.redaction.v1.server.classification.service; import static java.util.stream.Collectors.toSet; +import java.awt.geom.Line2D; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import java.util.List; +import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.springframework.stereotype.Service; import com.iqser.red.service.redaction.v1.model.Point; @@ -31,7 +33,7 @@ public class BlockificationService { public Page blockify(List textPositions, List horizontalRulingLines, - List verticalRulingLines) { + List verticalRulingLines, PDRectangle cropbox) { // sortRotatedSequences(textPositions); @@ -45,19 +47,20 @@ public class BlockificationService { Float splitX1 = null; for (TextPositionSequence word : textPositions) { - boolean lineSeparation = minY - word.getY2() > word.getHeight() * 1.25; - boolean startFromTop = word.getY1() > maxY + word.getHeight(); + boolean lineSeparation = word.getY1() - maxY > word.getHeight() * 1.25; + boolean startFromTop = prev != null && word.getY1() < prev.getY1() - prev.getTextHeight(); boolean splitByX = prev != null && maxX + 50 < word.getX1() && prev.getY1() == word.getY1(); + boolean xIsBeforeFirstX = prev != null && word.getX1() < minX; boolean newLineAfterSplit = prev != null && word.getY1() != prev.getY1() && wasSplitted && splitX1 != word.getX1(); boolean splittedByRuling = - isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), verticalRulingLines) || - isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), horizontalRulingLines) + isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), verticalRulingLines,cropbox.getHeight()) || + isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), horizontalRulingLines,cropbox.getHeight()) - || isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), horizontalRulingLines) - || isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), verticalRulingLines); + || isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), horizontalRulingLines,cropbox.getHeight()) + || isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), verticalRulingLines,cropbox.getHeight()); boolean splitByDir = prev != null && !prev.getDir().equals(word.getDir()); - if (prev != null && (lineSeparation || startFromTop || splitByX || newLineAfterSplit || splittedByRuling || splitByDir)) { + if (prev != null && (lineSeparation || startFromTop || xIsBeforeFirstX || splitByX || splitByDir || startFromTop)) { Orientation prevOrientation = null; if (!chunkBlockList1.isEmpty()) { @@ -218,10 +221,11 @@ public class BlockificationService { private boolean isSplittedByRuling(float previousX2, float previousY1, float currentX1, float currentY1, - List rulingLines) { + List rulingLines, float pageHeight) { for (Ruling ruling : rulingLines) { - if (ruling.intersectsLine(previousX2, previousY1, currentX1, currentY1)) { + var line = new Line2D.Float(pageHeight -ruling.y1 , ruling.x1, pageHeight -ruling.y2, ruling.x2); + if (line.intersectsLine(previousX2, previousY1, currentX1, currentY1)) { return true; } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java index 0f49bad7..473c7c3f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/model/TextPositionSequence.java @@ -185,14 +185,11 @@ public class TextPositionSequence implements CharSequence { - if (getDir().getDegrees() == 270 || getDir().getDegrees() == 90) { + + + return textPositions.get(0).getYDirAdj() - getTextHeight(); - } - - else { - return pageHeight - textPositions.get(0).getYDirAdj(); - } } @@ -202,13 +199,9 @@ public class TextPositionSequence implements CharSequence { - if (getDir().getDegrees() == 270 || getDir().getDegrees() == 90) { - return textPositions.get(0).getYDirAdj(); - } - else { - return pageHeight - textPositions.get(0).getYDirAdj() + getTextHeight(); - } + return textPositions.get(0).getYDirAdj(); + } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java index 4eab0cc4..1790834a 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java @@ -104,13 +104,11 @@ public class PdfSegmentationService { boolean isLandscape = pdr.getWidth() > pdr.getHeight() && (rotation == 0 || rotation == 180) || pdr.getHeight() > pdr.getWidth() && (rotation == 90 || rotation == 270); - CleanRulings cleanRulings = rulingCleaningService.getCleanRulings(pdfTableCells.get(pageNumber), - stripper.getRulings(), - stripper.getMinCharWidth(), - stripper.getMaxCharHeight()); - Page page = blockificationService.blockify(stripper.getTextPositionSequences(), cleanRulings.getHorizontal(), cleanRulings.getVertical()); - PDRectangle cropbox = pdPage.getCropBox(); + CleanRulings cleanRulings = rulingCleaningService.getCleanRulings(pdfTableCells.get(pageNumber), stripper.getRulings(), stripper.getMinCharWidth(), stripper.getMaxCharHeight()); + Page page = blockificationService.blockify(stripper.getTextPositionSequences(), cleanRulings.getHorizontal(), cleanRulings.getVertical(), cropbox); + + float cropboxArea = cropbox.getHeight() * cropbox.getWidth(); page.setCropBoxArea(cropboxArea); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/service/TableExtractionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/service/TableExtractionService.java index fdecc7e8..9fdc2fb6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/service/TableExtractionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/service/TableExtractionService.java @@ -63,7 +63,7 @@ public class TableExtractionService { for (AbstractTextContainer abstractTextContainer : page.getTextBlocks()) { TextBlock textBlock = (TextBlock) abstractTextContainer; for (Cell cell : cells) { - if (cell.intersects(textBlock.getMinX(), textBlock.getMinY(), textBlock.getWidth(), textBlock.getHeight())) { + if (cell.intersects(textBlock.getX1(), textBlock.getY1(), textBlock.getX2() - textBlock.getX1(), textBlock.getY2() - textBlock.getY1())) { cell.addTextBlock(textBlock); toBeRemoved.add(textBlock); break; diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/PdfVisualisationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/PdfVisualisationService.java index f8af77f1..4067ed24 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/PdfVisualisationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/visualization/service/PdfVisualisationService.java @@ -146,7 +146,7 @@ public class PdfVisualisationService { contentStream.setStrokingColor(Color.GREEN); for (TextBlock textBlock : cell.getTextBlocks()) { - contentStream.addRect(textBlock.getMinX(), textBlock.getMinY(), textBlock.getWidth(), textBlock.getHeight()); + contentStream.addRect(textBlock.getX1(), textBlock.getY1(), textBlock.getX2() - textBlock.getX1(), textBlock.getY2() - textBlock.getY1()); contentStream.stroke(); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/agb1.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/agb1.pdf new file mode 100644 index 00000000..f03238f3 Binary files /dev/null and b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/agb1.pdf differ