Files
report_viewer/PDF生成环境说明.md
2025-11-17 12:49:59 +08:00

6.9 KiB
Raw Permalink Blame History

PDF 生成环境说明文档

📋 概述

本项目使用 Python 脚本将 JSON 数据转换为 PDF 报告。主要依赖 WeasyPrint 库进行 HTML 到 PDF 的转换。

🔧 环境要求

Python 版本

  • Python 3.8+ (推荐 Python 3.9 或更高版本)
  • 支持 Windows、Linux、macOS

系统依赖

Windows

  • 需要安装 GTK+ 运行时库WeasyPrint 的必需依赖)
  • 推荐使用 Conda 环境(自动处理依赖)

Linux

  • 需要安装系统级字体库和 GTK+ 相关库
  • Ubuntu/Debian: sudo apt-get install python3-dev python3-pip python3-cffi libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info
  • CentOS/RHEL: sudo yum install python3-devel python3-pip cairo pango gdk-pixbuf2 libffi

macOS

  • 需要安装 GTK+ 和相关库
  • 推荐使用 Homebrew: brew install cairo pango gdk-pixbuf libffi

📦 Python 依赖包

项目依赖以下 Python 包(见 requirements.txt

包名 版本要求 说明
jinja2 >=3.1.2 HTML 模板引擎,用于渲染报告模板
weasyprint >=60.0 PDF 生成库,将 HTML 转换为 PDF

🚀 安装步骤

方法一:使用 Conda推荐Windows 用户首选)

Conda 会自动处理所有系统依赖,包括 GTK+ 运行时库。

# 1. 创建 Conda 环境(可选)
conda create -n pdf-generator python=3.9
conda activate pdf-generator

# 2. 安装 WeasyPrint自动安装所有依赖
conda install -c conda-forge weasyprint

# 3. 安装其他依赖
pip install jinja2

方法二:使用 pip + 手动安装系统依赖

Windows

  1. 安装 GTK+ 运行时库

  2. 安装 Python 依赖

    pip install -r requirements.txt
    
  3. 重启终端(重要!让 PATH 生效)

Linux

# 1. 安装系统依赖Ubuntu/Debian 示例)
sudo apt-get update
sudo apt-get install python3-dev python3-pip python3-cffi \
    libcairo2 libpango-1.0-0 libpangocairo-1.0-0 \
    libgdk-pixbuf2.0-0 libffi-dev shared-mime-info

# 2. 安装 Python 依赖
pip install -r requirements.txt

macOS

# 1. 安装系统依赖(使用 Homebrew
brew install cairo pango gdk-pixbuf libffi

# 2. 安装 Python 依赖
pip install -r requirements.txt

方法三:使用虚拟环境(推荐用于生产环境)

# 1. 创建虚拟环境
python -m venv venv

# 2. 激活虚拟环境
# Windows:
venv\Scripts\activate
# Linux/macOS:
source venv/bin/activate

# 3. 安装依赖
pip install -r requirements.txt

验证安装

运行以下命令验证环境是否正确配置:

python -c "from weasyprint import HTML; print('WeasyPrint 安装成功!')"

如果出现错误,请参考下面的"常见问题"部分。

📝 使用方法

基本用法

python generate_pdf.py <数据文件> [输出文件]

示例

# 使用示例数据生成 PDF
python generate_pdf.py public/example.json output.pdf

# 指定输出文件名(默认为 report.pdf
python generate_pdf.py public/example.json my_report.pdf

数据文件格式

  • 支持 JSON 格式文件
  • 文件应包含 DWBG8B4DCDWBG8B4D 的谛听报告数据
  • 可选包含 FLXG7E8FFLXG0V4B 的司法涉诉数据

🐛 常见问题

问题 1: OSError: cannot load library 'libgobject-2.0-0'

原因Windows 系统缺少 GTK+ 运行时库。

解决方案

  1. 推荐:使用 Conda 安装 WeasyPrint

    conda install -c conda-forge weasyprint
    
  2. :手动安装 GTK+ 运行时库

问题 2: ImportError: No module named 'weasyprint'

原因WeasyPrint 未安装或不在当前 Python 环境中。

解决方案

pip install weasyprint
# 或使用 Conda
conda install -c conda-forge weasyprint

问题 3: ImportError: No module named 'jinja2'

原因Jinja2 模板引擎未安装。

解决方案

pip install jinja2

问题 4: 生成的 PDF 中文显示为方块

原因:系统缺少中文字体。

解决方案

  • Windows:系统自带中文字体,通常无需额外配置
  • Linux:安装中文字体
    sudo apt-get install fonts-wqy-microhei fonts-wqy-zenhei
    
  • macOS:系统自带中文字体

问题 5: Conda 安装 WeasyPrint 时卡住或报错

原因Conda 依赖解析时间过长或网络问题。

解决方案

  1. 更新 Conda

    conda update conda
    
  2. 使用国内镜像源(如果在中国):

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
    conda config --add channels conda-forge
    
  3. 或使用 pip + GTK+ 运行时库的方式

问题 6: 权限错误Linux/macOS

原因:没有权限安装系统依赖。

解决方案

# 使用 sudo 安装系统依赖
sudo apt-get install ...  # Ubuntu/Debian
sudo yum install ...      # CentOS/RHEL

🔍 环境检查清单

在开始使用前,请确认:

  • Python 版本 >= 3.8
  • WeasyPrint 已正确安装
  • Jinja2 已正确安装
  • WindowsGTK+ 运行时库已安装并添加到 PATH
  • Linux/macOS系统依赖已安装
  • 可以成功导入 WeasyPrintpython -c "from weasyprint import HTML"

📚 相关资源

💡 最佳实践

  1. 使用虚拟环境:避免污染系统 Python 环境
  2. Windows 用户优先使用 Conda:自动处理所有依赖,最简单
  3. 定期更新依赖pip install --upgrade weasyprint jinja2
  4. 测试环境:在生成大量 PDF 前,先用示例数据测试

🔄 更新依赖

# 更新所有依赖
pip install --upgrade -r requirements.txt

# 或单独更新
pip install --upgrade weasyprint jinja2

📞 技术支持

如果遇到问题:

  1. 检查 Python 版本:python --version
  2. 检查已安装的包:pip list | grep -E "weasyprint|jinja2"
  3. 查看错误信息:运行 python generate_pdf.py 查看详细错误
  4. 验证环境:运行 python -c "from weasyprint import HTML; print('OK')"

最后更新2025-01-20