batch automation pandoc word markdown

Batch Convert Word to Markdown: Scripts for Bulk Document Conversion

Làm thế nào để batch chuyển đổi nhiều file Word (.docx) thành Markdown cùng một lúc. Bao gồm Pandoc kịch bản cho Windows, macOS và Linux, cộng với tự động hóa Python cho các trường hợp sử dụng nâng cao.

W
WordToMD Đội
·

Chuyển đổi một tài liệu Word thành Markdown mất vài giây với 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 khối Word thành Markdown chuyển đổi.

Khi bạn cần chuyển đổi hàng loạt

Nếu bạn có:

  • Thư viện tài liệu cũ ở định dạng Word
  • Báo cáo hàng tuần cần trở thành Markdown trang
  • Một dự án di chuyển nội dung (Word → trang web tĩnh, wiki, hoặc cơ sở kiến thức)
  • Nhiều tác giả gửi Word tài liệu xuất bản cho Markdown

Bạn cần chuyển đổi lô. Đối với các tập tin đơn lẻ, WordToMD vẫn là lựa chọn dễ nhất.

Pandoc: Phân tích chuyển đổi lô

Pandoc là công cụ tốt nhất để chuyển đổi lô. Cài đặt nó một lần, sau đó lập kịch bản cho bất kỳ khối lượng tệp nào.

Windows PowerShell Script

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

Chạy đi.

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

Chạy đi.

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

Python Script cho trường hợp sử dụng nâng cao

Pythons python-docx thư viện và tiếp cận Pandoc subprocess cho phép kiểm soát nhiều hơn:

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

Chạy đi.

python3 batch_convert.py

Thêm nội dung tự động

Máy phát điện tĩnh cần vật liệu mặt trước. Các kịch bản Python trên thêm tiền đề cơ bản. Để có cách tiếp cận đầy đủ hơn, hãy trích tiêu đề tài liệu từ tiêu đề H1 đầu tiên:

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"

Sau đó cập nhật add_frontmatter gọi để sử dụng tiêu đề được trích xuất.

Duy trì cấu trúc thư mục

Khi chuyển đổi cấu trúc thư mục được tổ hợp, duy trì phân cấp:

# 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

Quá trình xử lý hình ảnh trong quá trình chuyển đổi hàng loạt

Với --extract-media, Pandoc trích xuất tất cả các hình ảnh vào một thư mục. Thách thức: nhiều tệp .docx có thể tạo ra tệp có cùng tên (e.g., image1.png) Sử dụng một thư mục con cho mỗi tài liệu:

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

Hiệu suất cho các bộ lớn

Đối với tập tài liệu lớn (100+ tập tin):

  • Pandoc xử lý một tập tin cho mỗi cuộc gọi điều này là tốt cho tối đa ~ 100 tập tin
  • Đối với hơn 500 tệp, sử dụng GNU Parallel để xử lý đồng thời:
find . -name "*.docx" | \
parallel pandoc {} -t gfm --wrap=none -o {.}.md

Cài đặt GNU Parallel: brew install parallel / sudo apt install parallel

Chứng nhận chất lượng sản phẩm

Sau khi chuyển đổi hàng loạt, kiểm tra đầu ra của bạn:

  1. Lưu ý ngẫu nhiên Mở 5-10 tập tin được chuyển đổi và so sánh với bản gốc
  2. Số lượng bảng Đếm bảng trong một tài liệu và xác minh tất cả chúng đã được chuyển đổi
  3. Mức đầu Đảm bảo bảo tồn tại hệ thống phân cấp tiêu đề
  4. Các liên kết bị hỏng Tìm kiếm Markdown liên kết và xác minh chúng giải quyết

Một kịch bản kiểm tra đơn giản:

# 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

Tôi có thể chuyển đổi các tập tin .doc (bình thức Word cũ) theo nhóm không? Lưu chúng dưới dạng .docx trước. Tính năng macro Words có thể lưu tập: Công cụ → Macros → chạy macro SaveAs trên tất cả các tệp mở. LibreOffice cũng có thể chuyển đổi hàng loạt thông qua dòng lệnh: soffice --headless --convert-to docx *.doc.

Chuyển đổi tập hợp mất bao lâu? Pandoc chuyển đổi một tài liệu 10 trang điển hình trong vòng một giây. 100 tập tin = khoảng 1-2 phút. Các tài liệu rất lớn (100+ trang) mất nhiều thời gian hơn.

Tôi đang nhận được pandoc: lệnh không tìm thấy trong kịch bản của tôi. Đảm bảo Pandoc được cài đặt và trên PATH của bạn. Chạy đi. which pandoc (macOS/Linux) hoặc Get-Command pandoc (PowerShell) để kiểm tra.

Tôi có thể chạy chuyển đổi tập hợp trên Windows mà không cần PowerShell không? Có sử dụng a .bat file hoặc cài đặt Git Bash để chạy các kịch bản bash.

Kết luận

Chuyển đổi batch Word thành Markdown là thẳng thắn với Pandoc và một vài dòng kịch bản. Các kịch bản PowerShell và Bash ở trên xử lý hầu hết các kịch bản. Đối với mặt tiền tùy chỉnh, bảo tồn cấu trúc thư mục, hoặc xử lý hình ảnh, kịch bản Python cho bạn toàn quyền kiểm soát. Đối với việc chuyển đổi một lần, WordToMD vẫn là lựa chọn nhanh nhất.