Извлечение данных из таблицы в PDF с помощью Java
Contents
[
Hide
]
Извлечение таблиц из PDF
Используйте TableAbsorber, чтобы найти таблицы на каждой странице и перебрать строки, ячейки, текстовые фрагменты и текстовые сегменты.
- Откройте исходный PDF в экземпляре Document.
- Переберите страницы Page документа, поскольку таблицы обнаруживаются постранично.
- Создайте TableAbsorber для каждой страницы и вызовите
visit(page)для заполнения списка обнаруженных таблиц. - Переберите обнаруженные объекты AbsorbedTable, AbsorbedRow, AbsorbedCell, TextFragment и
TextSegment. - Постройте извлечённый текст строки из содержимого фрагмента и выведите данные таблицы.
public static void extractTablesFromPdf(Path inputFile) {
try (Document document = new Document(inputFile.toString())) {
for (Page page : document.getPages()) {
TableAbsorber absorber = new TableAbsorber();
absorber.visit(page);
for (AbsorbedTable table : absorber.getTableList()) {
System.out.println("Table");
for (AbsorbedRow row : table.getRowList()) {
StringBuilder rowText = new StringBuilder();
for (AbsorbedCell cell : row.getCellList()) {
if (rowText.length() > 0) {
rowText.append("|");
}
StringBuilder cellText = new StringBuilder();
for (TextFragment fragment : cell.getTextFragments()) {
StringBuilder fragmentText = new StringBuilder();
for (TextSegment segment : fragment.getSegments()) {
fragmentText.append(segment.getText());
}
if (cellText.length() > 0) {
cellText.append("|");
}
cellText.append(fragmentText);
}
rowText.append(cellText);
}
System.out.println(rowText);
}
}
}
}
}
Извлечение таблицы из конкретной отмеченной области
В этом примере выполняется поиск квадратной аннотации и сравнение её прямоугольника с каждой обнаруженной таблицей. Выводятся только таблицы, находящиеся внутри отмеченной области.
- Откройте исходный PDF в экземпляре Document.
- Получите нужную страницу Page и найдите квадратную аннотацию Annotation, которая отмечает область извлечения.
- Создайте TableAbsorber и вызовите
visit(page)для обнаружения таблиц на этой странице. - Сравните границы каждой обнаруженной таблицы AbsorbedTable, представленные объектом Rectangle, с границами прямоугольника аннотации.
- Переберите объекты AbsorbedRow и AbsorbedCell таблиц в отмеченной области и восстановите текст строк.
- Выведите данные таблицы только для отмеченной области.
public static void extractTableFromSpecificArea(Path inputFile) {
try (Document document = new Document(inputFile.toString())) {
Page page = document.getPages().get_Item(1);
Annotation squareAnnotation = null;
for (Annotation annotation : page.getAnnotations()) {
if (annotation.getAnnotationType() == AnnotationType.Square) {
squareAnnotation = annotation;
break;
}
}
if (squareAnnotation == null) {
System.out.println("No square annotation found.");
return;
}
TableAbsorber absorber = new TableAbsorber();
absorber.visit(page);
for (AbsorbedTable table : absorber.getTableList()) {
Rectangle tableRect = table.getRectangle();
Rectangle annotationRect = squareAnnotation.getRect();
boolean isInRegion = annotationRect.getLLX() < tableRect.getLLX()
&& annotationRect.getLLY() < tableRect.getLLY()
&& annotationRect.getURX() > tableRect.getURX()
&& annotationRect.getURY() > tableRect.getURY();
if (isInRegion) {
for (AbsorbedRow row : table.getRowList()) {
StringBuilder rowText = new StringBuilder();
for (AbsorbedCell cell : row.getCellList()) {
if (rowText.length() > 0) {
rowText.append("|");
}
StringBuilder cellText = new StringBuilder();
for (TextFragment fragment : cell.getTextFragments()) {
StringBuilder fragmentText = new StringBuilder();
for (TextSegment segment : fragment.getSegments()) {
fragmentText.append(segment.getText());
}
if (cellText.length() > 0) {
cellText.append("|");
}
cellText.append(fragmentText);
}
rowText.append(cellText);
}
System.out.println(rowText);
}
}
}
}
}
Экспорт таблиц в Excel
- Откройте исходный PDF в экземпляре Document.
- Создайте ExcelSaveOptions для экспорта.
- Установите формат вывода Excel в
XLSX, чтобы сохранить обнаруженную структуру таблицы в виде книги Excel. - Вызовите
document.save(outputFile.toString(), excelSave)для экспорта документа в формат Excel.
public static void exportTablesToExcel(Path inputFile, Path outputFile) {
try (Document document = new Document(inputFile.toString())) {
ExcelSaveOptions excelSave = new ExcelSaveOptions();
excelSave.setFormat(ExcelSaveOptions.ExcelFormat.XLSX);
document.save(outputFile.toString(), excelSave);
}
}