batch automation pandoc word markdown

Batch Convert Word to Markdown: script per la conversione di documenti in massa

Come convertire in batch più file Word (.docx) in Markdown contemporaneamente. Copre gli script Pandoc per Windows, macOS e Linux, oltre all'automazione Python per casi di utilizzo avanzati.

W
WordToMD Squadra
·

Convertire un singolo documento Word in Markdown richiede secondi con 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 trasformazione in massa Word in Markdown.

Quando è necessario convertire in batch

Se avete:

  • Una libreria di documentazione legacy in formato Word
  • Rapporti settimanali che devono diventare pagine Markdown
  • Un progetto di migrazione di contenuti (Word → sito statico, wiki o knowledge base)
  • Multiplici autori che inviano Word documenti che pubblicano a Markdown

Hai bisogno di una conversione di lotti. Per i singoli file, WordToMD rimane l'opzione più semplice.

Pandoc: il backbone della conversione di lotti

Pandoc è lo strumento migliore per la conversione di lotti. Installalo una volta, poi scrivilo per qualsiasi volume di file.

Script di 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."

Corrilo:

.\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."

Corrilo:

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

Script Python per casi di utilizzo avanzati

Pythons python-docx libreria e Pandoc sottoprocesso approccio dà più controllo:

#!/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()

Corrilo:

python3 batch_convert.py

Aggiunta automatica del contenuto

I generatori statici hanno bisogno di materiale di fronte. Lo script Python di sopra aggiunge il materiale di base. Per un approccio più completo, estrarre il titolo del documento dalla prima rubrica 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"

Allora aggiorna il add_frontmatter chiamata per utilizzare il titolo estratto.

Preservare la struttura dell'elenco

Quando si converte una struttura di cartella annidata, mantenere la gerarchia:

# 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

Trattamento delle immagini in batch conversion

Con --extract-media, Pandoc estrae tutte le immagini in una cartella. La sfida: più file .docx possono produrre file con nomi identici (e.g., image1.png)). Utilizzare una sottodirectory per documento:

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

Performance per set di grandi dimensioni

Per set di documenti di grandi dimensioni (più di 100 file):

  • Pandoc elabora un file per invocazione questo va bene per fino a ~ 100 file
  • Per più di 500 file, utilizzare GNU Parallel per l'elaborazione simultanea:
find . -name "*.docx" | \
parallel pandoc {} -t gfm --wrap=none -o {.}.md

Installare GNU Parallel: brew install parallel / sudo apt install parallel

Validazione della qualità del prodotto

Dopo la conversione batch, controlla il tuo output:

  1. campione casuale Aprire 5-10 file convertiti e confrontarli con gli originali
  2. Conteggio delle tabelle Contare le tabelle in un documento e verificare che siano tutte convertite
  3. Livelli delle voci Assicurare la conservazione della gerarchia delle rubriche
  4. Legami rotti Cercare i collegamenti Markdown e verificare che si risolvano

Un semplice script di controllo:

# 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

Posso convertire in batch file .doc (antico formato Word)? Salvare come .docx prima. La funzione di macro Words può salvare in batch: Strumenti → Macros → eseguire una macro SaveAs su tutti i file aperti. LibreOffice può anche convertire in batch tramite riga di comando: soffice --headless --convert-to docx *.doc.

Quanto tempo impiega la conversione di lotti? Pandoc converte un tipico documento di 10 pagine in meno di un secondo. 100 file = circa 1-2 minuti. Documenti molto grandi (più di 100 pagine) richiedono più tempo.

Non ho trovato il comando "pandoc" nel mio script. Assicurati che Pandoc sia installato e sul tuo PATH. Corri . which pandoc (macOS/Linux) o Get-Command pandoc (PowerShell) per verificare.

Posso eseguire la conversione batch su Windows senza PowerShell? Sì utilizzare un .bat file o installare Git Bash per eseguire gli script bash.

Conclusioni

Batch Word a Markdown conversione è semplice con Pandoc e poche righe di script. Gli script PowerShell e Bash di cui sopra gestiscono la maggior parte degli scenari. Per il frontmatter personalizzato, la conservazione della struttura delle directory o la gestione delle immagini, lo script Python ti dà il pieno controllo. Per le conversioni uniche, WordToMD rimane l'opzione più veloce.