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

Docker化Streamlit应用时遭遇NotImplementedError报错求助

解决Docker化Streamlit应用中docx2pdf的Linux兼容性问题

问题根源

docx2pdf依赖Microsoft Word的COM接口实现格式转换,而Linux系统无法直接安装Windows版Microsoft Word,因此在Linux镜像中运行会抛出NotImplementedError。

可行解决方案

方案1:用LibreOffice替代docx2pdf(推荐)

LibreOffice是跨平台办公套件,支持命令行模式转换docx到pdf,兼容性好且无需额外授权。

步骤1:修改Dockerfile

添加LibreOffice的安装指令:

FROM python:3.10-slim

# 安装LibreOffice Writer及依赖
RUN apt-get update && \
    apt-get install -y --no-install-recommends libreoffice-writer && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["streamlit", "run", "your_app.py"]

步骤2:替换代码中的docx2pdf调用

用subprocess调用LibreOffice命令行完成转换:

import subprocess
import os

def docx_to_pdf(docx_input_path, pdf_output_path):
    # 构建LibreOffice转换命令
    convert_cmd = [
        "libreoffice",
        "--headless",  # 无头模式,禁用GUI
        "--convert-to", "pdf",
        "--outdir", os.path.dirname(pdf_output_path),
        docx_input_path
    ]
    # 执行转换,check=True会在命令失败时抛出异常
    subprocess.run(convert_cmd, check=True)

# 调用示例
docx_to_pdf("sample.docx", "sample.pdf")

方案2:使用Windows基础镜像(不推荐)

如果必须依赖docx2pdf原有逻辑,可以使用Windows容器镜像,但存在镜像体积大、Word授权复杂等问题:

步骤1:切换Docker Desktop到Windows容器模式

在Docker Desktop设置中切换到Windows容器(需重启Docker)。

步骤2:编写Windows版Dockerfile

FROM python:3.10-windowsservercore-ltsc2022

# 用Chocolatey安装Office 365(注意授权合规)
RUN powershell -Command \
    Set-ExecutionPolicy Bypass -Scope Process -Force; \
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \
    iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
RUN choco install -y office365proplus --accept-license

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["streamlit", "run", "your_app.py"]

方案3:python-docx + pdfkit(适合简单文档)

对于格式简单的docx文件,可以用python-docx读取内容生成HTML,再用pdfkit转PDF,但对复杂格式(图片、表格、样式)支持有限:

步骤1:修改Dockerfile

安装wkhtmltopdf依赖:

FROM python:3.10-slim

RUN apt-get update && \
    apt-get install -y --no-install-recommends wkhtmltopdf && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt python-docx pdfkit

COPY . .

CMD ["streamlit", "run", "your_app.py"]

步骤2:代码实现

from docx import Document
import pdfkit

def docx_to_pdf(docx_path, pdf_path):
    doc = Document(docx_path)
    html_content = "<html><body>"
    # 遍历文档段落生成HTML
    for para in doc.paragraphs:
        html_content += f"<p>{para.text}</p>"
    # 复杂元素(表格、图片)需额外处理
    html_content += "</body></html>"
    pdfkit.from_string(html_content, pdf_path)

内容的提问来源于stack exchange,提问作者user23590571

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:05:21