如何将pd.DataFrame导出为PDF并保留其在ipynb中的显示格式?
解决DataFrame导出PDF及nbconvert Pandoc问题的方案
一、修复nbconvert的Pandoc缺失问题
- 不要仅通过
pip install pandoc安装,这只是Python包装器,必须安装系统级的Pandoc:- Debian/Ubuntu系服务器:执行
sudo apt update && sudo apt install pandoc - RHEL/CentOS系服务器:执行
sudo yum install pandoc - 安装完成后,运行
pandoc --version确认路径已加入系统环境变量,远程SSH会话可能需要重新登录生效
- Debian/Ubuntu系服务器:执行
- 如果仍有问题,可在代码中指定Pandoc的绝对路径:
from nbconvert.utils.pandoc import get_pandoc_path import os os.environ['PANDOC_PATH'] = '/usr/bin/pandoc' # 替换为你的pandoc实际路径
二、替代HTML+WeasyPrint的DataFrame导出方案
1. 使用Matplotlib直接生成表格PDF
利用matplotlib的table组件渲染DataFrame,保留基础格式:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) # 初始化画布,关闭坐标轴 fig, ax = plt.subplots(figsize=(8, 2)) ax.axis('off') # 生成表格并调整样式 table = ax.table(cellText=df.values, colLabels=df.columns, loc='center', cellLoc='center') table.auto_set_font_size(False) table.set_fontsize(10) table.scale(1.2, 1.2) # 保存为PDF with PdfPages('df_output.pdf') as pdf: pdf.savefig(fig, bbox_inches='tight') plt.close()
2. 使用ReportLab生成结构化PDF
ReportLab支持精细的表格格式控制,适合复杂DataFrame:
from reportlab.lib import colors from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Table, TableStyle import pandas as pd df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) # 转换为ReportLab可识别的格式 data = [df.columns.tolist()] + df.values.tolist() doc = SimpleDocTemplate('df_report.pdf', pagesize=letter) table = Table(data) # 添加自定义样式:表头高亮、边框对齐等 style = TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.grey), ('TEXTCOLOR', (0,0), (-1,0), colors.whitesmoke), ('ALIGN', (0,0), (-1,-1), 'CENTER'), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('BOTTOMPADDING', (0,0), (-1,0), 12), ('BACKGROUND', (0,1), (-1,-1), colors.beige), ('GRID', (0,0), (-1,-1), 1, colors.black) ]) table.setStyle(style) doc.build([table])
3. 修复WeasyPrint的远程环境问题
如果坚持用HTML方案,远程服务器需要安装WeasyPrint依赖的系统库:
- Debian/Ubuntu:
sudo apt install libpango-1.0-0 libpangoft2-1.0-0 libcairo2 libgdk-pixbuf2.0-0 - RHEL/CentOS:
sudo yum install pango cairo gdk-pixbuf2
安装后重新尝试渲染:
import pandas as pd from weasyprint import HTML df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) html = df.to_html(classes='table table-striped') HTML(string=html).write_pdf('df_html.pdf', stylesheets=['https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css'])
三、远程SSH环境注意事项
- 所有图形相关的导出(如matplotlib)需提前设置无界面后端:
import matplotlib matplotlib.use('Agg') - 若无sudo权限安装系统依赖,可尝试用conda安装Pandoc及相关库:
conda install pandoc
内容的提问来源于stack exchange,提问作者user23306196
相关产品推荐
相关产品推荐

