RED-5381: First steps to run all operations in java coord system

This commit is contained in:
deiflaender 2022-10-14 16:45:41 +02:00
parent 248e4100c0
commit 15c131d6c4
7 changed files with 29 additions and 34 deletions

View File

@ -120,7 +120,7 @@ public class TextBlock extends AbstractTextContainer {
} }
else if (getDir().getDegrees() == 180) { else if (getDir().getDegrees() == 180) {
return getPageHeight() - maxY; return maxY;
} }
@ -129,7 +129,7 @@ public class TextBlock extends AbstractTextContainer {
} }
else { else {
return minY; return getPageHeight() - maxY;
} }
} }
@ -144,7 +144,7 @@ public class TextBlock extends AbstractTextContainer {
else if (getDir().getDegrees() == 180 ) { else if (getDir().getDegrees() == 180 ) {
return getPageHeight() - minY; return minY;
} }
else if (getDir().getDegrees() == 270 ) { else if (getDir().getDegrees() == 270 ) {
@ -152,7 +152,7 @@ public class TextBlock extends AbstractTextContainer {
} }
else { else {
return maxY; return getPageHeight() - minY;
} }
} }

View File

@ -2,11 +2,13 @@ package com.iqser.red.service.redaction.v1.server.classification.service;
import static java.util.stream.Collectors.toSet; import static java.util.stream.Collectors.toSet;
import java.awt.geom.Line2D;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.iqser.red.service.redaction.v1.model.Point; import com.iqser.red.service.redaction.v1.model.Point;
@ -31,7 +33,7 @@ public class BlockificationService {
public Page blockify(List<TextPositionSequence> textPositions, List<Ruling> horizontalRulingLines, public Page blockify(List<TextPositionSequence> textPositions, List<Ruling> horizontalRulingLines,
List<Ruling> verticalRulingLines) { List<Ruling> verticalRulingLines, PDRectangle cropbox) {
// sortRotatedSequences(textPositions); // sortRotatedSequences(textPositions);
@ -45,19 +47,20 @@ public class BlockificationService {
Float splitX1 = null; Float splitX1 = null;
for (TextPositionSequence word : textPositions) { for (TextPositionSequence word : textPositions) {
boolean lineSeparation = minY - word.getY2() > word.getHeight() * 1.25; boolean lineSeparation = word.getY1() - maxY > word.getHeight() * 1.25;
boolean startFromTop = word.getY1() > maxY + word.getHeight(); boolean startFromTop = prev != null && word.getY1() < prev.getY1() - prev.getTextHeight();
boolean splitByX = prev != null && maxX + 50 < word.getX1() && prev.getY1() == word.getY1(); 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 newLineAfterSplit = prev != null && word.getY1() != prev.getY1() && wasSplitted && splitX1 != word.getX1();
boolean splittedByRuling = boolean splittedByRuling =
isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), verticalRulingLines) || isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), verticalRulingLines,cropbox.getHeight()) ||
isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), horizontalRulingLines) isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), horizontalRulingLines,cropbox.getHeight())
|| isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), horizontalRulingLines) || isSplittedByRuling(maxX, minY, word.getX1(), word.getY1(), horizontalRulingLines,cropbox.getHeight())
|| isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), verticalRulingLines); || isSplittedByRuling(minX, minY, word.getX1(), word.getY2(), verticalRulingLines,cropbox.getHeight());
boolean splitByDir = prev != null && !prev.getDir().equals(word.getDir()); 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; Orientation prevOrientation = null;
if (!chunkBlockList1.isEmpty()) { if (!chunkBlockList1.isEmpty()) {
@ -218,10 +221,11 @@ public class BlockificationService {
private boolean isSplittedByRuling(float previousX2, float previousY1, float currentX1, float currentY1, private boolean isSplittedByRuling(float previousX2, float previousY1, float currentX1, float currentY1,
List<Ruling> rulingLines) { List<Ruling> rulingLines, float pageHeight) {
for (Ruling ruling : rulingLines) { 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; return true;
} }
} }

View File

@ -185,14 +185,11 @@ public class TextPositionSequence implements CharSequence {
if (getDir().getDegrees() == 270 || getDir().getDegrees() == 90) {
return textPositions.get(0).getYDirAdj() - getTextHeight(); 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 textPositions.get(0).getYDirAdj();
return pageHeight - textPositions.get(0).getYDirAdj() + getTextHeight();
}
} }

View File

@ -104,13 +104,11 @@ public class PdfSegmentationService {
boolean isLandscape = pdr.getWidth() > pdr.getHeight() && (rotation == 0 || rotation == 180) || boolean isLandscape = pdr.getWidth() > pdr.getHeight() && (rotation == 0 || rotation == 180) ||
pdr.getHeight() > pdr.getWidth() && (rotation == 90 || rotation == 270); 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(); 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(); float cropboxArea = cropbox.getHeight() * cropbox.getWidth();
page.setCropBoxArea(cropboxArea); page.setCropBoxArea(cropboxArea);

View File

@ -63,7 +63,7 @@ public class TableExtractionService {
for (AbstractTextContainer abstractTextContainer : page.getTextBlocks()) { for (AbstractTextContainer abstractTextContainer : page.getTextBlocks()) {
TextBlock textBlock = (TextBlock) abstractTextContainer; TextBlock textBlock = (TextBlock) abstractTextContainer;
for (Cell cell : cells) { 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); cell.addTextBlock(textBlock);
toBeRemoved.add(textBlock); toBeRemoved.add(textBlock);
break; break;

View File

@ -146,7 +146,7 @@ public class PdfVisualisationService {
contentStream.setStrokingColor(Color.GREEN); contentStream.setStrokingColor(Color.GREEN);
for (TextBlock textBlock : cell.getTextBlocks()) { 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(); contentStream.stroke();
} }
} }