本文目录导读:

我来详细介绍几种常见的文档结构转换方法,包括不同场景下的脚本方案。
Python方案(最通用)
安装依赖
pip install python-docx openpyxl pandas PyPDF2 reportlab
基本文档结构转换脚本
import os
from docx import Document
import pandas as pd
class DocumentConverter:
def __init__(self, input_file):
self.input_file = input_file
self.output_dir = "converted_output"
os.makedirs(self.output_dir, exist_ok=True)
def docx_to_txt(self):
"""Word转纯文本"""
doc = Document(self.input_file)
output_path = os.path.join(self.output_dir, "output.txt")
with open(output_path, 'w', encoding='utf-8') as f:
for paragraph in doc.paragraphs:
f.write(paragraph.text + '\n')
print(f"转换完成:{output_path}")
return output_path
def docx_to_markdown(self):
"""Word转Markdown"""
doc = Document(self.input_file)
output_path = os.path.join(self.output_dir, "output.md")
with open(output_path, 'w', encoding='utf-8') as f:
for paragraph in doc.paragraphs:
# 根据样式判断标题级别
if paragraph.style.name.startswith('Heading'):
level = int(paragraph.style.name[-1])
f.write('#' * level + ' ' + paragraph.text + '\n\n')
else:
# 检测列表
if paragraph.style.name.startswith('List'):
f.write('- ' + paragraph.text + '\n')
else:
f.write(paragraph.text + '\n\n')
print(f"转换完成:{output_path}")
return output_path
def docx_structure_extract(self):
"""提取文档结构(大纲)"""
doc = Document(self.input_file)
structure = []
for paragraph in doc.paragraphs:
if paragraph.style.name.startswith('Heading'):
level = int(paragraph.style.name[-1])
structure.append({
'level': level,
'text': paragraph.text,
'style': paragraph.style.name
})
# 保存为CSV
df = pd.DataFrame(structure)
output_path = os.path.join(self.output_dir, "structure.csv")
df.to_csv(output_path, index=False)
return structure
def docx_to_json(self, output_format='json'):
"""Word转JSON格式"""
doc = Document(self.input_file)
data = {
'metadata': {
'file': self.input_file,
'paragraphs': len(doc.paragraphs),
'tables': len(doc.tables)
},
'content': []
}
# 提取段落
for para in doc.paragraphs:
if para.text.strip():
data['content'].append({
'type': 'paragraph',
'style': para.style.name,
'text': para.text
})
# 提取表格
for table in doc.tables:
table_data = []
for row in table.rows:
row_data = [cell.text for cell in row.cells]
table_data.append(row_data)
data['content'].append({
'type': 'table',
'data': table_data
})
# 保存
if output_format == 'json':
import json
output_path = os.path.join(self.output_dir, "output.json")
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
return data
# 使用示例
if __name__ == "__main__":
converter = DocumentConverter("example.docx")
# 转换格式
converter.docx_to_txt()
converter.docx_to_markdown()
converter.docx_to_json()
# 提取结构
structure = converter.docx_structure_extract()
print("文档结构:", structure)
Bash/Shell方案(Linux/Mac)
使用Pandoc进行格式转换
#!/bin/bash
# document_converter.sh
# 安装pandoc
# sudo apt-get install pandoc # Ubuntu
# brew install pandoc # Mac
# 定义输入输出
INPUT_FILE="$1"
OUTPUT_FORMAT="$2"
convert_document() {
local input=$1
local output_format=$2
local filename=$(basename "$input" .${input##*.})
case $output_format in
"txt")
pandoc "$input" -f docx -t plain -o "${filename}.txt"
echo "转换为TXT: ${filename}.txt"
;;
"md")
pandoc "$input" -f docx -t markdown -o "${filename}.md"
echo "转换为Markdown: ${filename}.md"
;;
"html")
pandoc "$input" -f docx -t html -o "${filename}.html"
echo "转换为HTML: ${filename}.html"
;;
"pdf")
pandoc "$input" -f docx -o "${filename}.pdf"
echo "转换为PDF: ${filename}.pdf"
;;
"all")
# 转换为所有格式
pandoc "$input" -f docx -t plain -o "${filename}.txt"
pandoc "$input" -f docx -t markdown -o "${filename}.md"
pandoc "$input" -f docx -t html -o "${filename}.html"
echo "全部转换完成"
;;
*)
echo "支持的格式: txt, md, html, pdf, all"
exit 1
;;
esac
}
# 批量转换目录下所有Word文档
batch_convert() {
local dir=$1
local format=$2
for doc in "$dir"/*.docx; do
if [ -f "$doc" ]; then
convert_document "$doc" "$format"
fi
done
}
# 主函数
main() {
if [ $# -lt 2 ]; then
echo "用法: $0 <输入文件/目录> <输出格式>"
echo "输出格式: txt, md, html, pdf, all"
exit 1
fi
if [ -d "$1" ]; then
batch_convert "$1" "$2"
elif [ -f "$1" ]; then
convert_document "$1" "$2"
else
echo "文件不存在: $1"
exit 1
fi
}
main "$@"
使用方式
# 单个文件转换 chmod +x document_converter.sh ./document_converter.sh example.docx md # 批量转换目录 ./document_converter.sh ./docs/ all
Node.js方案
安装依赖
npm install mammoth marked
转换脚本
// document-converter.js
const fs = require('fs');
const path = require('path');
const mammoth = require('mammoth'); // Word转换
const marked = require('marked'); // Markdown渲染
class DocumentConverter {
constructor() {
this.outputDir = './converted';
if (!fs.existsSync(this.outputDir)) {
fs.mkdirSync(this.outputDir);
}
}
// Word转HTML
async docxToHtml(inputFile) {
const result = await mammoth.convertToHtml({
path: inputFile
});
const outputPath = path.join(this.outputDir, 'output.html');
fs.writeFileSync(outputPath, result.value);
console.log('HTML转换完成');
return result.value;
}
// Word转Markdown(通过HTML中转)
async docxToMarkdown(inputFile) {
const html = await this.docxToHtml(inputFile);
// 简单HTML转Markdown(实际使用需要更完善的转换)
const md = html
.replace(/<h1>/g, '# ')
.replace(/<h2>/g, '## ')
.replace(/<h3>/g, '### ')
.replace(/<\/h[1-3]>/g, '\n\n')
.replace(/<p>/g, '')
.replace(/<\/p>/g, '\n\n')
.replace(/<strong>/g, '**')
.replace(/<\/strong>/g, '**')
.replace(/<em>/g, '*')
.replace(/<\/em>/g, '*')
.replace(/<[^>]*>/g, ''); // 移除剩余HTML标签
const outputPath = path.join(this.outputDir, 'output.md');
fs.writeFileSync(outputPath, md);
return md;
}
// 提取文档结构
async extractStructure(inputFile) {
const result = await mammoth.convertToHtml({
path: inputFile
});
const html = result.value;
const structure = [];
// 提取标题
const headingRegex = /<h([1-6])>(.*?)<\/h\1>/g;
let match;
while ((match = headingRegex.exec(html)) !== null) {
structure.push({
level: parseInt(match[1]),
text: match[2].replace(/<[^>]*>/g, '')
});
}
// 保存结构
const outputPath = path.join(this.outputDir, 'structure.json');
fs.writeFileSync(outputPath, JSON.stringify(structure, null, 2));
return structure;
}
}
// 使用示例
async function main() {
const converter = new DocumentConverter();
const inputFile = 'example.docx';
await converter.docxToHtml(inputFile);
await converter.docxToMarkdown(inputFile);
await converter.extractStructure(inputFile);
}
main().catch(console.error);
特定格式转换
表格提取脚本
# table_extractor.py
from docx import Document
import csv
def extract_tables(docx_file):
"""提取Word中的表格"""
doc = Document(docx_file)
for i, table in enumerate(doc.tables):
output_file = f"table_{i+1}.csv"
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
for row in table.rows:
writer.writerow([cell.text for cell in row.cells])
print(f"表格 {i+1} 已保存到 {output_file}")
目录结构生成
# toc_generator.py
from docx import Document
import re
def generate_toc(docx_file):
"""生成目录结构"""
doc = Document(docx_file)
toc = []
for paragraph in doc.paragraphs:
if paragraph.style.name.startswith('Heading'):
level = int(re.findall(r'\d+', paragraph.style.name)[0])
indent = " " * (level - 1)
toc.append(f"{indent}{paragraph.text}")
return '\n'.join(toc)
实用批处理命令
# Linux/Mac批量转换
for file in *.docx; do
pandoc "$file" -f docx -t markdown -o "${file%.docx}.md"
done
# Windows PowerShell
Get-ChildItem -Filter *.docx | ForEach-Object {
pandoc $_ -f docx -t markdown -o ($_.BaseName + ".md")
}
选择建议
- 简单文本转换:使用Pandoc命令行最快
- 结构化提取:Python脚本最灵活
- Web应用集成:Node.js方案适合
- 批量处理:Shell脚本最适用
- 精确控制:Python + python-docx库
需要更具体的转换需求(如特定格式解析、批量处理规则等)?请告诉我你的具体场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播