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

如何将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会话可能需要重新登录生效
  • 如果仍有问题,可在代码中指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:06:13