错误无法使用 .Net Core 3.1 在 Ubuntu 上加载文件或程序集 Tesseract

Error Could not load file or assembly Tesseract on Ubuntu using .Net Core 3.1

我在 dotnetcore 3.1 项目上使用 Tesseract 版本 4.1.1,它在 windows 上完美运行,但是当我在 ubuntu 上发布它时,它会在这一行抛出以下错误

new TesseractEngine(Tessdatapath, LanguageCode, EngineMode.TesseractAndLstm);

Could not load file or assembly 'Tesseract, Version=4.1.1.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.

我用发布文件复制了 x64 和 x86 dll,并确保它们与 tessdata 处于同一级别

我尝试在 ubuntu 上安装 tesseract 并将 .so 文件复制到 x64 和 x86 文件夹中,但仍然没有成功

这就是我修复它的方法

结果是系统没有显示正确的错误消息,因为它无法使用 Linux 不支持的库 System.Drawing.Common。

通过使用 libgdiplux 修复了 System.Drawing.Common

的 Linux 实现
sudo apt-get -f install libgdiplus

然后它显示了正确的信息

Failed to find library "libleptonica-1.80.0.so" for platform x64.

为了解决这个问题,我必须从这里编译这个 leptonica 版本 http://www.leptonica.org/download.html

这帮助我编译了它 http://www.leptonica.org/source/README.html

所以现在我已经安装了“libleptonica-1.80.0.so”,我在我的 x64 文件夹中创建了 link 到此评论后的 leptonica 文件 Tesseract Issue #503

因为我不得不做很多 trial-and-error 即使@Lemo 的回答很好我想 post 我的结果 Docker 文件因为它可能会节省一些人几个小时:)

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

# Install libs for Tesseract
RUN apt-get update
RUN apt-get install -y git cmake build-essential
RUN mkdir leptonica
RUN git clone https://github.com/DanBloomberg/leptonica.git /leptonica

WORKDIR /leptonica
RUN mkdir build
WORKDIR /leptonica/build
RUN cmake ..

RUN apt-get install -y libleptonica-dev libtesseract-dev

# Link libs for Tesseract
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

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["ProjectName/ProjectName.csproj", "ProjectName/"]
RUN dotnet restore "ProjectName/ProjectName.csproj"
COPY . .

WORKDIR "/src/ProjectName"
RUN dotnet build "ProjectName.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "ProjectName.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ProjectName.dll"]