首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用WeasyPrint inside docker (FastAPI)导出的PDF中的字体

WeasyPrint 是一个用于将 HTML 转换为 PDF 的 Python 库,它依赖于 WebKit 渲染引擎。在使用 WeasyPrint 在 Docker 容器中通过 FastAPI 导出 PDF 时,可能会遇到字体问题,因为容器内部可能没有安装所需的字体,或者字体路径没有被正确配置。

基础概念

  • WeasyPrint: 一个 Python 库,用于将 HTML 和 CSS 转换为 PDF 文档。
  • Docker: 一种容器化平台,用于自动化应用程序的部署。
  • FastAPI: 一个现代、快速(高性能)的 web 框架,用于构建 API。

相关优势

  • WeasyPrint: 支持复杂的 CSS 样式,能够生成高质量的 PDF 文件。
  • Docker: 提供一致的运行环境,简化了应用程序的部署和管理。
  • FastAPI: 高性能,自动生成交互式 API 文档。

类型与应用场景

  • 类型: WeasyPrint 主要用于 HTML 到 PDF 的转换。
  • 应用场景: 报告生成、电子发票、合同文档等需要将网页内容转换为 PDF 的场合。

遇到的问题及原因

在使用 WeasyPrint 时,可能会遇到字体缺失的问题,这通常是因为 Docker 容器内部没有安装相应的字体,或者 WeasyPrint 无法找到这些字体文件。

解决方法

  1. 安装字体: 在 Dockerfile 中安装所需的字体。例如,如果你需要 Arial 字体,可以在 Dockerfile 中添加以下命令:
  2. 安装字体: 在 Dockerfile 中安装所需的字体。例如,如果你需要 Arial 字体,可以在 Dockerfile 中添加以下命令:
  3. 复制字体到容器: 将所需的字体文件复制到 Docker 容器中的适当位置。例如:
  4. 复制字体到容器: 将所需的字体文件复制到 Docker 容器中的适当位置。例如:
  5. 配置 WeasyPrint 字体路径: 在代码中指定字体路径,确保 WeasyPrint 能够找到并使用这些字体。例如:
  6. 配置 WeasyPrint 字体路径: 在代码中指定字体路径,确保 WeasyPrint 能够找到并使用这些字体。例如:

示例代码

以下是一个完整的 FastAPI 应用示例,它使用 WeasyPrint 在 Docker 容器中导出 PDF,并确保字体正确加载:

代码语言:txt
复制
from fastapi import FastAPI
from weasyprint import HTML, CSS
import os

app = FastAPI()

@app.get("/export-pdf")
async def export_pdf():
    css = CSS(string='''
        @font-face {
            font-family: 'MyFont';
            src: url('/usr/share/fonts/truetype/my_fonts/MyFont.ttf');
        }
        body {
            font-family: 'MyFont', sans-serif;
        }
    ''')

    html_content = '''
    <html>
    <head><title>Sample PDF</title></head>
    <body>
        <h1>Hello, World!</h1>
        <p>This is a sample PDF generated with WeasyPrint.</p>
    </body>
    </html>
    '''

    HTML(string=html_content).write_pdf('output.pdf', stylesheets=[css])
    
    # Return the PDF file as a response
    return FileResponse('output.pdf', media_type='application/pdf')

确保在 Dockerfile 中安装了字体,并且字体文件路径正确无误。

通过以上步骤,你应该能够在 Docker 容器中使用 WeasyPrint 导出包含自定义字体的 PDF 文件。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

InDesign转曲字体 导出PDF的技巧

在编辑部担任美术编辑的时候, 我遇到了很意思的问题, 一些拥有漂亮曲线的字体, 是无法被InDesign直接输出的, 只有将字体通过ctrl+shift+o"转曲"后,才能完美输出, 然而更有意思的是,...字体转曲后, 就变得无法修改......从一个程序员的角度, InDesign这种蛋疼的设定, 自然是无法接受的, 懒人的直觉告诉我, 一定有批量转曲的方法, 类似编程中的"中间件", 完成作品时, 将作品一键"转曲"输出为PDF 经过我的一顿查找...使用预设 导出 文件->导出 选择文件导出位置 高级-> 兼容性Acrobat 4(PDF 1.3)-> 透明度拼合预设zhaoolee -> 导出 导出完成 总结 懒是第一生产力....还是专业呢~ 放一张, 我花费1个多小时,使用InDesign完成的, 毕业季画册初稿截图 这年头, 不懂点设计, 都不敢说自己是程序猿...

1.8K60

Docker 中 MySQL 数据的导入导出

服务器在使用了 Docker 后,对于备份和恢复数据库的事情做下记录: 由于 docker 不是实体,所以要把mysql的数据库导出到物理机上,命令如下: 1:查看下 mysql 运行名称 #docker... 2:备份docker数据库 由第一步的结果可知,我们的 mysql 运行在一个叫 mysql_server 的 docker 容器中。而我们要备份的数据库就在里面,叫做 test_db。...mysql 的用户名密码均为root,我们将文件备份到/opt/sql_bak文件夹下。.../test_db.sql【导出表格路径】 3:导入docker数据库 方法1: 先将文件导入到容器 #docker cp **.sql 【容器名】:/root/ 进入容器 #docker exec -ti...【容器名/ID】sh 将文件导入数据库 # mysql -uroot -p 【数据库名】 < ***.sql 方法2: docker exec -i mysql_server【docker容器名称/

4.4K30
  • 使用python找到PDF文件的文本位置、字体大小、字体名称和字体颜色

    看了https://cloud.tencent.com/developer/ask/sof/1162044,需要获得pdf文件的段落的字体大小。...正好在做这方面的工作,还是使用fitz,就可以获得字体的大小具体思路是:现将pdf转换成html,在使用bs4解析html具体代码如下:pdf2html:将pdf转换成html,这一步在转换时,有时会丢失一些字体信息...pdf2list:调用pdf2html现将pdf转换成html,在使用BeautifulSoup对html进行解析。...节点,并读取取style属性,主要包括字体名称、字体大小、字体颜色,是否加粗pdf2html没有提取到。...,则删除,在增加,保持最后的是字体的样子,后续判断要用到字体大小 pspansstyles.remove(pspansstyle)

    3.3K40

    【docker】PDF编辑、使用神器 | Stirling-PDF的部署与使用

    本文发布于150天前,最后更新于139天前,其中的信息可能有所发展或是发生改变。 1. 简介 有的时候我们需要编辑PDF,但不得不说能处理PDF文件的软件真的很少。...相关项目: OCRmyPDF:Stirling-PDF使用OCRmyPDF进行文字识别,而OCRmyPDF又使用tesseract进行文本识别。 Tesseract OCR:支持不同语言的识别。...下载简体中文的训练识别包: cd /root/data/docker_data/pdf/data/trainingData && wget https://github.com/tesseract-ocr...docker】Nginx Proxy Manager 的使用 5....使用 访问你的域名或者是IP:18996就可以进入编辑器(工具箱)了: 可以修改默认语言,这里直接就可以选简体中文 选择完毕,拥有中文界面~(不用管右下角那个蓝色的东西,那是夜梦上传图片用的小软件) 啥都能干

    66710

    Lyft费用报告导出功能的SSRF漏洞分析

    比如,出于测试目的,我打车到机场后,在Lyft应用中的“行程历史”(Ride History)下的行程信息窗口标识中,我输入了一个HTML标记(test),之后,对应地它会提示我可以导出消费报告。...PDF报告,就能从Lyft应用中获取到报告生成服务端的User-Agent信息,其中包含了WeasyPrint服务,如下: ?...WeasyPrint WeasyPrint 是一个开源的智能WEB报告生成服务,用它可以方便地在WEB应用中制作生成PDF报告,它能把简单的HTML标记转变成华丽的**、票据、统计报告等,用户在相应的HTML...模板或URL链接中填写好要求的字段后就能自动生成PDF报告,如用以下命令就能把一个填写好的HTML模板生成PDF报告: $> weasyprint input.html output.pdf 所以,接下来我们就把研究点放到了...我们把上述脚本结合Lyft的PDF生成机制设置了一个包含Payload的行程记录,在导出PDF报告的过程中,触发了其中的SSRF利用,获取到了相应的用户信息,确认了漏洞的存在,如下: ?

    1K30

    PHP替换Word中变量并导出PDF图片的实现方法

    aa.docx 的文档,里面放了一个变量信息 3、接下来使用 php 来替换这个变量信息 代码如下 ......_网络运维技术】 /我们需要处理 word 文档转为 pdf 我也在网上了查了比较多的资料,什么先转为 html 然后通过 其它包的方式或者扩展来转 pdf 确实都能实现,但是有一点 word 转为 html...的时候格式会丢失这就和我们的需求有点偏离,后面转换了方向,使用工具来把 word 转为 pdf 这里我推荐的工具为 unoconv 安装方式如下 apt-get install unoconv unoconv...-f pdf aa.docx 5、pdf 生成出来中文乱码解决方案,安装一个中文字体 # 把电脑本机的宋体上传到服务器字体目录下 /usr/share/fonts 新建一个目录 win 或者其它,把中文字体上传到该目录下...reboot # 最后在执行 unoconv -f pdf aa.docx # 看是不是中文乱码的问题解决了 6、使用 php 的执行 shell 的函数来调用该函数自动生成即可 shell_exec

    2.8K00

    使用pdfminer提取PDF文件中的文字

    和word文档一样,pdf文件也拥有强大的排版功能。...对于pdf的编程操作而言,分为读和写两大类,其中读是相对简单的一种,比如读出pdf文件中的文字,写是比较难的,除了文字,图片等基本元素,最重要的是排版的样式控制,而编程还无法满足样式的灵活性。...本文主要介绍pdf读取操作中的一种应用,从PDF文件中提取文字,可以通过pdfminer模块来实现,安装方式如下 pip install pdfminer 该模块同时还提供了一种,命令行的脚本程序,可以方便的提取...pdf中的文字,用法如下 python pdf2txt.py input.pdf 如果提取出文字之后,需要进一步操作,最好还是通过脚本对程序进行处理,在脚本中实现文字提取的代码如下 >>> from pdfminer.pdfinterp...,比如将提取出的文字, 利用python-docx模块输入到word文档中,从而实现pdf到word文档的转换,也可以提取pdf中的表格文字,写入到excel中。

    5.4K10

    使用 webfontloader 优化加载字体在网页中的显示体验

    继上篇文章网页字体文件最后再加载实现方法,后写的一篇优化加载字体在网页中的显示体验。...上一篇文章的第一种方法,我在使用后,发现网页主体中的文字显示会延迟一段时间再加载,于是为了改进,又上网搜索相关内容,得出了本篇文章,优化方案。...现在说说第三种方式,也是最近在使用的一种方式,我个人比较偏向第三种,使用webfontloader.js实现。...,否则就先使用默认字体,这样就可以在不影响用户阅读的情况下也可以加载字体,用户体验相对较好。...}, inactive: function() { // 字体加载失败后执行的回调函数 } }); 一个项目中的使用示例: 将样式创建好,然后使用webfontloader进行监听加载

    73430

    Docker学习笔记之使用 Docker Hub 中的镜像

    0x00 概述 自己编写 Dockerfile 能够很好的实现我们想要的程序运行环境,不过如果装有我们想要环境的镜像已经由热心的开发者构建好并共享在 Docker Hub 上,直接使用它们就会远比自己编写...事实上,在开发过程中我们用到的镜像大部分还是直接采用 Docker Hub 中已经存在的镜像的,即使自己编写 Dockerfile,也只是对已有镜像进行简单的改动,很少会从零开始搭建镜像。...在这一节中,我们要来看看如何更好地使用 Docker Hub 上由其他开发者共享的镜像。...装有这些程序的镜像我们都可以很容易的在 Docker Hub 上找到并直接使用,但在我们使用前,光选择镜像还是不够的,我们还得根据需要选择对应程序版本的镜像。...在 Docker Hub 中并不直接存放我们用于构建的 Dockerfile 和相关文件,我们必须将 Docker Hub 账号授权到 GitHub 或是 Bitbucket 来从这些代码库中获取 Dockerfile

    1.1K60

    Web应用程序如何创建 PDF

    之前的文章《用CSS设计打印格式》中概述了这个规范,许多图书出版商在他们所有的打印输出中都使用了CSS。因此,CSS本身就有打印材料的规格,我们当然应该能够使用它?...可以将一些标志传递到wkhtmltopdf中,以便使用分页媒体规范在缺省情况下添加一些缺失的特性。然而,这确实需要一些额外的工作,除了写好的 HTML 和CSS。...有一些选项可以传递到page.pdf()函数中。与wkhtmltopdf一样,如果有浏览器支持,添加了一些CSS 提供的功能。...当将页面发送到正在使用的工具时,通常会使用一个用于打印的特定样式表。与常规打印样式表一样,我在站点上使用的CSS并不都适合PDF版本。...为这些工具创建样式表与创建常规打印样式表非常相似,可能使用不同的字体大小或颜色来决定显示或隐藏什么。

    2.8K30

    使用EF操作Docker中的MySQL实例

    因为我的服务器配置较低,而SqlServer在docker中的实例,服务器的运行内存应当保持在2G+,我没有这个条件,它会爆出这样的错误 sqlservr: This program requires...当然我们首先也应当在docker中安装mysql容器,我们首先可以通过 docker search mysql 来查询关键字的镜像。...NAME:镜像仓库源的名称、DESCRIPTION:镜像的描述、OFFICIAL:是否docker官方发布..如果要看实际的version,则就可以去https://hub.docker.com/ 中找找了...通过root账号登录mysql服务,然后它让你输入密码,这个场景下应该是123456,如果没问题的话就进去了mysql开头的tag中。...随后我们创建一个.NET Core工程,添加EF关于MySql的相关包,这里我遇到了一个问题,在我使用 MySql.Data.EntityFrameworkCore 实体移植的时候爆出下面的错误,目前还不知道是什么原因

    78510

    使用 docker-compose 在 Docker 中启动带密码的 Redis

    前言 在服务器上使用 docker-compose 启动一个 Docker 中的 Redis 时,配置文件没有生效,Redis 没有加密码,导致 redis 中被写入两条记录: */3 * * * *...解决过程 方案一 在 docker-compose.yml 文件中写入下列内容: redis: image: redis container_name: my_redis command:...Redis 的密码需要自己在与容器共享的配置 redis.conf 中加入,即更改配置中 requirepass 为: requirepass yourpassword 在 docker-compose.yml...方案二 同样在 docker-compose.yml 中写入下列内容: redis: image: redis container_name: my_redis command: redis-server...总结 方案一的好处是可以更多的定制 Redis 的配置,方案二的好处是可以快速启动一个带免密的 Docker Redis 实例而不需要依赖外部的 redis.conf。

    24.8K1714

    项目A使用httpclient调用项目B中的POI导出excel

    缕清楚需求后,我首先想到的是使用多数据源的切换,但是表结构和一些其他业务上的原因并不能完全行的通。...由于项目中都是使用前后端分离做的开发,所以我想到的是直接使用拦截器,首先所有的请求都是发送到总后台,总后台根据带过来的参数判断是发往那个子后台的请求,然后去子后台发起请求。...所以这里在总后台上加上了一个拦截器,用于拦截所有的请求,然后做出判断,使用httpclient工具,将请求发送到对应的子后台,得到数据后,返回到response中,实现需求。...那就是系统中还存在部分excel导出功能,都是使用poi做实现的。由于poi中自动实现了对于response和输出流的处理,使用上面的方式是没有办法实现的。...那么我使用httpclient如何调用另一个系统写好的poi导出功能呢。 我们先看一下子系统中poi的实现方式。

    52820

    如何使用FTP中的模板文件和EasyPOI来导出Excle?

    问题描述 因工作需要导出Excel文件,使用技术为EasyPOI,EasyPOI是一个非常好的导出文件工具,官网提供非常详细的使用文档,在项目中使用EasyPOI的模板导出功能,官方提供的示例代码中,模板的路径都是本地...,我使用时也是把Excle模板文件放在本地,因为之前需要导出的地方,不是很多,模板文件放在本地也没有太大问题,但是由于现在需求变更,会有大量的模板需要导出,如果放在本地会造成项目容量变大。...现在想把导出的模板保存在远程的FTP服务中,EasyPOI读取FTP的中模板文件生成Excle文件。...2、创建测试项目 创建一个SpringBoot项目,POM文件中引入需要的Jar包,如下 cn.hutool 中的模板文件就可以实现,不用重新部署项目。

    1.4K00

    如何使用FTP中的模板文件和EasyPOI来导出Excle

    问题描述 因工作需要导出Excel文件,使用技术为EasyPOI,EasyPOI是一个非常好的导出文件工具,官网提供非常详细的使用文档,在项目中使用EasyPOI的模板导出功能,官方提供的示例代码中,模板的路径都是本地...,我使用时也是把Excle模板文件放在本地,因为之前需要导出的地方,不是很多,模板文件放在本地也没有太大问题,但是由于现在需求变更,会有大量的模板需要导出,如果放在本地会造成项目容量变大。...现在想把导出的模板保存在远程的FTP服务中,EasyPOI读取FTP的中模板文件生成Excle文件。...4、需要根据模板导出的地方,使用上面的方法,如下 ? 5、运行代码,生成的文件如下 ?...总结 EasyPOI不提供读取远程模板文件,但是我们可以通过其它方法来实现,下次导出Excle有格式样式改变,我们可以直接调整FTP中的模板文件就可以实现,不用重新部署项目。

    1.4K10

    用python解析pdf中的文本与表格【pdfplumber的安装与使用】

    我们接触到的很多文档资料都是以pdf格式存在的,比如:论文,技术文档,标准文件,书籍等。pdf格式使得用机器从中提取信息格外困难。...为了解决这个问题,我找到了几种解决方案,最后选择了python上的pdfplumber库,安装和使用都相对比较方便,效果也还不错,所以下面介绍这个库的安装与使用。...pip install pdfplumber 不过本库还提供了图形Debug功能,可以获得PDF页面的截图,并且用方框框起识别到的文字或表格,帮助判断PDF的识别情况,并且进行配置的调整。...file.pdf") as pdf: first_page = pdf.pages[0] # 获取文本,直接得到字符串,包括了换行符【与PDF上的换行位置一致,而不是实际的“段落”】.../pdfplumber 图形展示 最后,附上官网的一个示例jupyter notebook,从这个例子中可以看到其图形展示的功能和更多的用法: src="https://nbviewer.jupyter.org

    4.8K10
    领券