#!/bin/zsh # 福建水务营收系统 - 快速统一文档导出工具 # 解决多文件图表混乱和标题样式问题的简化版本 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查依赖 check_dependencies() { log_info "检查依赖工具..." if ! command -v pandoc &> /dev/null; then log_error "pandoc 未安装,请运行 'brew install pandoc' 安装" exit 1 fi log_success "pandoc 已安装" } # 合并所有文档(不处理图表) merge_all_documents_simple() { local merged_file="$1" log_info "开始合并所有文档..." # 创建文档头部 cat > "$merged_file" << 'EOF' --- title: "福建水务营收系统概要设计文档" author: "系统设计团队" date: "2024年12月19日" documentclass: article geometry: margin=1in fontsize: 11pt mainfont: "PingFang SC" CJKmainfont: "PingFang SC" --- # 福建水务营收系统概要设计文档 ## 文档信息 | 项目信息 | 详情 | |---------|------| | **项目名称** | 福建水务营收系统 | | **文档类型** | 概要设计文档 | | **文档版本** | v1.0 | | **编写日期** | 2024-12-19 | | **文档状态** | ✅ 已完成 | --- EOF # 定义文档合并顺序和标题 declare -A doc_titles doc_titles["water_biz_system_architecture.md"]="系统架构设计" doc_titles["water_biz_module_design.md"]="模块功能设计" doc_titles["water_biz_database_design.md"]="数据库设计" doc_titles["water_biz_interface_design.md"]="接口设计" doc_titles["water_biz_deployment_design.md"]="部署设计" doc_titles["water_biz_security_design.md"]="安全设计" local doc_order=( "water_biz_system_architecture.md" "water_biz_module_design.md" "water_biz_database_design.md" "water_biz_interface_design.md" "water_biz_deployment_design.md" "water_biz_security_design.md" ) local doc_count=0 for doc in "${doc_order[@]}"; do if [[ -f "$doc" ]]; then doc_count=$((doc_count + 1)) log_info "合并文档 [$doc_count/6]: $doc" # 添加分页符和章节标题 echo "" >> "$merged_file" echo "\\newpage" >> "$merged_file" echo "" >> "$merged_file" echo "# 第${doc_count}部分:${doc_titles[$doc]}" >> "$merged_file" echo "" >> "$merged_file" # 处理文档内容,调整标题层级,保留Mermaid图表原样 sed -E 's/^# /## /g; s/^## /### /g; s/^### /#### /g; s/^#### /##### /g' "$doc" >> "$merged_file" echo "" >> "$merged_file" echo "---" >> "$merged_file" echo "" >> "$merged_file" else log_warning "文档不存在: $doc" fi done log_success "文档合并完成,共合并了 $doc_count 个文档" } # 创建增强的CSS样式 create_enhanced_css() { local css_file="$1" cat > "$css_file" << 'CSS_EOF' /* 福建水务营收系统文档样式 */ @page { margin: 2cm; size: A4; } body { font-family: "PingFang SC", "Microsoft YaHei", "SimSun", sans-serif; font-size: 11pt; line-height: 1.6; color: #333; max-width: none; margin: 0; padding: 0; } /* 标题样式 - 修复三级标题问题 */ h1 { font-size: 18pt; font-weight: bold; color: #1f4e79; margin-top: 24pt; margin-bottom: 12pt; border-bottom: 2pt solid #1f4e79; padding-bottom: 6pt; page-break-after: avoid; } h2 { font-size: 16pt; font-weight: bold; color: #2f5597; margin-top: 18pt; margin-bottom: 10pt; border-bottom: 1pt solid #2f5597; padding-bottom: 4pt; page-break-after: avoid; } h3 { font-size: 14pt; font-weight: bold; color: #365f91; margin-top: 14pt; margin-bottom: 8pt; background-color: #f8f9fa; padding: 6pt 12pt; border-left: 4pt solid #365f91; page-break-after: avoid; } h4 { font-size: 12pt; font-weight: bold; color: #4472c4; margin-top: 12pt; margin-bottom: 6pt; padding-left: 8pt; border-left: 2pt solid #4472c4; page-break-after: avoid; } h5 { font-size: 11pt; font-weight: bold; color: #5b9bd5; margin-top: 10pt; margin-bottom: 5pt; page-break-after: avoid; } h6 { font-size: 10pt; font-weight: bold; color: #70ad47; margin-top: 8pt; margin-bottom: 4pt; page-break-after: avoid; } /* 段落样式 */ p { margin-top: 0; margin-bottom: 8pt; text-align: justify; text-justify: inter-ideograph; } /* 表格样式 */ table { border-collapse: collapse; width: 100%; margin: 12pt 0; font-size: 10pt; page-break-inside: avoid; } th { background-color: #4472c4; color: white; font-weight: bold; padding: 8pt; border: 1pt solid #2f5597; text-align: center; } td { padding: 6pt 8pt; border: 1pt solid #a6a6a6; vertical-align: top; } tr:nth-child(even) { background-color: #f2f2f2; } /* 代码样式 */ code { font-family: "Courier New", "Monaco", monospace; font-size: 9pt; background-color: #f5f5f5; padding: 2pt 4pt; border-radius: 2pt; border: 1pt solid #e1e1e1; } pre { font-family: "Courier New", "Monaco", monospace; font-size: 9pt; background-color: #f8f8f8; padding: 12pt; border: 1pt solid #e1e1e1; border-radius: 4pt; overflow-x: auto; margin: 12pt 0; page-break-inside: avoid; } pre code { background: none; padding: 0; border: none; } /* Mermaid 样式 */ .mermaid { text-align: center; margin: 12pt 0; border: 1pt solid #e1e1e1; border-radius: 4pt; padding: 12pt; background-color: #fafafa; } /* 列表样式 */ ul, ol { margin: 8pt 0; padding-left: 24pt; } li { margin: 4pt 0; } /* 链接样式 */ a { color: #0563c1; text-decoration: underline; } a:visited { color: #954f72; } /* 引用样式 */ blockquote { margin: 12pt 0; padding: 12pt; background-color: #f9f9f9; border-left: 4pt solid #4472c4; font-style: italic; } /* 水平分隔线 */ hr { border: none; border-top: 1pt solid #d1d1d1; margin: 18pt 0; } /* 强调样式 */ strong, b { font-weight: bold; color: #1f4e79; } em, i { font-style: italic; color: #365f91; } /* 印刷样式优化 */ @media print { body { font-size: 10pt; line-height: 1.4; } h1 { font-size: 16pt; } h2 { font-size: 14pt; } h3 { font-size: 12pt; } h4 { font-size: 11pt; } h5 { font-size: 10pt; } h6 { font-size: 9pt; } table { font-size: 9pt; } code, pre { font-size: 8pt; } /* 避免在不适当的地方分页 */ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } table, pre, .mermaid { page-break-inside: avoid; } } CSS_EOF log_success "CSS样式文件创建完成" } # 导出Word文档 export_to_docx() { local input_file="$1" local output_file="$2" local css_file="$3" log_info "导出Word文档..." # 创建输出目录 mkdir -p "$(dirname "$output_file")" # 使用pandoc转换 pandoc "$input_file" \ -o "$output_file" \ --from markdown+smart \ --to docx \ --standalone \ --toc \ --toc-depth=4 \ --number-sections \ --highlight-style=tango \ --reference-doc=templates/reference.docx \ --metadata title="福建水务营收系统概要设计文档" \ --metadata author="系统设计团队" \ --metadata date="2024年12月19日" \ 2>/dev/null || \ pandoc "$input_file" \ -o "$output_file" \ --from markdown+smart \ --to docx \ --standalone \ --toc \ --toc-depth=4 \ --number-sections \ --metadata title="福建水务营收系统概要设计文档" \ --metadata author="系统设计团队" \ --metadata date="2024年12月19日" if [ $? -eq 0 ]; then log_success "Word文档导出成功: $output_file" else log_error "Word文档导出失败" return 1 fi } # 导出PDF文档 export_to_pdf() { local input_file="$1" local output_file="$2" local css_file="$3" log_info "导出PDF文档..." # 创建输出目录 mkdir -p "$(dirname "$output_file")" # 先转换为HTML,再转换为PDF local html_temp="${output_file%.pdf}_temp.html" # 使用pandoc转换为HTML pandoc "$input_file" \ -o "$html_temp" \ --from markdown+smart \ --to html5 \ --css="$css_file" \ --standalone \ --toc \ --toc-depth=4 \ --number-sections \ --highlight-style=tango \ --metadata title="福建水务营收系统概要设计文档" \ --metadata author="系统设计团队" \ --metadata date="2024年12月19日" \ --include-in-header=<(echo '') if [ $? -eq 0 ]; then log_success "HTML临时文件创建成功" # 尝试使用wkhtmltopdf转换为PDF if command -v wkhtmltopdf &> /dev/null; then wkhtmltopdf --page-size A4 \ --margin-top 2cm \ --margin-bottom 2cm \ --margin-left 2cm \ --margin-right 2cm \ --encoding UTF-8 \ --disable-smart-shrinking \ "$html_temp" "$output_file" 2>/dev/null if [ $? -eq 0 ]; then log_success "PDF文档导出成功: $output_file" rm -f "$html_temp" else log_warning "PDF导出失败,HTML文件保留: $html_temp" fi else log_warning "wkhtmltopdf 未安装,保留HTML文件: $html_temp" fi else log_error "PDF文档导出失败" return 1 fi } # 导出HTML文档 export_to_html() { local input_file="$1" local output_file="$2" local css_file="$3" log_info "导出HTML文档..." # 创建输出目录 mkdir -p "$(dirname "$output_file")" # 使用pandoc转换为HTML pandoc "$input_file" \ -o "$output_file" \ --from markdown+smart \ --to html5 \ --css="$css_file" \ --standalone \ --toc \ --toc-depth=4 \ --number-sections \ --highlight-style=tango \ --metadata title="福建水务营收系统概要设计文档" \ --metadata author="系统设计团队" \ --metadata date="2024年12月19日" \ --include-in-header=<(echo '') if [ $? -eq 0 ]; then log_success "HTML文档导出成功: $output_file" else log_error "HTML文档导出失败" return 1 fi } # 主函数 main() { local export_format="${1:-all}" echo "🚀 福建水务营收系统 - 快速统一文档导出工具" echo "=============================================" echo "" # 检查依赖 check_dependencies # 创建输出目录 mkdir -p output # 定义文件路径 local merged_md="output/merged_documents_quick.md" local css_file="output/document_style.css" # 步骤1:合并所有文档(保留原始Mermaid图表) log_info "步骤1:合并所有文档(保留Mermaid图表原样)" merge_all_documents_simple "$merged_md" # 步骤2:创建CSS样式 log_info "步骤2:创建增强CSS样式" create_enhanced_css "$css_file" # 步骤3:导出不同格式 log_info "步骤3:导出文档" if [[ "$export_format" == "all" || "$export_format" == "docx" ]]; then log_info "导出Word格式..." export_to_docx "$merged_md" "output/福建水务营收系统概要设计文档_完整版.docx" "$css_file" fi if [[ "$export_format" == "all" || "$export_format" == "pdf" ]]; then log_info "导出PDF格式..." export_to_pdf "$merged_md" "output/福建水务营收系统概要设计文档_完整版.pdf" "$css_file" fi if [[ "$export_format" == "all" || "$export_format" == "html" ]]; then log_info "导出HTML格式..." export_to_html "$merged_md" "output/福建水务营收系统概要设计文档_完整版.html" "$css_file" fi echo "" echo "🎉 文档导出完成!" echo "" echo "📁 输出文件:" if [[ "$export_format" == "all" || "$export_format" == "docx" ]]; then echo " 📄 Word文档: output/福建水务营收系统概要设计文档_完整版.docx" fi if [[ "$export_format" == "all" || "$export_format" == "pdf" ]]; then echo " 📄 PDF文档: output/福建水务营收系统概要设计文档_完整版.pdf" fi if [[ "$export_format" == "all" || "$export_format" == "html" ]]; then echo " 📄 HTML文档: output/福建水务营收系统概要设计文档_完整版.html" fi echo "" echo "💡 提示:" echo " - Mermaid图表在HTML中会自动渲染" echo " - 三级标题样式已修复(带背景色和边框)" echo " - 文档结构清晰,适合打印和分发" echo " - Word和PDF中保留原始Mermaid代码" echo "" } # 显示使用说明 show_usage() { echo "用法: $0 [格式]" echo "" echo "格式选项:" echo " all 导出所有格式 (默认)" echo " docx 仅导出Word格式" echo " pdf 仅导出PDF格式" echo " html 仅导出HTML格式" echo "" echo "示例:" echo " $0 # 导出所有格式" echo " $0 docx # 仅导出Word" echo " $0 pdf # 仅导出PDF" echo " $0 html # 仅导出HTML" } # 处理命令行参数 case "${1:-}" in -h|--help|help) show_usage exit 0 ;; all|docx|pdf|html|"") main "${1:-all}" ;; *) echo "错误: 不支持的格式 '$1'" echo "" show_usage exit 1 ;; esac