batch automation pandoc word markdown

Batch Convert Word to Markdown: скрипты для массового преобразования документов

Как конвертировать множество файлов Word (.docx) в Markdown одновременно. Покрывает Pandoc скрипты для Windows, macOS и Linux, а также автоматизацию Python для расширенных вариантов использования.

W
WordToMD Команда
·

Преобразование одного Word документа в Markdown занимает секунды с WordToMD. But what if you have 50, 100, or 500 .docx files to convert? That’s where batch conversion scripts come in. This guide covers the fastest approaches for массовое преобразование Word в Markdown.

Когда необходимо перевести на групповую

Если у вас есть:

  • Библиотека устаревшей документации в формате Word
  • Еженедельные отчеты, которые должны стать Markdown страницами
  • Проект миграции контента (Word → статический сайт, вики или база знаний)
  • Многочисленные авторы отправляют Word документы, которые публикуются на Markdown

Вам нужно преобразование партий. Для отдельных файлов: WordToMD остается самым простым вариантом.

Pandoc: Обратная основа конверсии партий

Pandoc является лучшим инструментом для конвертации партий. Установите его один раз, а затем сканируйте его для любого объема файлов.

Скрипты Windows PowerShell

# convert-all.ps1
# Converts all .docx files in current directory to .md

$docxFiles = Get-ChildItem -Path "." -Filter "*.docx" -Recurse

foreach ($file in $docxFiles) {
    $outputPath = [System.IO.Path]::ChangeExtension($file.FullName, ".md")
    
    pandoc `
        $file.FullName `
        -t gfm `
        --wrap=none `
        --extract-media="./media" `
        -o $outputPath
    
    Write-Host "✓ $($file.Name) → $([System.IO.Path]::GetFileName($outputPath))"
}

Write-Host "Done. Converted $($docxFiles.Count) files."

Запустите:

.\convert-all.ps1

Bash Script (macOS / Linux)

#!/bin/bash
# convert-all.sh
# Converts all .docx files recursively

OUTPUT_DIR="./markdown-output"
mkdir -p "$OUTPUT_DIR"

find . -name "*.docx" | while read -r docx_file; do
    filename=$(basename "$docx_file" .docx)
    output="$OUTPUT_DIR/$filename.md"
    
    pandoc \
        "$docx_file" \
        -t gfm \
        --wrap=none \
        --extract-media="$OUTPUT_DIR/media" \
        -o "$output"
    
    echo "✓ $docx_file → $output"
done

echo "Done."

Запустите:

chmod +x convert-all.sh
./convert-all.sh

Питонский скрипт для расширенных случаев использования

Питоны python-docx подход к библиотеке и Pandoc подпроцессу дает больше контроля:

#!/usr/bin/env python3
"""
batch_convert.py — Convert all .docx files to Markdown with frontmatter injection
"""

import os
import subprocess
import sys
from pathlib import Path
from datetime import datetime

INPUT_DIR = Path("./word-docs")
OUTPUT_DIR = Path("./markdown-output")
OUTPUT_DIR.mkdir(exist_ok=True)

def convert_file(docx_path: Path) -> Path:
    """Convert a .docx file to GFM Markdown using Pandoc."""
    output_path = OUTPUT_DIR / docx_path.with_suffix(".md").name
    
    result = subprocess.run(
        [
            "pandoc",
            str(docx_path),
            "-t", "gfm",
            "--wrap=none",
            f"--extract-media={OUTPUT_DIR}/media",
            "-o", str(output_path)
        ],
        capture_output=True,
        text=True
    )
    
    if result.returncode != 0:
        print(f"  ERROR: {result.stderr}", file=sys.stderr)
        return None
    
    return output_path

def add_frontmatter(md_path: Path, title: str) -> None:
    """Prepend YAML frontmatter to a Markdown file."""
    frontmatter = f"""---
title: "{title}"
date: {datetime.now().strftime('%Y-%m-%d')}
draft: false
---

"""
    content = md_path.read_text(encoding="utf-8")
    md_path.write_text(frontmatter + content, encoding="utf-8")

def main():
    docx_files = list(INPUT_DIR.glob("**/*.docx"))
    
    if not docx_files:
        print(f"No .docx files found in {INPUT_DIR}")
        return
    
    print(f"Converting {len(docx_files)} files...")
    
    success = 0
    for docx_path in docx_files:
        print(f"  Converting: {docx_path.name}")
        
        output_path = convert_file(docx_path)
        if output_path:
            # Use filename (without extension) as title, replace hyphens/underscores
            title = docx_path.stem.replace("-", " ").replace("_", " ").title()
            add_frontmatter(output_path, title)
            print(f"  ✓ → {output_path.name}")
            success += 1
        else:
            print(f"  ✗ Failed: {docx_path.name}")
    
    print(f"\nDone: {success}/{len(docx_files)} files converted.")

if __name__ == "__main__":
    main()

Запустите:

python3 batch_convert.py

Автоматическое добавление материала

Генераторы статического сайта нуждаются в материале. Скрипт Python добавляет базовый фронтмат. Для более полного подхода извлечь заголовок документа из первого заголовка H1:

def extract_title(md_content: str) -> str:
    """Extract the first H1 heading as the title."""
    for line in md_content.splitlines():
        if line.startswith("# "):
            return line[2:].strip()
    return "Untitled"

Затем обновить add_frontmatter призыв использовать выдержанный заголовок.

Сохранение структуры каталога

При преобразовании структуры вложенных папок сохраняется иерархия:

# Bash: preserve subdirectory structure
find ./word-docs -name "*.docx" | while read -r docx; do
    # Calculate relative path
    rel_path="${docx#./word-docs/}"
    output_dir="./markdown-output/$(dirname "$rel_path")"
    mkdir -p "$output_dir"
    
    output="$output_dir/$(basename "$docx" .docx).md"
    pandoc "$docx" -t gfm --wrap=none -o "$output"
    echo "✓ $rel_path"
done

Обработка изображений при конвертации в батах

В том числе: --extract-media, Pandoc извлекает все изображения в папку. Проблема: множество .docx файлов может создавать файлы с одинаковыми именами (e.g., image1.png) и т.д. Использовать подкаталог на документ:

for docx_file in *.docx; do
    slug="${docx_file%.docx}"
    mkdir -p "./media/$slug"
    
    pandoc "$docx_file" \
        -t gfm \
        --wrap=none \
        --extract-media="./media/$slug" \
        -o "$slug.md"
done

Исполнение для больших наборов

Для больших наборов документов (100+ файлов):

  • Pandoc обрабатывает один файл за вызов это нормально для до ~100 файлов
  • Для более чем 500 файлов используйте GNU Parallel для одновременной обработки:
find . -name "*.docx" | \
parallel pandoc {} -t gfm --wrap=none -o {.}.md

Установка GNU Parallel: brew install parallel / sudo apt install parallel

Валидация качества выпуска

После конвертации партии проверьте вывод:

  1. Случайная выборка Откройте 5-10 конвертированных файлов и сравните с оригиналами
  2. Счет таблиц Считайте таблицы в документе и проверьте, что все они конвертированы
  3. Уровни заголовков Обеспечить сохранение иерархии заголовков
  4. Разбитые ссылки Поиск Markdown ссылок и проверка их разрешения

Простой скрипт проверки:

# Count files with no headings (might indicate conversion failure)
for md in ./markdown-output/*.md; do
    if ! grep -q "^#" "$md"; then
        echo "No headings found: $md"
    fi
done

FAQ

Могу ли я конвертировать .doc файлы (старый Word формат)? Сначала сохраните их как .docx. Функция макроса Words может сохранять в батах: Инструменты → Макросы → запускать макрос SaveAs во всех открытых файлах. LibreOffice также может преобразовывать в бач через командную строку: soffice --headless --convert-to docx *.doc.

Сколько времени занимает преобразование партии? Pandoc преобразует типичный 10-страничный документ менее чем за секунду. 100 файлов = примерно 1-2 минуты. Очень большие документы (более 100 страниц) занимают больше времени.

Я получаю команду "pandoc": не найдена в моем сценарии. Убедитесь, что Pandoc установлен и на вашем PATH. Беги ! which pandoc (macOS/Linux) или Get-Command pandoc (PowerShell) для проверки.

Могу ли я запустить партийное преобразование в Windows без PowerShell? Да используйте .bat файл или установить Git Bash для запуска скриптов bash.

Заключение

Преобразование партии Word в Markdown простой с Pandoc и несколькими строками сценария. Скрипты PowerShell и Bash, приведенные выше, справляются с большинством сценариев. Для персонализированного фронта, сохранения структуры каталога или обработки изображений, скрипт Python дает вам полный контроль. Для одноразовых преобразований: WordToMD остается самым быстрым вариантом.