600 lines
14 KiB
Bash
Executable File
600 lines
14 KiB
Bash
Executable File
#!/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 '<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">')
|
||
|
||
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 '<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script><script>mermaid.initialize({startOnLoad:true});</script>')
|
||
|
||
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 |