PDFTron HTML2PDF在Docker中转换失败,报错Child process wait result (wstatus): 0
PDFTron HTML2PDF在Docker环境转换报错的解决方案
问题概述
使用PDFTron HTML2PDF模块转换HTML到PDF时,Windows本地和GitHub Actions的Ubuntu 22.04环境正常,但在ubuntu:22.04或mcr.microsoft.com/dotnet/aspnet:7.0.11 Docker镜像中抛出以下异常:
pdftron.Common.PDFNetException: Exception: Message: Child process wait result (wstatus): 0 Conditional expression: exit_code == 0 Version : 10.4.0-cae97e1 Platform : Linux Architecture : AMD64 Filename : Html2Pdf.cpp Function : Convert Linenumber : 447 at void pdftron.Common.PDFNetException.REX(IntPtr result) at bool pdftron.PDF.HTML2PDF.Convert(PDFDoc doc)
同时发现临时目录已生成正常的PDF文件,但PDFNet.SetTempPath设置未生效。
解决方案
1. 补充Docker镜像的无头Chrome依赖
PDFTron HTML2PDF依赖无头Chromium,现有Dockerfile缺少部分核心依赖,需补充完整:
FROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ libreoffice \ libnss3 \ fontconfig \ libx11-6 \ libx11-xcb1 \ libxcb1 \ libxcursor1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxi6 \ libxrandr2 \ libxrender1 \ libxss1 \ libxtst6 \ libglib2.0-0 \ libdbus-1-3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libgbm1 \ libpango-1.0-0 \ libcairo2 \ libasound2 RUN apt-get clean && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY Artifacts/Demo ./ EXPOSE 80 ENV ASPNETCORE_URLS=http://+:80 ENV DOTNET_RUNNING_IN_CONTAINER=true ENTRYPOINT ["/app/MyApp"]
2. 修复临时路径不生效问题
PDFNet.SetTempPath需在Initialize前调用,同时要确保目标目录存在且有读写权限:
var tempPath = Path.Combine(_options.Value.TempFolderPath, "pdftron"); // 提前创建目录并确保权限 Directory.CreateDirectory(tempPath); PDFNet.SetTempPath(tempPath); PDFNet.Initialize(_options.Value.LicenseKey);
如果使用自定义临时目录,需在Dockerfile中提前创建并授权:
RUN mkdir -p /app/pdftron-temp && chmod 777 /app/pdftron-temp
3. 兼容异常处理(针对10.4.0版本)
该版本在Docker环境下存在子进程退出状态码解析bug,可捕获特定异常并手动读取生成的PDF:
try { html2Pdf.Convert(pdfDoc); } catch (PDFNetException ex) when (ex.Message.Contains("Child process wait result (wstatus): 0")) { var tempFiles = Directory.GetFiles(PDFNet.GetTempPath(), "Trn-*"); if (tempFiles.Length > 0) { // 读取临时PDF文件到PDFDoc using (var fs = new FileStream(tempFiles[0], FileMode.Open)) { pdfDoc.Load(fs); } // 清理临时文件 foreach (var file in tempFiles) { File.Delete(file); } } else { // 转换真失败时重新抛出异常 throw; } }
优先建议:升级PDFTron到最新稳定版,新版本已修复此类兼容性问题。
4. 用非root用户运行容器(可选)
root用户运行可能引发权限异常,创建非root用户提升稳定性:
RUN useradd -m appuser RUN chown -R appuser:appuser /app USER appuser
内容的提问来源于stack exchange,提问作者András Kurai
相关产品推荐
相关产品推荐

