gpt4 book ai didi

python - 在 docker (FastAPI) 中使用 Wea​​syPrint 导出的 PDF 中的字体

转载 作者:行者123 更新时间:2023-12-04 17:15:16 25 4
gpt4 key购买 nike

我有一个在 docker 容器中运行的应用程序。该服务是使用 FastAPI 框架编写的,用于生成报告。我们首先生成一个 HTML 报告,然后使用 Wea​​syprint 库将其转换为 PDF。当我在我的笔记本电脑上执行它时(我使用的是 Manjaro Linux),一切正常。但是,当我在 docker 容器中使用 API 时,我注意到生成的 PDF 中的字体不同。在 CSS 文件中,我们使用字体系列 Helvetica,sans-serif。因此,当在容器内生成报告时,无衬线字体不起作用。

此外,我已经将我的字体文件夹(从我的笔记本电脑)复制到 docker 容器中,以检查它是否缺少某些字体;然而,sans-serif 仍然不起作用。

这是我的 Dockerfile:

FROM tiangolo/uvicorn-gunicorn-fastapi

RUN apt-get update && apt-get install -y build-essential unzip vim git curl locales orca
RUN apt install -y python3-cffi libcairo2 libcairo2-dev libpango-1.0-0 libpango1.0-dev libpangocairo-1.0-0 libgdk-pixbuf2.0-0 \
libgdk-pixbuf2.0-dev libffi-dev shared-mime-info libffi-dev fonts-font-awesome

RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

ARG RELEASE=main
RUN git clone <my_repo>
RUN cd ./<repo> && pip install -r requirements.txt

EXPOSE 80
WORKDIR /app/<repo>/app

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "80", "--workers", "4"]

以及我安装的 python 库(在 requirements.txt 中):

numpy==1.20.3
pandas==1.2.4
plotly==4.14.3
kaleido==0.2.1
weasyprint==52.5
Jinja2==3.0.1
fastapi==0.65.2
uvicorn==0.14.0
pydantic==1.8.2
psutil==5.8.0
python-multipart==0.0.5
aiofiles==0.7.0
SQLAlchemy==1.4.22
async-exit-stack==1.0.1
async-generator==1.10
mysqlclient==2.0.3

因为我可以在我的笔记本电脑上很好地生成它,我假设缺少某些库(我也尝试安装 fonts-open-sans 和 libglib2.0-dev,但没有任何改变)或者有某个版本的问题。比如我查了WeasyPrint的文档,pango应该是1.44.0以上的版本,而在Debian 10(也就是docker中的操作系统)里libpango-1.0-0包使用的是pango 1.42.0版本。这可能是为什么 sans-serif 不起作用的问题,或者关于我缺少什么的任何想法?

最佳答案

好的,我为你做了一些工作;)

我使用以下方法构建镜像并启动 docker 容器:

FROM tiangolo/uvicorn-gunicorn-fastapi

RUN apt-get update && apt-get install -y build-essential unzip vim git curl locales orca
RUN apt install -y python3-cffi libcairo2 libcairo2-dev libpango-1.0-0 libpango1.0-dev libpangocairo-1.0-0 libgdk-pixbuf2.0-0 \
libgdk-pixbuf2.0-dev libffi-dev shared-mime-info libffi-dev fonts-font-awesome

RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

COPY app.py .
COPY template .
COPY requirements.txt .
RUN pip install -r requirements.txt

EXPOSE 80

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "80", "--workers", "4"]

其中requirements.txt和你的一样,template是直接从here复制过来的.

app.py

from fastapi import FastAPI
from fastapi.responses import HTMLResponse, Response
from weasyprint import HTML


app = FastAPI(title="name")

@app.get("/", response_class=HTMLResponse)
async def read_root():
with open('template', 'r') as f:
contents = f.read()

return contents

@app.get("/pdf")
async def read_root_pdf():
with open('template', 'r') as f:
contents = f.read()

pdf_content = HTML(string=contents).write_pdf()

return Response(content=pdf_content, media_type="application/pdf")

if __name__ == "__main__":
import uvicorn
uvicorn.run('app:app', host="0.0.0.0", port=80)

正如您在下面看到的(我将 pdf 重命名为 png 以便能够附加)所有字体都不同。这在你的容器中没有问题。

enter image description here

关于python - 在 docker (FastAPI) 中使用 Wea​​syPrint 导出的 PDF 中的字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68832433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com