Tesseract: Prise en charge Linux manquante pour .NET Core

Créé le 22 janv. 2020  ·  20Commentaires  ·  Source: charlesw/tesseract

Lorsque vous essayez d'exécuter une application minimale sur Linux, une exception est levée
System.DllNotFoundException: Failed to find library "libleptonica-1.78.0.so" for platform x64
Les dépendances natives ne sont donc incluses pour aucune plate-forme autre que Windows, semble-t-il.

Commentaire le plus utile

Ne serait-il pas plus logique de simplement regrouper les dépendances natives dans le package ? Il existe de nombreux packages .net qui font cela plutôt que d'exiger que les gens aient exactement les bonnes bibliothèques installées (ou effectuent des étapes manuelles pour copier dans ces dépendances).

Tous les 20 commentaires

J'ai également ce problème lorsque j'essaie de construire travis-ci avec Linux. Y a-t-il un paquet qui peut être installé qui fera tomber ce fichier ? J'ai essayé les deux solutions suivantes, aucune d'elles n'a aidé

sudo apt install tesseract-ocr
sudo apt install libleptonica-dev

J'avais besoin de compiler ce fichier moi-même pour le faire fonctionner.
J'ai utilisé cette documentation : https://github.com/tesseract-ocr/tesseract/wiki/Compiling

Le problème est qu'InteropDotNet semble attendre libleptonica et libtesseract natifs dans le dossier correspondant (x64 ou x86). Donc si vous êtes paresseux comme moi, vous pouvez installer libtesseract-dev et libleptonica-dev , copier les fichiers *.so dans le dossier bin/< Configuration >/netcoreapp3.1/x64, les renommer (compilateur voulez-vous quel fichier est manquant) et cela fonctionne soudainement. En supposant que les sources logicielles de votre distribution contiennent les versions appropriées, c'est-à-dire ;)

Je pense que la solution appropriée est cependant d'expédier les binaires pour Linux comme c'est le cas pour Windows.

Je pensais qu'une meilleure façon de gérer cela serait de soutenir
se contenter d'utiliser la routine de bibliothèque dynamique de chargement générique (c'est-à-dire
chemins de recherche standard). De cette façon, cela devrait fonctionner à condition que les bibliothèques
été installé.

Le seul problème auquel je peux penser est que cela pourrait causer des problèmes de diagnostic
erreurs liées à la recherche ou au chargement de la bibliothèque. Ce qui a été un
douleur constante dans le cul.

Comment ça sonne?

Le mar 28 janvier 2020, 07:13 Arthur, [email protected] a écrit :

Le problème est qu'InteropDotNet
https://github.com/AndreyAkinshin/InteropDotNet semble s'attendre à natif
libleptonica et libtesseract dans le dossier correspondant (x64 ou x86). Donc si
vous êtes paresseux comme moi, vous pouvez installer libtesseract-dev et
libleptonica-dev, copiez les fichiers .so dans le dossier bin//x64, renommez-les(le compilateur vous indiquera quel fichier est manquant) et tout à coup, cela fonctionne .

Je pense que la solution appropriée est d'expédier les binaires pour Linux
comme c'est le cas pour Windows.

-
Vous recevez ceci parce que vous êtes abonné à ce fil.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/charlesw/tesseract/issues/503?email_source=notifications&email_token=AAB7HSFBQGRE4KQQXT532Q3Q7455HA5CNFSM4KKGHXW2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVX5ZJKLOPTN5 ,
ou se désinscrire
https://github.com/notifications/unsubscribe-auth/AAB7HSDQUHSMSOEPC36WOSDQ7455HANCNFSM4KKGHXWQ
.

J'ai le même problème, j'ai réussi à compiler les bons leptonica 1.78.0 et tesseract 4.1.0 car j'utilise une image Docker basée sur Debian buster et cela ne va qu'en 1.76 et 4.0.1 mais j'ai toujours le "System.DllNotFoundException: Impossible de trouver la bibliothèque "libleptonica-1.78.0.so" pour la plate-forme x64."

J'ai essayé de copier le .so dans le dossier x64 en tant que suggestion de @arthrp et j'ai également essayé avec des liens symboliques mais cela ne fonctionne pas non plus, je ne sais pas quoi faire d'autre à ce stade.

Une idée?

Je ne sais pas si cela aide, mais @howff a réussi à le faire fonctionner dans notre référentiel avec ce commit. Il a quelques renommages des fichiers dans le répertoire x64 https://github.com/SMI/SmiServices/commit/d97879dd84c7288ca6e472c7f2b0f678bb9a47a3

Merci, au moins cela confirme qu'ils doivent s'appeler x64\libleptonica-1.78.0.so et x64\libtesseract41.so .
Curieusement c'est exactement ce que je fais, je dois me tromper ailleurs je suppose...

Vous devrez compiler le linux .so pour leptonica et tesseract et les placer dans le répertoire x64. Assurez-vous que les noms de fichiers sont x64/libtesseract41.so et x64/libleptonica-1.78.0.so afin que les DLL puissent les trouver, MAIS vous pourriez constater qu'en interne le tesseract .so fait référence au leptonica .so par un nom différent donc vous pourriez besoin d'un lien symbolique (ou copie) nommé x64/libleptonica.so.5.3.0

Vous pouvez utiliser l'utilitaire Linux 'ldd' pour savoir s'il manque d'autres dépendances.

Merci beaucoup d'avoir essayé de m'aider, en gros, dans mon image Docker, j'ai ceci :

root@st-ocr_service:/usr/local/lib# ls -alh
total 145M
drwxr-xr-x 1 root root 4.0K Feb  7 15:51 .
drwxr-xr-x 1 root root 4.0K Feb  7 15:51 ..
-rw-r--r-- 1 root root  17M Feb  7 14:14 liblept.a
-rwxr-xr-x 1 root root  984 Feb  7 14:14 liblept.la
lrwxrwxrwx 1 root root   16 Feb  7 14:14 liblept.so -> liblept.so.5.0.3
lrwxrwxrwx 1 root root   16 Feb  7 14:14 liblept.so.5 -> liblept.so.5.0.3
-rwxr-xr-x 1 root root 2.6M Feb  7 14:14 liblept.so.5.0.3
-rw-r--r-- 1 root root 123M Feb  7 14:19 libtesseract.a
-rwxr-xr-x 1 root root 1.1K Feb  7 14:19 libtesseract.la
lrwxrwxrwx 1 root root   21 Feb  7 14:19 libtesseract.so -> libtesseract.so.4.0.1
lrwxrwxrwx 1 root root   21 Feb  7 14:19 libtesseract.so.4 -> libtesseract.so.4.0.1
-rwxr-xr-x 1 root root 3.4M Feb  7 14:19 libtesseract.so.4.0.1
drwxr-xr-x 2 root root 4.0K Feb  7 15:51 pkgconfig

Et ça:

root@st-ocr_service:/app/x64# ls -alh
total 12K
drwxr-xr-x 1 root root 4.0K Feb  7 16:08 .
drwxr-xr-x 1 root root 4.0K Feb  7 15:51 ..
lrwxrwxrwx 1 root root   27 Feb  7 16:03 liblept.so.5 -> /usr/local/lib/liblept.so.5
lrwxrwxrwx 1 root root   27 Feb  7 16:08 libleptonica-1.78.0.so -> /usr/local/lib/liblept.so.5
lrwxrwxrwx 1 root root   36 Feb  7 16:08 libtesseract41.so -> /usr/local/lib/libtesseract.so.4.0.1

Ce qui est cohérent avec ce que j'ai obtenu de ldd :

root@st-ocr_service:/app/x64# ldd libtesseract41.so 
    [...]
    liblept.so.5 => /usr/local/lib/liblept.so.5 (0x00007fe735ff6000)
    [...]

Cependant, même avec cette configuration, j'obtiens toujours le System.DllNotFoundException: Failed to find library "libleptonica-1.78.0.so" for platform x64. qui me rend fou.

Lundi matin, café frais, esprit clair, j'ai enfin réussi à faire fonctionner ça !
Ma compilation Leptonica et Tesseract n'était pas correcte, j'ai corrigé cela, et il y avait aussi des dépendances manquantes dans mon image Docker, maintenant tout est trié et fonctionne comme il se doit !

J'essaie de compiler dans Windows 10 et de déployer sur AWS Lambda. Je reçois l'erreur sur le fichier libleptonica-1.78.0.so manquant.
Y a-t-il un endroit où je peux le télécharger ?

@sudipkumarbhattacharya Les binaires Linux sont liés à l'un des commentaires précédents

Voici comment je l'ai corrigé sur un serveur Debian 9 :

cd ~/MyProject/x64

sudo apt install libleptonica-dev
ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 liblept.so.5
ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 libleptonica-1.78.0.so

# Installed the repository from https://notesalexp.org/
sudo apt install libtesseract-dev
ln -s /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.1 libtesseract41.so

Les chemins et les versions peuvent être différents sur votre machine.

Quelqu'un est-il capable de l'exécuter sur .NET Core 5.0 ? J'ai des problèmes pour compiler un exemple d'application de console sur Manjaro Linux après la mise à jour des dépendances et du framework cible.

leptopnica est OK, libteseract est OK, mais le résultat Console App même s'il compile, il plante avec segmentation fault lorsque je l'exécute. Quelque chose me fait penser que ce wrapper .NET ne fonctionne pas correctement sous Linux.

Ne serait-il pas plus logique de simplement regrouper les dépendances natives dans le package ? Il existe de nombreux packages .net qui font cela plutôt que d'exiger que les gens aient exactement les bonnes bibliothèques installées (ou effectuent des étapes manuelles pour copier dans ces dépendances).

Oui, c'est certainement une option, est-ce que quelqu'un d'autre a des opinions ici? je
n'ont pas beaucoup d'expérience avec Linux, donc pas sûr des meilleures pratiques actuelles
ici.

Notez que je n'ai pas le temps de maintenir Linux/Mac mais j'accepterai le pull
demandes. Veuillez soulever un problème ou commenter un problème existant si
approprié, pour discuter d'abord de vos idées 🙂

Le mar. 16 mars 2021, 02:49 Alexander Trauzzi, @ . * >
a écrit:

Ne serait-il pas plus logique de simplement regrouper les dépendances natives dans le
paquet? Il existe de nombreux packages .net qui le font plutôt que d'exiger
que les gens ont exactement les bonnes bibliothèques installées (ou effectuent des étapes manuelles
copier dans ces dépendances).

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/charlesw/tesseract/issues/503#issuecomment-799527550 ,
ou se désinscrire
https://github.com/notifications/unsubscribe-auth/AAB7HSF4QBJ3BHIGK62JFODTDYUAFANCNFSM4KKGHXWQ
.

Je pense que le processus serait le même pour Windows, macOS et Linux. La bibliothèque Windows devrait également inclure une copie statique, alors peut-être commencer par là ?

J'utilise wrapper pour .NET 4.1.1 et cela a fonctionné sur WSL2 (Ubuntu 20.04) en utilisant la solution de carloswbarros . Mais le déploiement sur Docker sur AWS échoue avec le message Échec de la recherche de la bibliothèque "libleptonica-1.80.0.so" pour la plate-forme x64. ou parfois avec Échec de la recherche de la bibliothèque "libtesseract41.so" pour la plate-forme x64. J'ai essayé des liens symboliques comme
WORKDIR /app/x64
RUN ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 libleptonica-1.80.0.so
RUN ln -s /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.1 libtesseract41.so
ça n'aide pas. J'ai également essayé de copier dans le dossier x64 directement à partir du dossier de solution et le même résultat. Maintenant, je pense que je dois le compiler peut-être. En fait, c'est une bonne idée d'avoir une bibliothèque Linux avec le paquet nuget installé.

J'utilise wrapper pour .NET 4.1.1 et cela a fonctionné sur WSL2 (Ubuntu 20.04) en utilisant la solution de carloswbarros . Mais le déploiement sur Docker sur AWS échoue avec le message Échec de la recherche de la bibliothèque "libleptonica-1.80.0.so" pour la plate-forme x64. ou parfois avec Échec de la recherche de la bibliothèque "libtesseract41.so" pour la plate-forme x64. J'ai essayé des liens symboliques comme
WORKDIR /app/x64
RUN ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 libleptonica-1.80.0.so
RUN ln -s /usr/lib/x86_64-linux-gnu/libtesseract.so.4.0.1 libtesseract41.so
ça n'aide pas. J'ai également essayé de copier dans le dossier x64 directement à partir du dossier de solution et le même résultat. Maintenant, je pense que je dois le compiler peut-être. En fait, c'est une bonne idée d'avoir une bibliothèque Linux avec le paquet nuget installé.

j'ai également cette erreur lorsque j'exécute le workflow github et l'instation docker

Cela a fonctionné pour moi dans Dockerfile. Nous avons dû construire libtesseract.so.4.0.1 à partir des sources
RUN apt-get update && apt-get install -y libleptonica-dev
RUN apt-get update && apt-get install -y libtesseract-dev
RUN apt-get update && apt-get install -y libc6-dev
RUN apt-get update && apt-get install -y libjpeg62-turbo-dev
RUN apt-get update && apt-get install -y libgdiplus

WORKDIR /app/x64
RUN ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 liblept.so.5
RUN ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 libleptonica-1.80.0.so
COPIER ./sofile/libtesseract.so.4.0.1 libtesseract41.so

Cette page vous a été utile?
0 / 5 - 0 notes