You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:20:06