batch automation pandoc word markdown

تحويل المجموعة Word إلى 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 (ماكوس / لينكس)

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

إضافة المادة الأمامية تلقائياً

مولدات الموقع الثابتة تحتاج إلى المادة الأمامية. نص بايثون أعلاه يضيف المادة الأساسية. للحصول على مقاربة أكثر اكتمالاً، استخدم عنوان المستند من العنوان الأول 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 أولاً يمكن لـ Word ميزة الماكرو أن تقوم بحفظ المجموعات: الأدوات → الماكروات → تشغيل ماكرو SaveAs عبر جميع الملفات المفتوحة. يمكن لـ LibreOffice أيضًا تحويل المجموعات عبر سطر الأوامر: soffice --headless --convert-to docx *.doc.

كم يستغرق تحويل الدفعات؟ Pandoc يحول وثيقة نموذجية من 10 صفحات في أقل من ثانية. مئة ملف = حوالي 1-2 دقائق. الوثائق الكبيرة جداً (أكثر من 100 صفحة) تستغرق وقتاً أطول.

لقد حصلت على أمر "باندوك" غير موجود في نصي. تأكد من أن Pandoc مُثبت وعلى PATH الخاص بك. أركض which pandoc (ماكوس/لينكس) أو Get-Command pandoc (PowerShell) للتحقق.

هل يمكنني تشغيل تحويل الدفعات على ويندوز دون باورشيل؟ نعم استخدم a .bat ملف أو تثبيت Git Bash لتشغيل نصوص bash.

النتيجة

تحويل البطاقة Word إلى Markdown هو مباشر مع Pandoc وبضعة خطوط من النص. نصوص PowerShell و Bash المذكورة أعلاه تتعامل مع معظم السيناريوهات. للمادة الأمامية المخصصة، الحفاظ على هيكل الدليل، أو معالجة الصور، يمنحك نص بايثون السيطرة الكاملة. لتحويلات لمرة واحدة WordToMD لا يزال الخيار الأسرع.