Extraire les données de tableaux PDF avec Java
Extraire des tableaux d’un PDF
Utilisez TableAbsorber pour rechercher des tableaux sur chaque page et parcourir les lignes, les cellules, les fragments de texte et les segments de texte.
-
Ouvrez le PDF source dans une instance
Document. -
Parcourez les pages
Pagecar les tableaux sont détectés page par page. -
Créez un
TableAbsorberpour chaque page et appelezvisit(page)pour remplir la liste des tableaux détectés. -
Parcourez les objets
AbsorbedTable,AbsorbedRow,AbsorbedCell,TextFragmentetTextSegmentdétectés. -
Reconstituez le texte de chaque ligne à partir du contenu du fragment et affichez les données du tableau.
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);
}
}
}
}
}
Extraire un tableau d’une zone marquée spécifique
Cet exemple recherche une annotation carrée, compare son rectangle à chaque tableau détecté et génère uniquement les tableaux situés à l’intérieur de la région marquée.
-
Ouvrez le PDF source dans une instance
Document. -
Obtenez la page cible
Pageet localisez l’annotation carréeAnnotationqui marque la région d’extraction. -
Créez un
TableAbsorberet appelezvisit(page)pour détecter les tableaux sur cette page. -
Pour chaque tableau
AbsorbedTabledétecté, comparez son rectangleRectangleaux limites du rectangle de l’annotation. -
Parcourez les objets
AbsorbedRowetAbsorbedCellcorrespondants et reconstruisez le texte de la ligne. -
Affichez les données du tableau pour la région marquée uniquement.
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);
}
}
}
}
}
Exporter des tableaux vers Excel
-
Ouvrez le PDF source dans une instance
Document. -
Créez
ExcelSaveOptionspour l’exportation. -
Définissez le format de sortie Excel sur
XLSXafin que la disposition du tableau détectée soit écrite sous forme de classeur Excel. -
Appelez
document.save(outputFile.toString(), excelSave)pour exporter le document au format 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);
}
}