From 2ae601f08ee2309d97c93c740b44fc28b4c7423b Mon Sep 17 00:00:00 2001 From: deiflaender Date: Fri, 12 May 2023 12:29:13 +0200 Subject: [PATCH] hotfix: Tests for layoutParsing --- .../service/BlockificationService.java | 110 +++++++++------- .../service/BodyTextFrameService.java | 2 +- .../service/ClassificationService.java | 117 +++++++++--------- .../controller/RedactionController.java | 3 + .../server/parsing/PDFAreaTextStripper.java | 82 ------------ .../server/parsing/PDFLinesTextStripper.java | 10 +- .../v1/server/parsing/PDFTextStripper.java | 61 +++++++-- .../parsing/model/TextPositionSequence.java | 4 +- .../segmentation/PdfSegmentationService.java | 39 +++++- .../segmentation/TextBlockComparator.java | 70 +++++++++++ .../service/PdfVisualisationService.java | 34 ++--- .../v1/server/RedactionIntegrationTest.java | 16 ++- .../{Single Table.pdf => Single Table1.pdf} | Bin .../src/test/resources/files/new/S8Plenar.pdf | Bin 0 -> 78787 bytes 14 files changed, 321 insertions(+), 227 deletions(-) delete mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFAreaTextStripper.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/TextBlockComparator.java rename redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/{Single Table.pdf => Single Table1.pdf} (100%) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/S8Plenar.pdf 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 2cff711a..5335afbf 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 @@ -4,8 +4,8 @@ import static java.util.stream.Collectors.toSet; import java.util.ArrayList; import java.util.Comparator; -import java.util.Iterator; import java.util.List; +import java.util.regex.Matcher; import org.springframework.stereotype.Service; @@ -16,6 +16,7 @@ import com.iqser.red.service.redaction.v1.server.classification.model.StringFreq import com.iqser.red.service.redaction.v1.server.classification.model.TextBlock; import com.iqser.red.service.redaction.v1.server.classification.utils.RulingTextDirAdjustUtil; import com.iqser.red.service.redaction.v1.server.parsing.model.TextPositionSequence; +import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; import com.iqser.red.service.redaction.v1.server.tableextraction.model.AbstractTextContainer; import com.iqser.red.service.redaction.v1.server.tableextraction.model.Ruling; @@ -43,19 +44,34 @@ public class BlockificationService { float minX = 1000, maxX = 0, minY = 1000, maxY = 0; TextPositionSequence prev = null; + + var pattern = Patterns.getCompiledPattern("\\b(?:[1-9]|1\\d|20|[ivxlc]+)\\s*(?:[.)])", true); + var pattern2 = Patterns.getCompiledPattern(".*\\d$", true); + var pattern3 = Patterns.getCompiledPattern("^(\\d{1,1}\\.){1,3}\\d{1,2}\\.?\\s[a-z]{1,2}\\/[a-z]{1,2}.*", false); + + + boolean wasSplitted = false; Float splitX1 = null; for (TextPositionSequence word : textPositions) { + Matcher matcher = pattern.matcher(word.toString()); + Matcher matcher2 = pattern2.matcher(word.toString()); + Matcher matcher3 = pattern3.matcher(word.toString()); + boolean lineSeparation = word.getMinYDirAdj() - maxY > word.getHeight() * 1.25; boolean startFromTop = prev != null && word.getMinYDirAdj() < prev.getMinYDirAdj() - prev.getTextHeight(); boolean splitByX = prev != null && maxX + 50 < word.getMinXDirAdj() && prev.getMinYDirAdj() == word.getMinYDirAdj(); - boolean xIsBeforeFirstX = prev != null && word.getMinXDirAdj() < minX; + boolean xIsBeforeFirstX = prev != null && word.getMinXDirAdj() - minX < -5; boolean newLineAfterSplit = prev != null && word.getMinYDirAdj() != prev.getMinYDirAdj() && wasSplitted && splitX1 != word.getMinXDirAdj(); boolean isSplitByRuling = isSplitByRuling(minX, minY, maxX, maxY, word, horizontalRulingLines, verticalRulingLines); boolean splitByDir = prev != null && !prev.getDir().equals(word.getDir()); + boolean splitOnFontDifferent = prev != null && (!word.getFont().equals(prev.getFont()) || !word.getFontStyle().equals(prev.getFontStyle()) || word.getFontSize() !=prev.getFontSize()); + boolean newline = prev != null && Math.abs(word.getMinYDirAdj()- prev.getMinYDirAdj()) > word.getHeight(); + boolean isNumericalIdentifier = matcher.matches(); - if (prev != null && (lineSeparation || startFromTop || splitByX || splitByDir || isSplitByRuling)) { + if (prev != null && (prev.isParagraphStart() || xIsBeforeFirstX || splitByX || lineSeparation || startFromTop || isSplitByRuling || (newline && splitOnFontDifferent) || (isNumericalIdentifier && newline))) { +// if (prev != null && (lineSeparation || startFromTop || splitByX || splitByDir || isSplitByRuling)) { Orientation prevOrientation = null; if (!chunkBlockList1.isEmpty()) { @@ -107,51 +123,51 @@ public class BlockificationService { chunkBlockList1.add(cb1); } - Iterator itty = chunkBlockList1.iterator(); +// Iterator itty = chunkBlockList1.iterator(); - TextBlock previousLeft = null; - TextBlock previousRight = null; - while (itty.hasNext()) { - TextBlock block = (TextBlock) itty.next(); - - if (previousLeft != null && block.getOrientation().equals(Orientation.LEFT)) { - if (previousLeft.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousLeft.getMinY()) { - previousLeft.add(block); - itty.remove(); - continue; - } - } - - if (previousRight != null && block.getOrientation().equals(Orientation.RIGHT)) { - if (previousRight.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousRight.getMinY()) { - previousRight.add(block); - itty.remove(); - continue; - } - } - - if (block.getOrientation().equals(Orientation.LEFT)) { - previousLeft = block; - } else if (block.getOrientation().equals(Orientation.RIGHT)) { - previousRight = block; - } - } - - itty = chunkBlockList1.iterator(); - TextBlock previous = null; - while (itty.hasNext()) { - TextBlock block = (TextBlock) itty.next(); - - if (previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation().equals(Orientation.LEFT) && equalsWithThreshold(block.getMaxY(), - previous.getMaxY()) || previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation() - .equals(Orientation.RIGHT) && equalsWithThreshold(block.getMaxY(), previous.getMaxY())) { - previous.add(block); - itty.remove(); - continue; - } - - previous = block; - } +// TextBlock previousLeft = null; +// TextBlock previousRight = null; +// while (itty.hasNext()) { +// TextBlock block = (TextBlock) itty.next(); +// +// if (previousLeft != null && block.getOrientation().equals(Orientation.LEFT)) { +// if (previousLeft.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousLeft.getMinY()) { +// previousLeft.add(block); +// itty.remove(); +// continue; +// } +// } +// +// if (previousRight != null && block.getOrientation().equals(Orientation.RIGHT)) { +// if (previousRight.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousRight.getMinY()) { +// previousRight.add(block); +// itty.remove(); +// continue; +// } +// } +// +// if (block.getOrientation().equals(Orientation.LEFT)) { +// previousLeft = block; +// } else if (block.getOrientation().equals(Orientation.RIGHT)) { +// previousRight = block; +// } +// } +// +// itty = chunkBlockList1.iterator(); +// TextBlock previous = null; +// while (itty.hasNext()) { +// TextBlock block = (TextBlock) itty.next(); +// +// if (previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation().equals(Orientation.LEFT) && equalsWithThreshold(block.getMaxY(), +// previous.getMaxY()) || previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation() +// .equals(Orientation.RIGHT) && equalsWithThreshold(block.getMaxY(), previous.getMaxY())) { +// previous.add(block); +// itty.remove(); +// continue; +// } +// +// previous = block; +// } return new Page(chunkBlockList1); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BodyTextFrameService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BodyTextFrameService.java index 1dc54ae2..809e9120 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BodyTextFrameService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/BodyTextFrameService.java @@ -84,7 +84,7 @@ public class BodyTextFrameService { } float approxLineCount = PositionUtils.getApproxLineCount(textBlock); - if (approxLineCount < 3.3f) { + if (approxLineCount < 2.9f) { continue; } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/ClassificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/ClassificationService.java index a7773af8..1d310b22 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/ClassificationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/classification/service/ClassificationService.java @@ -52,64 +52,67 @@ public class ClassificationService { var bodyTextFrame = page.getBodyTextFrame(); - if (document.getFontSizeCounter().getMostPopular() == null) { - textBlock.setClassification("Other"); - return; - } - if (PositionUtils.isOverBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) ) { - textBlock.setClassification("Header"); + textBlock.setClassification("TextBlock"); +// return; - } else if (PositionUtils.isUnderBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification("Footer"); - } else if (page.getPageNumber() == 1 && (PositionUtils.getHeightDifferenceBetweenChunkWordAndDocumentWord(textBlock, - document.getTextHeightCounter().getMostPopular()) > 2.5 && textBlock.getHighestFontSize() > document.getFontSizeCounter().getMostPopular() || page.getTextBlocks() - .size() == 1)) { - if (!Pattern.matches("[0-9]+", textBlock.toString())) { - textBlock.setClassification("Title"); - } - } else if (textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter() - .getMostPopular() && PositionUtils.getApproxLineCount(textBlock) < 4.9 && (textBlock.getMostPopularWordStyle().equals("bold") || !document.getFontStyleCounter() - .getCountPerValue() - .containsKey("bold") && textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter().getMostPopular() + 1) && textBlock.getSequences() - .get(0) - .getTextPositions() - .get(0) - .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { - - for (int i = 1; i <= headlineFontSizes.size(); i++) { - if (textBlock.getMostPopularWordFontSize() == headlineFontSizes.get(i - 1)) { - textBlock.setClassification("H " + i); - document.setHeadlines(true); - } - } - } else if (!textBlock.getText().startsWith("Table ") && !textBlock.getText().startsWith("Figure ") && PositionUtils.isWithinBodyTextFrame(bodyTextFrame, - textBlock) && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter() - .getMostPopular() - .equals("bold") && PositionUtils.getApproxLineCount(textBlock) < 2.9 && textBlock.getSequences() - .get(0) - .getTextPositions() - .get(0) - .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { - textBlock.setClassification("H " + (headlineFontSizes.size() + 1)); - document.setHeadlines(true); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold")) { - textBlock.setClassification("TextBlock Bold"); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFont() - .equals(document.getFontCounter().getMostPopular()) && textBlock.getMostPopularWordStyle() - .equals(document.getFontStyleCounter().getMostPopular()) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter().getMostPopular()) { - textBlock.setClassification("TextBlock"); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("italic") && !document.getFontStyleCounter() - .getMostPopular() - .equals("italic") && PositionUtils.getApproxLineCount(textBlock) < 2.9) { - textBlock.setClassification("TextBlock Italic"); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock)) { - textBlock.setClassification("TextBlock Unknown"); - } else { - textBlock.setClassification("Other"); - } +// if (document.getFontSizeCounter().getMostPopular() == null) { +// textBlock.setClassification("Other"); +// return; +// } +// if (PositionUtils.isOverBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) ) { +// textBlock.setClassification("Header"); +// +// } else if (PositionUtils.isUnderBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() +// .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { +// textBlock.setClassification("Footer"); +// } else if (page.getPageNumber() == 1 && (PositionUtils.getHeightDifferenceBetweenChunkWordAndDocumentWord(textBlock, +// document.getTextHeightCounter().getMostPopular()) > 2.5 && textBlock.getHighestFontSize() > document.getFontSizeCounter().getMostPopular() || page.getTextBlocks() +// .size() == 1)) { +// if (!Pattern.matches("[0-9]+", textBlock.toString())) { +// textBlock.setClassification("Title"); +// } +// } else if (textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter() +// .getMostPopular() && PositionUtils.getApproxLineCount(textBlock) < 4.9 && (textBlock.getMostPopularWordStyle().equals("bold") || !document.getFontStyleCounter() +// .getCountPerValue() +// .containsKey("bold") && textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter().getMostPopular() + 1) && textBlock.getSequences() +// .get(0) +// .getTextPositions() +// .get(0) +// .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { +// +// for (int i = 1; i <= headlineFontSizes.size(); i++) { +// if (textBlock.getMostPopularWordFontSize() == headlineFontSizes.get(i - 1)) { +// textBlock.setClassification("H " + i); +// document.setHeadlines(true); +// } +// } +// } else if (!textBlock.getText().startsWith("Table ") && !textBlock.getText().startsWith("Figure ") && PositionUtils.isWithinBodyTextFrame(bodyTextFrame, +// textBlock) && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter() +// .getMostPopular() +// .equals("bold") && PositionUtils.getApproxLineCount(textBlock) < 2.9 && textBlock.getSequences() +// .get(0) +// .getTextPositions() +// .get(0) +// .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { +// textBlock.setClassification("H " + (headlineFontSizes.size() + 1)); +// document.setHeadlines(true); +// } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() +// .getMostPopular() && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold")) { +// textBlock.setClassification("TextBlock Bold"); +// } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFont() +// .equals(document.getFontCounter().getMostPopular()) && textBlock.getMostPopularWordStyle() +// .equals(document.getFontStyleCounter().getMostPopular()) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter().getMostPopular()) { +// textBlock.setClassification("TextBlock"); +// } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() +// .getMostPopular() && textBlock.getMostPopularWordStyle().equals("italic") && !document.getFontStyleCounter() +// .getMostPopular() +// .equals("italic") && PositionUtils.getApproxLineCount(textBlock) < 2.9) { +// textBlock.setClassification("TextBlock Italic"); +// } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock)) { +// textBlock.setClassification("TextBlock Unknown"); +// } else { +// textBlock.setClassification("Other"); +// } } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java index 0aa07bd9..11818176 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/controller/RedactionController.java @@ -91,6 +91,9 @@ public class RedactionController implements RedactionResource { } else { var table = (Table) t; + if(table == null){ + continue; + } for (var row: table.getRows()){ diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFAreaTextStripper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFAreaTextStripper.java deleted file mode 100644 index dd61063e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFAreaTextStripper.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.parsing; - -import com.iqser.red.service.redaction.v1.server.parsing.model.TextPositionSequence; - -import lombok.Getter; -import lombok.Setter; - -import org.apache.pdfbox.text.PDFTextStripperByArea; -import org.apache.pdfbox.text.TextPosition; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class PDFAreaTextStripper extends PDFTextStripperByArea { - - @Getter - private List textPositionSequences = new ArrayList<>(); - - @Setter - private int pageNumber; - - - public PDFAreaTextStripper() throws IOException { - - } - - - @Override - public void writeString(String text, List textPositions) throws IOException { - - int startIndex = 0; - for (int i = 0; i <= textPositions.size() - 1; i++) { - - if (i == 0 && (textPositions.get(i).getUnicode().equals(" ") || textPositions.get(i).getUnicode().equals("\u00A0"))) { - startIndex++; - continue; - } - - // Strange but sometimes this is happening, for example: Metolachlor2.pdf - if (i > 0 && textPositions.get(i).getX() < textPositions.get(i - 1).getX()) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - startIndex = i; - } - - if (textPositions.get(i).getRotation() == 0 && i > 0 && textPositions.get(i).getX() > textPositions.get(i - 1).getEndX() + 1) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - startIndex = i; - } - - if (i > 0 && (textPositions.get(i).getUnicode().equals(" ") || textPositions.get(i).getUnicode().equals("\u00A0")) && i <= textPositions.size() - 2) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - startIndex = i + 1; - } - } - - List sublist = textPositions.subList(startIndex, textPositions.size()); - if (!sublist.isEmpty() && (sublist.get(sublist.size() - 1).getUnicode().equals(" ") || sublist.get(sublist.size() - 1).getUnicode().equals("\u00A0"))) { - sublist = sublist.subList(0, sublist.size() - 1); - } - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - super.writeString(text); - } - - - public void clearPositions() { - - textPositionSequences = new ArrayList<>(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFLinesTextStripper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFLinesTextStripper.java index 3f0f32e1..c2d85d9b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFLinesTextStripper.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFLinesTextStripper.java @@ -195,7 +195,7 @@ public class PDFLinesTextStripper extends PDFTextStripper { @Override - public void writeString(String text, List textPositions) throws IOException { + public void writeString(String text, List textPositions, boolean isParagraphStart) throws IOException { int startIndex = 0; RedTextPosition previous = null; @@ -235,7 +235,7 @@ public class PDFLinesTextStripper extends PDFTextStripper { if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) .getUnicode() .equals("\t")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); + textPositionSequences.add(new TextPositionSequence(sublist, pageNumber, i == textPositions.size() -1 && isParagraphStart)); } startIndex = i; } @@ -245,7 +245,7 @@ public class PDFLinesTextStripper extends PDFTextStripper { if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) .getUnicode() .equals("\t")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); + textPositionSequences.add(new TextPositionSequence(sublist, pageNumber, i == textPositions.size() -1 && isParagraphStart)); } startIndex = i; } @@ -265,7 +265,7 @@ public class PDFLinesTextStripper extends PDFTextStripper { textPositionSequences.get(textPositionSequences.size() - 1).add(t); } } else { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); + textPositionSequences.add(new TextPositionSequence(sublist, pageNumber, i == textPositions.size() -1 && isParagraphStart)); } } startIndex = i + 1; @@ -288,7 +288,7 @@ public class PDFLinesTextStripper extends PDFTextStripper { textPositionSequences.get(textPositionSequences.size() - 1).add(t); } } else { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); + textPositionSequences.add(new TextPositionSequence(sublist, pageNumber, isParagraphStart)); } } super.writeString(text); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFTextStripper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFTextStripper.java index a0eeaaa2..c85b1b32 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFTextStripper.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/parsing/PDFTextStripper.java @@ -27,6 +27,7 @@ import java.text.Bidi; import java.text.Normalizer; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; @@ -240,10 +241,10 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { document = doc; output = outputStream; if (getAddMoreFormatting()) { - paragraphEnd = lineSeparator; + paragraphEnd = "\n----ParagraphEnd----\n\n"; pageStart = lineSeparator; - articleStart = lineSeparator; - articleEnd = lineSeparator; + articleStart = "\n----ArticelStart----\n\n"; + articleEnd = "\n----ArticelEnd----\n\n"; } startDocument(document); processPages(document.getPages()); @@ -594,9 +595,14 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { // but this caused a lot of regression test failures. So, I'm leaving it be for // now if (!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine)) { - writeLine(normalize(line)); - line.clear(); + var normalized = normalize(line); +// normalized.stream().filter(l -> System.out.println(l.getText().contains("Plenarprotokoll 20/24")).findFirst().isPresent() + + lastLineStartPosition = handleLineSeparation(current, lastPosition, lastLineStartPosition, maxHeightForLine); + writeLine(normalized, current.isParagraphStart); + line.clear(); + expectedStartOfNextWordX = EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE; maxYForLine = MAX_Y_FOR_LINE_RESET_VALUE; maxHeightForLine = MAX_HEIGHT_FOR_LINE_RESET_VALUE; @@ -630,7 +636,24 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { if (startOfPage && lastPosition == null) { writeParagraphStart();// not sure this is correct for RTL? } + line.add(new LineItem(position)); + +// Collections.sort(line, new Comparator() { +// +// @Override +// public int compare(LineItem str1, LineItem str2) { +// if(null == str1.getTextPosition()) { +// return 0; +// } +// else if(null == str2.getTextPosition()) { +// return 0; +// } +// return Float.compare(str1.getTextPosition().getX(), str2.getTextPosition().getX()); +// } +// }); + +// line.sort(Comparator.comparing(a -> a.getTextPosition() != null && a.getTextPosition().getX())); } maxHeightForLine = Math.max(maxHeightForLine, positionHeight); minYTopForLine = Math.min(minYTopForLine, positionY - positionHeight); @@ -646,7 +669,7 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { } // print the final line if (line.size() > 0) { - writeLine(normalize(line)); + writeLine(normalize(line), false); writeParagraphEnd(); } endArticle(); @@ -703,7 +726,7 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { * @param textPositions The TextPositions belonging to the text. * @throws IOException If there is an error when writing the text. */ - protected void writeString(String text, List textPositions) throws IOException { + protected void writeString(String text, List textPositions, boolean isParagraphEnd) throws IOException { writeString(text); } @@ -1385,6 +1408,7 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { } else { writeLineSeparator(); writeParagraphSeparator(); + lastLineStartPosition.setEndParagraphWritten(); } } else { writeLineSeparator(); @@ -1428,7 +1452,11 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { float newXVal = multiplyFloat(getIndentThreshold(), position.getTextPosition().getWidthOfSpace()); float positionWidth = multiplyFloat(0.25f, position.getTextPosition().getWidth()); - if (yGap > newYVal) { +// if(xGap < 0){ +// result = true; +// } +// else + if (yGap > newYVal) { result = true; } else if (xGap > newXVal) { // text is indented, but try to screen for hanging indent @@ -1636,12 +1664,13 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { * @param line a list with the words of the given line * @throws IOException if something went wrong */ - private void writeLine(List line) throws IOException { + private void writeLine(List line, boolean isParagraphEnd) throws IOException { int numberOfStrings = line.size(); for (int i = 0; i < numberOfStrings; i++) { WordWithTextPositions word = line.get(i); - writeString(word.getText(), word.getTextPositions()); + word.getTextPositions().sort(Comparator.comparing(TextPosition::getX)); + writeString(word.getText(), word.getTextPositions(), isParagraphEnd && i == numberOfStrings - 1); if (i < numberOfStrings - 1) { writeWordSeparator(); } @@ -1963,6 +1992,8 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { private boolean isHangingIndent = false; private boolean isArticleStart = false; + private boolean endParagraphWritten = false; + private TextPosition position = null; @@ -2024,6 +2055,16 @@ public class PDFTextStripper extends LegacyPDFStreamEngine { } + public boolean isEndParagraphWritten() { + + return endParagraphWritten; + } + + public void setEndParagraphWritten(){ + endParagraphWritten = true; + } + + /** * Sets the isArticleStart() flag to 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 0ea72b66..318ac7d8 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 @@ -39,6 +39,7 @@ public class TextPositionSequence implements CharSequence { private int rotation; private float pageHeight; private float pageWidth; + private boolean isParagraphStart; public TextPositionSequence(int page) { @@ -47,7 +48,7 @@ public class TextPositionSequence implements CharSequence { } - public TextPositionSequence(List textPositions, int page) { + public TextPositionSequence(List textPositions, int page, boolean isParagraphStart) { this.textPositions = textPositions.stream().map(RedTextPosition::fromTextPosition).collect(Collectors.toList()); this.page = page; @@ -55,6 +56,7 @@ public class TextPositionSequence implements CharSequence { this.rotation = textPositions.get(0).getRotation(); this.pageHeight = textPositions.get(0).getPageHeight(); this.pageWidth = textPositions.get(0).getPageWidth(); + this.isParagraphStart = isParagraphStart; } 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 e96a637d..cf30afed 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 @@ -10,6 +10,7 @@ import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -20,6 +21,7 @@ import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.util.QuickSort; import org.springframework.stereotype.Service; import com.iqser.red.service.redaction.v1.server.classification.model.Document; @@ -96,7 +98,18 @@ public class PdfSegmentationService { stripper.setStartPage(pageNumber); stripper.setEndPage(pageNumber); stripper.setPdpage(pdPage); - stripper.getText(pdDocument); + stripper.setAddMoreFormatting(true); + stripper.setShouldSeparateByBeads(true); +// stripper.setDropThreshold(0.1f); + var text = stripper.getText(pdDocument); + + System.out.println(text); +// stripper.getTextPositionSequences().forEach(a -> { +// System.out.println(a); +// if(a.isParagraphEnd()){ +// System.out.println("------------------------"); +// } +// }); PDRectangle pdr = pdPage.getMediaBox(); @@ -110,13 +123,35 @@ public class PdfSegmentationService { stripper.getMaxCharHeight()); Page page = blockificationService.blockify(stripper.getTextPositionSequences(), cleanRulings.getHorizontal(), cleanRulings.getVertical()); + +// QuickSort.sort(page.getTextBlocks(), new TextBlockComparator()); +// +// List combined = new ArrayList<>(); +// Iterator itty = page.getTextBlocks().iterator(); +// TextBlock prev = null; +// while (itty.hasNext()){ +// TextBlock current = (TextBlock) itty.next(); +// +// if(prev != null && (((Math.abs(prev.getMaxX() - current.getMaxX()) < 1)|| Math.abs(prev.getMinX() - current.getMinX()) < 1) && current.getMaxY() > prev.getMaxY() && current.getMinY() - prev.getMaxY() < 3)){ +// combined.remove(prev); +// current = prev.union(current); +// } +// +// combined.add(current); +// +// prev= current; +// } +// +// page.setTextBlocks(combined); + + page.setRotation(rotation); page.setLandscape(isLandscape); page.setPageNumber(pageNumber); page.setPageWidth(cropbox.getWidth()); page.setPageHeight(cropbox.getHeight()); - tableExtractionService.extractTables(cleanRulings, page); +// tableExtractionService.extractTables(cleanRulings, page); buildPageStatistics(page); increaseDocumentStatistics(page, document); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/TextBlockComparator.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/TextBlockComparator.java new file mode 100644 index 00000000..99b820ce --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/TextBlockComparator.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.iqser.red.service.redaction.v1.server.segmentation; + +import java.util.Comparator; + +import org.apache.pdfbox.text.TextPosition; + +import com.iqser.red.service.redaction.v1.server.classification.model.TextBlock; +import com.iqser.red.service.redaction.v1.server.tableextraction.model.AbstractTextContainer; + +/** + * This class is a comparator for TextPosition operators. It handles + * pages with text in different directions by grouping the text based + * on direction and sorting in that direction. This allows continuous text + * in a given direction to be more easily grouped together. + * + * @author Ben Litchfield + */ +public class TextBlockComparator implements Comparator +{ + @Override + public int compare(AbstractTextContainer pos1, AbstractTextContainer pos2) + { + + + // get the text direction adjusted coordinates + float x1 = pos1.getMinX(); + float x2 = pos2.getMinX(); + + float pos1YBottom = pos1.getMaxY(); + float pos2YBottom = pos2.getMaxY(); + + // note that the coordinates have been adjusted so 0,0 is in upper left + float pos1YTop = pos1YBottom - pos1.getHeight(); + float pos2YTop = pos2YBottom - pos2.getHeight(); + + float yDifference = Math.abs(pos1YBottom - pos2YBottom); + + // we will do a simple tolerance comparison + if (yDifference < .1 || + pos2YBottom >= pos1YTop && pos2YBottom <= pos1YBottom || + pos1YBottom >= pos2YTop && pos1YBottom <= pos2YBottom) + { + return Float.compare(x1, x2); + } + else if (pos1YBottom < pos2YBottom) + { + return -1; + } + else + { + return 1; + } + } +} 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 a51ea73a..ad6994f4 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 @@ -82,14 +82,14 @@ public class PdfVisualisationService { } } - contentStream.setStrokingColor(Color.YELLOW); - contentStream.addRect(analyzedPage.getBodyTextFrame().getTopLeft().getX(), - analyzedPage.getBodyTextFrame().getTopLeft().getY(), - analyzedPage.getBodyTextFrame().getWidth(), - analyzedPage.getBodyTextFrame().getHeight()); - - contentStream.stroke(); - +// contentStream.setStrokingColor(Color.YELLOW); +// contentStream.addRect(analyzedPage.getBodyTextFrame().getTopLeft().getX(), +// analyzedPage.getBodyTextFrame().getTopLeft().getY(), +// analyzedPage.getBodyTextFrame().getWidth(), +// analyzedPage.getBodyTextFrame().getHeight()); +// +// contentStream.stroke(); +// contentStream.close(); } } @@ -103,15 +103,15 @@ public class PdfVisualisationService { contentStream.stroke(); if (textBlock.getClassification() != null) { - contentStream.beginText(); - - contentStream.setNonStrokingColor(Color.BLUE); - contentStream.setFont(PDType1Font.TIMES_ROMAN, 9f); - - contentStream.newLineAtOffset(textBlock.getPdfMinX(), textBlock.getPdfMaxY() + 2); - contentStream.showText(textBlock.getClassification() + textBlock.getOrientation() + "-->" + textBlock.getSequences().get(0).getDir()); - - contentStream.endText(); +// contentStream.beginText(); +// +// contentStream.setNonStrokingColor(Color.BLUE); +// contentStream.setFont(PDType1Font.TIMES_ROMAN, 9f); +// +// contentStream.newLineAtOffset(textBlock.getPdfMinX(), textBlock.getPdfMaxY() + 2); +// contentStream.showText(textBlock.getClassification() + textBlock.getOrientation() + "-->" + textBlock.getSequences().get(0).getDir()); +// +// contentStream.endText(); if (DRAW_POSITIONS) { drawPositions(contentStream, textBlock); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java index f968a634..0d75b7b7 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java @@ -1117,8 +1117,8 @@ public class RedactionIntegrationTest { System.out.println("classificationTest"); - String sourcePath ="/tmp"; - String targetPath = "/tmp/result"; + String sourcePath ="/tmp/Input"; + String targetPath = "/tmp/Output"; var files = getFileNames(new HashSet<>(), FileSystems.getDefault().getPath(sourcePath), sourcePath); @@ -1179,7 +1179,7 @@ public class RedactionIntegrationTest { System.out.println("classificationTest"); String tableServiceResponseFile = "files/cv_table_response_VV-511309.json"; - AnalyzeRequest request = prepareStorage("files/new/VV-511309_OCR.pdf", tableServiceResponseFile); + AnalyzeRequest request = prepareStorage("/Users/deiflaender/git/RED/redaction-service/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/Plenarprotokoll 1 (keine Druchsache!) (1).pdf"); RedactionRequest redactionRequest = RedactionRequest.builder() .dossierId(request.getDossierId()) @@ -1220,7 +1220,7 @@ public class RedactionIntegrationTest { public void htmlTablesTest() throws IOException { System.out.println("htmlTablesTest"); - AnalyzeRequest request = prepareStorage("files/Minimal Examples/Single Table.pdf"); + AnalyzeRequest request = prepareStorage("/Users/deiflaender/git/RED/redaction-service/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table1.pdf"); RedactionRequest redactionRequest = RedactionRequest.builder() .dossierId(request.getDossierId()) @@ -1241,7 +1241,7 @@ public class RedactionIntegrationTest { System.out.println("htmlTableRotationTest"); - AnalyzeRequest request = prepareStorage("files/Metolachlor/S-Metolachlor_RAR_02_Volume_2_2018-09-06.pdf"); + AnalyzeRequest request = prepareStorage("/Users/deiflaender/git/RED/redaction-service/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/Plenarprotokoll 1 (keine Druchsache!) (1).pdf"); RedactionRequest redactionRequest = RedactionRequest.builder() .dossierId(request.getDossierId()) @@ -1254,6 +1254,12 @@ public class RedactionIntegrationTest { try (FileOutputStream fileOutputStream = new FileOutputStream(OsUtils.getTemporaryDirectory() + "/Tables.html")) { fileOutputStream.write(result.getDocument()); } + + + + + + } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table1.pdf similarity index 100% rename from redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table.pdf rename to redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table1.pdf diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/S8Plenar.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/new/S8Plenar.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4835b1e570dbec209079a553add0f9b6f7b6f870 GIT binary patch literal 78787 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

O=ntc4-AR&U9)1uy_L`2PO?o^-| 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 z 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 literal 0 HcmV?d00001