我正在尝试在我的 ASP.NET Core应用程序中使用wkhtmltopdf将HTML转换为PDF。我已经在我的项目中添加了一个wkhtmltopdf.exe,并标记为始终输出的副本。
这是我的代码:
var htmlContent = receiptBody;
var wkhtmltopdf = new FileInfo(@"/app/Configuration/Wkhtmltopdf/wkhtmltopdf.exe");
var converter = new HtmlToPdfConverter(wkhtmltopdf);
var pdfBytes = converter.ConvertToPdf(htmlContent);
该文件已建立,但位于:
var pdfBytes = converter.ConvertToPdf(htmlContent);
我收到错误:
系统异常:无法生成 PDF:管道--->损坏System.IO.IOException: 破损的管道
我使用 Docker 运行我的应用程序,这是我的 docker文件:
FROM microsoft/aspnetcore:1.1.2 ARG source WORKDIR /app
ENV ASPNETCORE_URLS http://project-test:80
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
RUN apt-get update
RUN apt-get install-y libgdiplus
ENTRYPOINT ["dotnet", "ProjectTest.dll"]
也许应该以某种方式为 linux 安装 wkhtmltopdf?
代码适用于最新的.net core 6.0.1图像:
FROM mcr.microsoft.com/dotnet/aspnet:6.0.1-bullseye-slim AS base
RUN apt update
RUN apt install -y libgdiplus
RUN ln -s /usr/lib/libgdiplus.so /lib/x86_64-linux-gnu/libgdiplus.so
RUN apt-get install -y --no-install-recommends zlib1g fontconfig libfreetype6 libx11-6 libxext6 libxrender1 wget gdebi
RUN wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.stretch_amd64.deb
RUN gdebi --n wkhtmltox_0.12.5-1.stretch_amd64.deb
RUN apt install libssl1.1
RUN ln -s /usr/local/lib/libwkhtmltox.so /usr/lib/libwkhtmltox.so
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0.1 AS build
WORKDIR /src
COPY ["docgen/docgen.csproj", "docgen/"]
RUN dotnet restore "docgen/docgen.csproj"
COPY . .
WORKDIR "/src/docgen"
RUN dotnet build "docgen.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "docgen.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "docgen.dll"]
这一切都与平台和二进制文件有关。
您可以使用WKHTMLTOPDF生成自己的docker映像并使用它。
在我看来,这是一种更清洁的方式。
下面是一个简单的示例:
-
下载 WkHtmlToPdf - Debian 10 (Buster( - amd64 文件:https://wkhtmltopdf.org/downloads.html
-
将下载.deb文件放入 Dockerfile 所在的"deps"子文件夹中
-
将 WkHtmlToPdf 安装添加到 Dockerfile 中。
确保下载.deb文件名与以下行匹配:
ENV WKHTMLTOX wkhtmltox_0.12.6-1.buster_amd64.deb
并确保 .NET Core 映像使用 Debian Buster。
Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /app
## copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
## copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS runtime
WORKDIR /app
## START - INSTALL WKHTMLTOPDF
ENV WKHTMLTOX wkhtmltox_0.12.6-1.buster_amd64.deb
ENV BUILD_PACKAGES build-essential
ENV MAIN_PACKAGES fontconfig libfreetype6 libjpeg62-turbo libxext6 libpng16-16 libx11-6 libxcb1 libxrender1 xfonts-75dpi xfonts-base
COPY deps/$WKHTMLTOX ./
RUN set -xe
&& apt-get update -qq
&& apt-get install --no-install-recommends -yq $BUILD_PACKAGES $MAIN_PACKAGES
&& dpkg -i ${WKHTMLTOX}
&& apt-get remove -y $BUILD_PACKAGES
&& apt-get autoremove -y
&& apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
&& rm -rf ${WKHTMLTOX}
&& truncate -s 0 /var/log/*log
## END - INSTALL WKHTMLTPDF
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
INSTALL WKHTMLTOPDF 代码基于:https://gist.github.com/berkayakcay/1e4f0a355437f0db9c94935aa52283d2
Dockerfile 本身基于:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-3.1#the-dockerfile-1
您应该下载适用于 Linux 的文件 wkhtmltopdf 并复制到输出发布。
另外,在 dockerfile 中通过此步骤授予对这些文件的权限
RUN chmod 755 ./wkhtmltopdf/Linux/wkhtmltopdf
RUN chmod 755 ./wkhtmltopdf/Linux/wkhtmltoimage
确保在 WORKDIR/app 之后添加该行:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /app
RUN apt-get update -qq && apt-get -y install libgdiplus libc6-dev
欲了解更多信息,请查看 https://github.com/fpanaccia/Wkhtmltopdf.NetCore