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

如何在Streamlit中将Markdown文本转换并下载为PDF报告?

问题原因及解决方案

问题原因

你直接把带HTML标签的Markdown纯文本传给st.download_button,仅修改了文件名后缀为.pdf,但文件本质还是纯文本,不符合PDF的二进制格式规范,所以打开时会提示损坏。PDF是结构化的二进制文件,需要专门工具将文本/HTML内容转换为符合规范的PDF字节流,不能直接重命名文本文件为PDF。

解决方案

需要先将HTML/Markdown内容转换为PDF格式的字节流,再传给st.download_button的data参数。以下是两种可行的实现方式:

方式一:使用WeasyPrint(纯Python依赖,无需额外系统二进制)

  1. 安装依赖:
pip install weasyprint
  1. 完整代码:
import streamlit as st
from weasyprint import HTML

st_md = '''
<b>compare mongodb to other no sql databases</b><br><br><b>Uploaded Files: </b>[]<br><br> Here is a comparison of MongoDB to some other major NoSQL databases:

- MongoDB is a document database. It stores data in flexible JSON-like documents rather than rows and columns like an RDBMS. Other document databases include CouchDB and Amazon DocumentDB.


In summary, MongoDB strikes a balance between the flexibility of document storage, rich functionality like secondary indexes and aggregations, and scalability via horizontal sharding that makes it a popular choice among many NoSQL databases today.<br><br><b>advantages and disadvantages of mongodb to other no sql ds</b><br><br><b>Uploaded Files: </b>[]<br><br> Here are some key advantages and disadvantages of MongoDB compared to other NoSQL databases:

Advantages:

- Flexible data model using documents to represent objects with dynamic schemas. More flexible than columnar databases that require predefined schemas.

- Index on any attribute for faster queries and retrieval compared to key-value stores.


Disadvantages:

- Less ACID compliance and transactions than traditional SQL databases.

- No declarative query language like SQL. Query syntax can be complex for some use cases.

So in summary, MongoDB provides a flexible document data model with rich functionality leading to faster reads and more expressiveness compared to simple key-value stores, but lacks some features database specialists may require. Scaling and performance is generally easier than traditional SQL databases.<br><br>
'''

# 将HTML内容转换为PDF字节流
pdf_bytes = HTML(string=st_md).write_pdf()

st.download_button(
    label="Download data as pdf",
    data=pdf_bytes,
    file_name='test.pdf',
    mime='application/pdf'  # 指定MIME类型,确保浏览器正确识别
)

方式二:使用pdfkit(需额外安装wkhtmltopdf)

  1. 安装依赖:
pip install pdfkit
  • 系统依赖安装:
    • Ubuntu/Debian:sudo apt-get install wkhtmltopdf
    • Windows:从官方渠道下载wkhtmltopdf安装包并添加到系统PATH
  1. 完整代码:
import streamlit as st
import pdfkit

st_md = '''
<b>compare mongodb to other no sql databases</b><br><br><b>Uploaded Files: </b>[]<br><br> Here is a comparison of MongoDB to some other major NoSQL databases:

- MongoDB is a document database. It stores data in flexible JSON-like documents rather than rows and columns like an RDBMS. Other document databases include CouchDB and Amazon DocumentDB.


In summary, MongoDB strikes a balance between the flexibility of document storage, rich functionality like secondary indexes and aggregations, and scalability via horizontal sharding that makes it a popular choice among many NoSQL databases today.<br><br><b>advantages and disadvantages of mongodb to other no sql ds</b><br><br><b>Uploaded Files: </b>[]<br><br> Here are some key advantages and disadvantages of MongoDB compared to other NoSQL databases:

Advantages:

- Flexible data model using documents to represent objects with dynamic schemas. More flexible than columnar databases that require predefined schemas.

- Index on any attribute for faster queries and retrieval compared to key-value stores.


Disadvantages:

- Less ACID compliance and transactions than traditional SQL databases.

- No declarative query language like SQL. Query syntax can be complex for some use cases.

So in summary, MongoDB provides a flexible document data model with rich functionality leading to faster reads and more expressiveness compared to simple key-value stores, but lacks some features database specialists may require. Scaling and performance is generally easier than traditional SQL databases.<br><br>
'''

# 转换HTML为PDF字节流(False表示返回字节流而非保存到文件)
pdf_bytes = pdfkit.from_string(st_md, False)

st.download_button(
    label="Download data as pdf",
    data=pdf_bytes,
    file_name='test.pdf',
    mime='application/pdf'
)

注意事项

  • 必须将文本内容转换为PDF格式的二进制字节流,不能直接传递纯文本
  • 指定mime='application/pdf'可帮助浏览器正确识别文件类型,避免下载异常
  • 不同转换库对HTML/CSS的支持有差异,若内容包含复杂样式,可能需要调整HTML代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:30:19