RED-3974: Refactored processTablePerRow
This commit is contained in:
parent
f84a366328
commit
cba81ce061
@ -27,11 +27,15 @@ public class SectionText {
|
|||||||
private boolean isTable;
|
private boolean isTable;
|
||||||
private String headline;
|
private String headline;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
private List<SectionArea> sectionAreas = new ArrayList<>();
|
private List<SectionArea> sectionAreas = new ArrayList<>();
|
||||||
|
@Builder.Default
|
||||||
private Set<Image> images = new HashSet<>();
|
private Set<Image> images = new HashSet<>();
|
||||||
|
@Builder.Default
|
||||||
private List<TextBlock> textBlocks = new ArrayList<>();
|
private List<TextBlock> textBlocks = new ArrayList<>();
|
||||||
|
@Builder.Default
|
||||||
private Map<String, CellValue> tabularData = new HashMap<>();
|
private Map<String, CellValue> tabularData = new HashMap<>();
|
||||||
|
@Builder.Default
|
||||||
private List<Integer> cellStarts = new ArrayList<>();
|
private List<Integer> cellStarts = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -194,7 +194,7 @@ public class SearchableText {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String buildString(List<TextPositionSequence> sequences) {
|
public static String buildString(List<TextPositionSequence> sequences) {
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
|||||||
@ -77,65 +77,48 @@ public class SectionTextBuilderService {
|
|||||||
private List<SectionText> processTablePerRow(Table table, AtomicInteger sectionNumber) {
|
private List<SectionText> processTablePerRow(Table table, AtomicInteger sectionNumber) {
|
||||||
|
|
||||||
List<SectionText> sectionTexts = new ArrayList<>();
|
List<SectionText> sectionTexts = new ArrayList<>();
|
||||||
|
boolean hasHeader = hasTableHeader(table);
|
||||||
|
|
||||||
boolean hasHeader = table.getRows()
|
for (List<Cell> row : table.getRows()) {
|
||||||
.stream()
|
|
||||||
.anyMatch(row -> row.stream()
|
|
||||||
.anyMatch(cell -> !cell.isHeaderCell() && !cell.getHeaderCells().isEmpty()));
|
|
||||||
|
|
||||||
for (int rowNum = 0; rowNum < table.getRows().size(); rowNum++) {
|
List<TextBlock> textBlocks = new ArrayList<>();
|
||||||
SearchableText searchableRow = new SearchableText();
|
List<SectionArea> areas = new ArrayList<>();
|
||||||
Map<String, CellValue> tabularData = new HashMap<>();
|
Map<String, CellValue> tabularData = new HashMap<>();
|
||||||
int start = 0;
|
List<Integer> startOffsets = new ArrayList<>();
|
||||||
List<Integer> cellStarts = new ArrayList<>();
|
|
||||||
SectionText sectionText = new SectionText();
|
|
||||||
for (int cellNum = 0; cellNum < table.getRows().get(rowNum).size(); cellNum++) {
|
|
||||||
Cell cell = table.getRows().get(rowNum).get(cellNum);
|
|
||||||
|
|
||||||
|
int startOffset = 0;
|
||||||
|
for (int cellNum = 0; cellNum < row.size(); cellNum++) {
|
||||||
|
|
||||||
|
Cell cell = row.get(cellNum);
|
||||||
if (CollectionUtils.isEmpty(cell.getTextBlocks())) {
|
if (CollectionUtils.isEmpty(cell.getTextBlocks())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionArea sectionArea = new SectionArea(new Point((float) cell.getX(), (float) cell.getY()), (float) cell.getWidth(), (float) cell.getHeight(), cell.getTextBlocks()
|
SectionArea sectionArea = getSectionArea(cell);
|
||||||
.get(0)
|
areas.add(sectionArea);
|
||||||
.getSequences()
|
|
||||||
.get(0)
|
|
||||||
.getPage(), null);
|
|
||||||
sectionText.getSectionAreas().add(sectionArea);
|
|
||||||
sectionText.getTextBlocks().addAll(cell.getTextBlocks());
|
|
||||||
|
|
||||||
int cellStart = start;
|
|
||||||
|
|
||||||
if (!cell.isHeaderCell()) {
|
if (!cell.isHeaderCell()) {
|
||||||
if (hasHeader) {
|
String headerName = getHeaderName(hasHeader, cell, table.getRows().get(0).get(cellNum));
|
||||||
cell.getHeaderCells().forEach(headerCell -> {
|
sectionArea.setHeader(headerName);
|
||||||
String headerName = buildHeaderName(headerCell);
|
tabularData.put(headerName, new CellValue(cell.getTextBlocks(), startOffset));
|
||||||
sectionArea.setHeader(headerName);
|
|
||||||
tabularData.put(headerName, new CellValue(cell.getTextBlocks(), cellStart));
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
String headerName = buildHeaderName(table.getRows().get(0).get(cellNum));
|
|
||||||
sectionArea.setHeader(headerName);
|
|
||||||
tabularData.put(headerName, new CellValue(cell.getTextBlocks(), cellStart));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (TextBlock textBlock : cell.getTextBlocks()) {
|
textBlocks.addAll(cell.getTextBlocks());
|
||||||
// TODO avoid cell overlap merging.
|
|
||||||
searchableRow.addAll(textBlock.getSequences());
|
|
||||||
}
|
|
||||||
cellStarts.add(cellStart);
|
|
||||||
start = start + cell.toString().trim().length() + 1;
|
|
||||||
|
|
||||||
|
startOffsets.add(startOffset);
|
||||||
|
startOffset = startOffset + cell.toString().trim().length() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sectionText.setText(searchableRow.toString());
|
sectionTexts.add(SectionText.builder()
|
||||||
sectionText.setHeadline(table.getHeadline());
|
.text(getRowText(textBlocks))
|
||||||
sectionText.setSectionNumber(sectionNumber.intValue());
|
.headline(table.getHeadline())
|
||||||
sectionText.setTable(true);
|
.sectionNumber(sectionNumber.intValue())
|
||||||
sectionText.setTabularData(tabularData);
|
.isTable(true)
|
||||||
sectionText.setCellStarts(cellStarts);
|
.tabularData(tabularData)
|
||||||
sectionTexts.add(sectionText);
|
.cellStarts(startOffsets)
|
||||||
|
.textBlocks(textBlocks)
|
||||||
|
.sectionAreas(areas)
|
||||||
|
.build());
|
||||||
|
|
||||||
sectionNumber.incrementAndGet();
|
sectionNumber.incrementAndGet();
|
||||||
}
|
}
|
||||||
@ -144,6 +127,41 @@ public class SectionTextBuilderService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getRowText(List<TextBlock> rowTextBlocks) {
|
||||||
|
|
||||||
|
return SearchableText.buildString(rowTextBlocks.stream()
|
||||||
|
.map(textBlock -> textBlock.getSequences())
|
||||||
|
.flatMap(List::stream)
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private boolean hasTableHeader(Table table) {
|
||||||
|
|
||||||
|
return table.getRows()
|
||||||
|
.stream()
|
||||||
|
.anyMatch(row -> row.stream()
|
||||||
|
.anyMatch(cell -> !cell.isHeaderCell() && !cell.getHeaderCells().isEmpty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private SectionArea getSectionArea(Cell cell) {
|
||||||
|
|
||||||
|
return new SectionArea(new Point((float) cell.getX(), (float) cell.getY()), (float) cell.getWidth(), (float) cell.getHeight(), cell.getTextBlocks()
|
||||||
|
.get(0)
|
||||||
|
.getSequences()
|
||||||
|
.get(0)
|
||||||
|
.getPage(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getHeaderName(boolean hasHeader, Cell currentCell, Cell cellInFirstRow) {
|
||||||
|
|
||||||
|
return hasHeader ? buildHeaderName(currentCell.getHeaderCells()
|
||||||
|
.get(currentCell.getHeaderCells().size() - 1)) : buildHeaderName(cellInFirstRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private String buildHeaderName(Cell cell) {
|
private String buildHeaderName(Cell cell) {
|
||||||
|
|
||||||
StringBuilder headerBuilder = new StringBuilder();
|
StringBuilder headerBuilder = new StringBuilder();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user