Utiliser PDFbox pour déterminer les coordonnées de mots dans un document
Je suis en utilisant PDFbox à extraire les coordonnées de mots/chaînes de caractères dans un document PDF, et ont eu du succès détermination de la position de chacun des caractères. c'est le code donc ici, à partir de la PDFbox doc:
package printtextlocations;
import java.io.*;
import org.apache.pdfbox.exceptions.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.util.PDFTextStripper;
import org.apache.pdfbox.util.TextPosition;
import java.io.IOException;
import java.util.List;
public class PrintTextLocations extends PDFTextStripper {
public PrintTextLocations() throws IOException {
super.setSortByPosition(true);
}
public static void main(String[] args) throws Exception {
PDDocument document = null;
try {
File input = new File("C:\\path\\to\\PDF.pdf");
document = PDDocument.load(input);
if (document.isEncrypted()) {
try {
document.decrypt("");
} catch (InvalidPasswordException e) {
System.err.println("Error: Document is encrypted with a password.");
System.exit(1);
}
}
PrintTextLocations printer = new PrintTextLocations();
List allPages = document.getDocumentCatalog().getAllPages();
for (int i = 0; i < allPages.size(); i++) {
PDPage page = (PDPage) allPages.get(i);
System.out.println("Processing page: " + i);
PDStream contents = page.getContents();
if (contents != null) {
printer.processStream(page, page.findResources(), page.getContents().getStream());
}
}
} finally {
if (document != null) {
document.close();
}
}
}
/**
* @param text The text to be processed
*/
@Override /* this is questionable, not sure if needed... */
protected void processTextPosition(TextPosition text) {
System.out.println("String[" + text.getXDirAdj() + ","
+ text.getYDirAdj() + " fs=" + text.getFontSize() + " xscale="
+ text.getXScale() + " height=" + text.getHeightDir() + " space="
+ text.getWidthOfSpace() + " width="
+ text.getWidthDirAdj() + "]" + text.getCharacter());
}
}
Ce produit une série de lignes contenant la position de chaque personnage, y compris les espaces, qui ressemble à ceci:
String[202.5604,41.880127 fs=1.0 xscale=13.98 height=9.68814 space=3.8864403 width=9.324661]P
Où " P " est le caractère. Je n'ai pas été en mesure de trouver une fonction dans PDFbox de trouver les mots, et je ne suis pas assez familier avec Java pour être en mesure de concaténer ces caractères de retour en mots de recherche à travers, même si les espaces sont également inclus. Quelqu'un d'autre a été dans une situation similaire, et si oui, comment avez-vous l'aborder? Je n'ai vraiment besoin de la coordonnée du premier caractère dans la parole, si bien que simplifié, mais de la façon dont je vais correspondre à une chaîne de contre ce type de sortie est au delà de moi.
source d'informationauteur jbrain
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de fonction dans PDFBox qui permet d'extraire les mots automatiquement. Je suis actuellement en train de travailler sur l'extraction de données à recueillir en blocs et voici mon processus:
J'ai extrait tous les caractères du document (appelé glyphes) et de les stocker dans une liste.
- Je faire une analyse des coordonnées de chaque glyphe, boucler sur la liste. Si elles se chevauchent (si le haut de la glyphe est contenue entre le haut et le bas de la précédente/ou le bas de la glyphe est contenue entre le haut et le bas de la précédente), je l'ajoute à la même ligne.
À ce point, j'ai extrait les différentes lignes du document (attention, si votre document est multi-colonne, l'expression "lignes" signifie que tous les glyphes qui se superposent verticalement, c'est à dire le texte de toutes les colonnes qui ont les mêmes coordonnées verticales).
Ensuite, vous pouvez comparer les coordonnée à gauche de l'actuel glyphe pour le droit de coordonnées de la précédente pour déterminer si elles appartiennent à un même mot, ou pas (les PDFTextStripper classe fournit un getSpacingTolerance() méthode qui vous donne, basée sur des essais et des erreurs, la valeur d'un "normal" de l'espace. Si la différence entre la droite et la gauche de coordonnées est inférieure à cette valeur, les deux glyphes appartiennent à la même parole.
J'ai appliqué cette méthode à mon travail et il fonctionne bien.
Fondée sur l'origine, l'idée ici est une version de la recherche de texte pour PDFBox 2. Le code lui-même est difficile, mais simple. Il devrait vous obtenir a commencé assez rapidement.