使用 wkhtmltopdf、docker 在 ASP.NET Core 中将 HTML 转换为 PDF



我正在尝试在我的 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映像并使用它。

在我看来,这是一种更清洁的方式。

下面是一个简单的示例:

  1. 下载 WkHtmlToPdf - Debian 10 (Buster( - amd64 文件:https://wkhtmltopdf.org/downloads.html

  2. 将下载.deb文件放入 Dockerfile 所在的"deps"子文件夹中

  3. 将 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

最新更新