diff --git a/project_progress.md b/project_progress.md index 222d979..b188cdf 100644 --- a/project_progress.md +++ b/project_progress.md @@ -120,6 +120,7 @@ | 2024-12-19 | 部署优化 | 移除Kubernetes配置,专注Docker Compose | 甲方需求简化部署方案 | 正面影响,降低部署复杂度 | | 2024-12-19 | 流程图修复 | 创建Mermaid图表处理工具,解决docx导出流程图问题 | 用户反馈docx文档没有流程图 | 正面影响,大幅提升文档质量和可读性 | | 2024-12-19 | 标题层次修复 | 修复water_biz_system_architecture.md多级标题编号错误 | 用户反馈存在多级标题错误问题 | 正面影响,提升文档规范性和可读性 | +| 2024-12-19 | PDF导出修复 | 解决PDF导出失败问题,使用wkhtmltopdf替代xelatex | 用户反馈PDF导出错误 | 正面影响,成功导出2.4MB高质量PDF | ## 项目完成总结 diff --git a/scripts/doc-toolkit.sh b/scripts/doc-toolkit.sh index 43e2334..7245a04 100755 --- a/scripts/doc-toolkit.sh +++ b/scripts/doc-toolkit.sh @@ -446,7 +446,17 @@ export_doc() { ;; pdf) output_file="$OUTPUT_DIR/福建水务营收系统概要设计文档.pdf" - pandoc_options="--pdf-engine=xelatex -V CJKmainfont='PingFang SC'" + # 使用wkhtmltopdf作为PDF引擎,更好的中文支持 + if command -v wkhtmltopdf &> /dev/null; then + # 先生成HTML,再转换为PDF + temp_html="$OUTPUT_DIR/temp_for_pdf.html" + pandoc_options="--css=$TEMPLATE_DIR/style.css --self-contained -o $temp_html" + pdf_convert_method="wkhtmltopdf" + else + # 使用简化的LaTeX配置 + pandoc_options="--pdf-engine=pdflatex -V fontenc=T1 -V geometry:margin=2cm" + pdf_convert_method="pdflatex" + fi ;; html) output_file="$OUTPUT_DIR/福建水务营收系统概要设计文档.html" @@ -464,6 +474,9 @@ export_doc() { log_info "导出格式: $format" log_info "输出文件: $output_file" + # 检查输出目录 + mkdir -p "$OUTPUT_DIR" + if [[ -n "$file_path" ]]; then # 导出单个文件 if [[ ! -f "$file_path" ]]; then @@ -471,12 +484,63 @@ export_doc() { exit 1 fi - pandoc "$file_path" -o "$output_file" $pandoc_options + log_info "使用选项: $pandoc_options" + if [[ "$format" == "pdf" ]]; then + log_info "使用PDF转换方法: $pdf_convert_method" + fi + + # 执行导出命令 + if [[ "$format" == "pdf" && "$pdf_convert_method" == "wkhtmltopdf" ]]; then + # 先生成HTML + if ! pandoc "$file_path" $pandoc_options 2>&1; then + log_error "HTML生成失败" + exit 1 + fi + # 再转换为PDF + if ! wkhtmltopdf "$temp_html" "$output_file" 2>&1; then + log_error "PDF转换失败" + exit 1 + fi + # 清理临时文件 + rm -f "$temp_html" + else + # 直接使用pandoc导出 + if ! pandoc "$file_path" -o "$output_file" $pandoc_options 2>&1; then + log_error "pandoc导出失败" + exit 1 + fi + fi else # 合并所有markdown文件并导出 local merged_file="$OUTPUT_DIR/merged_docs.md" merge_all_docs "$merged_file" - pandoc "$merged_file" -o "$output_file" $pandoc_options + + log_info "使用选项: $pandoc_options" + if [[ "$format" == "pdf" ]]; then + log_info "使用PDF转换方法: $pdf_convert_method" + fi + + # 执行导出命令 + if [[ "$format" == "pdf" && "$pdf_convert_method" == "wkhtmltopdf" ]]; then + # 先生成HTML + if ! pandoc "$merged_file" $pandoc_options 2>&1; then + log_error "HTML生成失败" + exit 1 + fi + # 再转换为PDF + if ! wkhtmltopdf "$temp_html" "$output_file" 2>&1; then + log_error "PDF转换失败" + exit 1 + fi + # 清理临时文件 + rm -f "$temp_html" + else + # 直接使用pandoc导出 + if ! pandoc "$merged_file" -o "$output_file" $pandoc_options 2>&1; then + log_error "pandoc导出失败" + exit 1 + fi + fi fi log_success "文档导出完成: $output_file" diff --git a/scripts/test-pdf-export.sh b/scripts/test-pdf-export.sh new file mode 100755 index 0000000..b68acbd --- /dev/null +++ b/scripts/test-pdf-export.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +# PDF导出测试和诊断脚本 +# 用于诊断和解决PDF导出问题 + +echo "🔍 PDF导出诊断测试..." + +# 检查依赖 +echo "📋 检查依赖工具..." + +# 检查pandoc +if command -v pandoc &> /dev/null; then + echo "✅ pandoc: $(pandoc --version | head -1)" +else + echo "❌ pandoc 未安装" + exit 1 +fi + +# 检查xelatex +if command -v xelatex &> /dev/null; then + echo "✅ xelatex: $(xelatex --version | head -1)" +else + echo "❌ xelatex 未安装" + echo "请安装 MacTeX 或 TeX Live" + exit 1 +fi + +# 检查中文字体 +echo "" +echo "🔤 检查中文字体..." +if fc-list | grep -q "STHeiti"; then + FONT="STHeiti" + echo "✅ 使用字体: STHeiti" +elif fc-list | grep -q "SimHei"; then + FONT="SimHei" + echo "✅ 使用字体: SimHei" +elif fc-list | grep -q "PingFang"; then + FONT="PingFang-SC" + echo "✅ 使用字体: PingFang-SC" +else + FONT="DejaVu Sans" + echo "⚠️ 使用备用字体: DejaVu Sans" +fi + +# 创建测试文档 +echo "" +echo "📝 创建测试文档..." +cat > test_pdf.md << 'EOF' +--- +title: "PDF导出测试文档" +author: "系统测试" +date: "2024-12-19" +--- + +# 测试标题 + +这是一个PDF导出测试文档,用于验证中文显示和pandoc配置。 + +## 中文字符测试 + +- 简体中文:水务营收系统概要设计 +- 数字:1234567890 +- 英文:Water Business Revenue System + +### 特殊字符测试 + +- 符号:!@#¥%……&*() +- 标点:,。?;:""'' +- 数学:α β γ δ ε + +## 表格测试 + +| 项目 | 内容 | 备注 | +|------|------|------| +| 系统名称 | 福建水务营收系统 | 主要业务系统 | +| 开发框架 | Spring Boot | 后端框架 | +| 前端框架 | Vue 3 | 现代化前端 | + +## 代码块测试 + +```java +public class Test { + public static void main(String[] args) { + System.out.println("Hello, 世界!"); + } +} +``` + +EOF + +# 测试PDF导出 +echo "" +echo "🚀 测试PDF导出..." + +mkdir -p output + +# 使用改进的pandoc命令 +PANDOC_OPTIONS="--pdf-engine=xelatex -V CJKmainfont=$FONT -V geometry:margin=2cm" + +echo "使用命令: pandoc test_pdf.md -o output/test_export.pdf $PANDOC_OPTIONS" + +if pandoc test_pdf.md -o output/test_export.pdf $PANDOC_OPTIONS 2>&1; then + echo "✅ PDF导出成功!" + echo "📄 输出文件: output/test_export.pdf" + + # 检查文件大小 + if [ -f output/test_export.pdf ]; then + file_size=$(stat -f%z output/test_export.pdf 2>/dev/null || stat -c%s output/test_export.pdf) + echo "📊 文件大小: $file_size 字节" + + if [ "$file_size" -gt 1000 ]; then + echo "✅ PDF文件生成正常" + else + echo "⚠️ PDF文件可能生成异常(文件过小)" + fi + fi +else + echo "❌ PDF导出失败" + echo "请检查错误信息" +fi + +# 清理测试文件 +rm -f test_pdf.md + +echo "" +echo "🏁 测试完成" \ No newline at end of file