comment pouvons-nous extraire du texte à partir d'un fichier pdf à l'aide de itextsharp avec des espaces?
Je suis en utilisant la méthode ci-dessous pour en extraire pdf texte, ligne par ligne. Mais problème, il n'est pas de la lecture des espaces entre les mots et les chiffres. quelle pourrait être la solution pour cela ??
Je veux juste créer une liste de chaîne de caractères, chaque chaîne dans la liste objet a une ligne de texte au format pdf, il est en pdf, y compris les espaces.
public void readtextlinebyline(string filename) {
List<string> strlist = new List<string>();
PdfReader reader = new PdfReader(filename);
string text = string.Empty;
for (int page = 1; page <= 1; page++)
{
text += PdfTextExtractor.GetTextFromPage(reader, page ,new LocationTextExtractionStrategy())+" ";
}
reader.Close();
string[] words = text.Split('\n');
foreach (string word in words)
{
strlist.Add(word);
}
foreach (string st in strlist)
{
Response.Write(st +"<br/>");
}
}
J'ai essayé cette méthode par changement de stratégie pour SimpleTextExtractionStrategy ainsi, mais c'est aussi de ne pas travailler pour moi.
Cette réponse à "itext java pdf de création de texte" peut illustrer la raison et font allusion à une solution: Copier le texte d'extration de la stratégie et de modifier les paramètres internes, dans votre cas, la largeur minimale de l'espace à être reconnu comme un espace,
Comme vous offrons une prime, vous avez sûrement soumis à ce problème. Ainsi, vous ne peut certainement fournir un ou plusieurs échantillons de fichiers Pdf pour servir de cas de test pour les solutions proposées. L'état actuel de la question permet de répondre à de pures conjectures.
Désolé pour la réponse tardive, ma connexion s'est cassé.Ce que je n'aime pas c'est pas votre solution (il fonctionne) - ce qui me déplaît, c'est que cette solution n'est probablement pas fiable. F. E: il fonctionne avec un seul fichier, mais peut-être sur un autre fichier, il serait de produire trop d'espaces (Cause que le document doit renderInfo.getSingleSpaceWidth()/2f ou une tout autre diviseur). Je n'ai pas un exemple, mais ses quelque chose que je pouvais imaginer qu'il peut arriver. J'ai donc demandé des réponses à partir d'un "plus" de source fiable.
Malheureusement, vous n'oublierez pas facilement obtenir un générique fiable à 100% de la solution. Certains des problèmes qu'il est difficile de l'obtenir sont mentionnés dans la réponse que j'ai souligné. Il peut être vraiment difficile de faire la différence entre le crénage et étroitement jeu de mots.
Yep, j'ai pensé à quelque chose comme ça. Triste, mais pas modifiable. j'ai aussi essayé beaucoup de choses, comme essayer de calcul de la spacesize en fonction de la police, etc, mais rien ne marche aussi bien en tant que votre déjà posté la solution. Si vous postez votre solution de nouveau comme answear je peux vous donner la réputation.
renderInfo.getSingleSpaceWidth()/2f
par défaut; la personne qui a demandé de revenir il y a eu de l'amélioration des résultats avec renderInfo.getSingleSpaceWidth()/4f
.Comme vous offrons une prime, vous avez sûrement soumis à ce problème. Ainsi, vous ne peut certainement fournir un ou plusieurs échantillons de fichiers Pdf pour servir de cas de test pour les solutions proposées. L'état actuel de la question permet de répondre à de pures conjectures.
Désolé pour la réponse tardive, ma connexion s'est cassé.Ce que je n'aime pas c'est pas votre solution (il fonctionne) - ce qui me déplaît, c'est que cette solution n'est probablement pas fiable. F. E: il fonctionne avec un seul fichier, mais peut-être sur un autre fichier, il serait de produire trop d'espaces (Cause que le document doit renderInfo.getSingleSpaceWidth()/2f ou une tout autre diviseur). Je n'ai pas un exemple, mais ses quelque chose que je pouvais imaginer qu'il peut arriver. J'ai donc demandé des réponses à partir d'un "plus" de source fiable.
Malheureusement, vous n'oublierez pas facilement obtenir un générique fiable à 100% de la solution. Certains des problèmes qu'il est difficile de l'obtenir sont mentionnés dans la réponse que j'ai souligné. Il peut être vraiment difficile de faire la différence entre le crénage et étroitement jeu de mots.
Yep, j'ai pensé à quelque chose comme ça. Triste, mais pas modifiable. j'ai aussi essayé beaucoup de choses, comme essayer de calcul de la spacesize en fonction de la police, etc, mais rien ne marche aussi bien en tant que votre déjà posté la solution. Si vous postez votre solution de nouveau comme answear je peux vous donner la réputation.
OriginalL'auteur shailendra | 2013-05-06
Vous devez vous connecter pour publier un commentaire.
Les décors sur le pourquoi de l'espace entre les mots, parfois, n'est pas correctement reconnu par la bibliothèque iText(Sharp) ou d'un autre texte PDF extracteurs, ont été expliquées dans cette réponse à "itext java pdf-texte de création": Ces "espaces" ne sont pas nécessairement créé à l'aide d'un caractère d'espace, mais plutôt à l'aide d'une opération de création d'un petit espace. Ces opérations sont également utilisés à d'autres fins (qui ne casse pas des mots), et un texte extracteur doit utiliser la méthode heuristique pour décider si une telle lacune est un changement de mot ou pas...
En particulier, cela implique que vous n'aurez jamais 100% sécurisé par mot détection de rupture.
Ce que vous pouvez faire, cependant, est d'améliorer l'heuristique utilisée.
iText et iTextSharp de texte standard de l'extraction des stratégies, par exemple, supposons qu'un changement de mot dans une ligne, si
a) il y a un caractère d'espace ou
b) il y a un écart au moins aussi large que la moitié d'un caractère espace.
Élément de a est un succès, mais l'élément b peut souvent échoue dans le cas de zones densément texte. L'OP de la question de la réponse citée ci-dessus obtenu d'assez bons résultats en utilisant un quart de la largeur d'un caractère d'espace à la place.
Vous pouvez modifier ces critères par la copie et la modification de l'extraction de texte de la stratégie de votre choix.
Dans le
SimpleTextExtractionStrategy
vous trouvez ce critère incorporé dans lerenderText
méthode:Dans le cas de la
LocationTextExtractionStrategy
ce critère quant à lui a été mis dans une méthode qui lui est propre:L'intention de mettre en une méthode de sa propre était simplement nécessitent une simple sous-classement de la stratégie et de la substitution de cette méthode pour ajuster les critères heuristiques. Cela fonctionne bien dans le cas de l'équivalent de la bibliothèque iText classe Java mais pendant le port de iTextSharp malheureusement pas de
virtual
a été ajouté à la déclaration (de la version 5.4.4). Ainsi, actuellement, la copie de l'ensemble de la stratégie est toujours nécessaire pour iTextSharp.@Bruno Vous pourriez raconter l'iText -> iTextSharp portage de l'équipe à ce sujet.
Alors que vous pouvez affiner extraction de texte à ces code endroits, vous devriez être conscient que vous ne trouverez pas de 100% d'ici le critère. Certaines raisons sont:
Vous pouvez obtenir mieux que le iText heuristiques et celles qui en ont dérivé à l'aide d'autres constantes en tenant compte de la réelle visuelle de l'espace libre entre tous les personnages (à l'aide de rendu PDF ou des informations de police de mécanismes d'analyse), mais pour une amélioration perceptible que vous avez à investir beaucoup de temps.
Autant que je sache, le iTextSharp Port en attendant, a ajouté
virtual
à ceLocationTextExtractionStrategy
méthode. En réalité pas seulement cette méthode, mais pratiquement tous lespublic
méthode.Brillante réponse. Exactement les informations dont j'avais besoin et écrit très complètement et clairement. Je vous remercie beaucoup.
OriginalL'auteur mkl
J'ai ma propre mise en œuvre, et il fonctionne très bien.
SimpleTextExtractionStrategy
alors que l'OP a utilisé avec leLocationTextExtractionStrategy
. Alors que c'est certainement une différence, ils utilisent essentiellement la même heuristique pour déterminer un changement de mot (un espace ou un écart d'au moins la moitié de sa largeur d'un caractère espace). Ainsi, ce ne sera guère faire mieux que le code d'origine.mkl est droit. Cela peut fonctionner dans certains cas, mais échoue dans d'autres, comme la mienne. (J'ai des caractères non reconnaissable en raison de codage différent) Aussi le SimpleTextExtractionStrategy n'insérez pas de '\n' correctement dans mon cas, donc je dois construire mon personnalisée RenderListener (que j'ai besoin d'extraire de l'image) et de modifier le code pour l'adapter à mon exigence, par exemple, modifier la condition qui détecte la nouvelle ligne de orientationMagnitude == autres. OrientationMagnitude de Mathématiques.Abs(orientationMagnitude - autres.OrientationMagnitude) < 10. Évidemment, il l'habitude de fonctionner dans tous les cas.
OriginalL'auteur Jaderson Linhares
OriginalL'auteur Swapnil Somkuwar