وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

روش تبدیل DOCX به Html با Python Mammoth

0 6
زمان لازم برای مطالعه: 7 دقیقه


معرفی

در مرحله ای از مسیر توسعه نرم افزار خود، باید فایل ها را از یک فرمت به فرمت دیگر تبدیل کنید.

DOCX (مورد استفاده توسط مایکروسافت ورد) یک فرمت فایل بسیار رایج است که برای بسیاری از افراد استفاده می شود. و گاهی اوقات، ما می خواهیم اسناد Word را به HTML تبدیل کنیم.

این را می توان به راحتی از طریق ماموت بسته بندی این یک کتابخانه آسان، کارآمد و سریع است که برای تبدیل فایل‌های DOCX به HTML استفاده می‌شود. در این مقاله، روش استفاده از Mammoth در پایتون برای تبدیل DOCX به HTML را خواهیم آموخت.

نصب ماموت

به عنوان یک تمرین خوب، به یاد داشته باشید که قبل از نصب، محیط مجازی خود را آماده و فعال کنید:

$ python3 -m venv myenv
$ . myenv/bin/activate

سپس ماموت را با نصب کنید pip:

$ pip3 install mammoth

این آموزش از نسخه ماموت استفاده می کند 1.4.15. اینجا یک نمونه سند شما می توانید در سراسر این آموزش استفاده کنید. اگر سندی برای تبدیل دارید، مطمئن شوید که یک سند است .docx فایل!

اکنون که آماده هستید، بیایید با استخراج متن و نوشتن آن به صورت HTML شروع کنیم.

حفظ قالب بندی هنگام تبدیل به HTML یکی از بهترین ویژگی های Mammoth است. با این حال، اگر فقط به متن فایل DOCX نیاز دارید، از اینکه چند خط کد مورد نیاز است شگفت زده خواهید شد.

می توانید استفاده کنید extract_raw_text() روش بازیابی:

import mammoth

with open(input_filename, "rb") as docx_file:
    result = mammoth.extract_raw_text(docx_file)
    text = result.value 
    with open('output.txt', 'w') as text_file:
        text_file.write(text)

توجه داشته باشید که این روش یک سند HTML معتبر را بر نمی گرداند. فقط متن را برمی گرداند روی را page، از این رو چرا ما آن را با ذخیره می کنیم .txt افزونه. اگر نیاز به حفظ چیدمان و/یا قالب بندی دارید، باید محتوای HTML را استخراج کنید.

تبدیل Docx به HTML با نگاشت سبک سفارشی

به طور پیش فرض، Mammoth سند شما را به HTML تبدیل می کند اما یک HTML معتبر به شما نمی دهد page. در حالی که مرورگرهای وب می توانند محتوا را نمایش دهند، یک علامت وجود ندارد <html> برای کپسوله کردن سند تگ کنید و الف <body> برچسب حاوی سند. روش ادغام خروجی آن به شما بستگی دارد. فرض کنید از یک چارچوب وب استفاده می کنید که دارای قالب است. احتمالاً الگویی برای نمایش یک سند Word و بارگذاری خروجی Mammoth در بدنه قالب تعریف می کنید.

ماموت نه تنها در مورد روش استفاده از خروجی آن، بلکه روش ایجاد آن نیز انعطاف پذیر است. به طور خاص، زمانی که می‌خواهیم به HTML که تولید می‌کنیم استایل دهیم، گزینه‌های زیادی داریم. ما سبک‌ها را با تطبیق هر قانون قالب‌بندی DOCX با قانون CSS معادل (یا تا جایی که می‌توانیم نزدیکتر کنیم) ترسیم می‌کنیم.

برای اینکه ببینید فایل DOCX شما چه سبک هایی دارد، دو گزینه دارید:

  1. می توانید فایل docx خود را با MS Word باز کنید و آن را بررسی کنید سبک ها نوار ابزار
  2. می‌توانید با باز کردن فایل DOCX با یک مدیر بایگانی، در فایل‌های XML حفاری کنید و سپس به /word/styles.xml و سبک های خود را پیدا کنید.

گزینه دوم می تواند توسط کسانی استفاده شود که به MS Word یا یک واژه پرداز جایگزین که می تواند سبک ها را تفسیر و نمایش دهد، دسترسی ندارند.

Mammoth در حال حاضر برخی از رایج ترین نقشه های سبک را دارد که به طور پیش فرض پوشش داده شده اند. به عنوان مثال، Heading1 سبک docx به نگاشت می شود <h1> عنصر HTML، پررنگ به نقشه برداری می شود <strong> عنصر HTML و غیره

همچنین می‌توانیم از Mammoth برای سفارشی‌سازی سبک‌های سند در حین نگاشت آن‌ها استفاده کنیم. به عنوان مثال، اگر می خواهید همه را تغییر دهید پررنگ وقوع در فایل DOCX به مورب در HTML می توانید این کار را انجام دهید:

import mammoth

custom_styles = "b => i"

with open(input_filename, "rb") as docx_file:
    result = mammoth.convert_to_html(docx_file, style_map = custom_styles)
    text = result.value
    with open('output.html', 'w') as html_file:
        html_file.write(text)

با custom_styles متغیر، سبک روی سمت چپ از فایل DOCX است، در حالی که یک روی سمت راست CSS مربوطه است.

بیایید بگوییم که می خواستیم آن را حذف کنیم پررنگ در مجموع می توانیم هدف نقشه برداری را خالی بگذاریم:

custom_styles = "b => "

گاهی اوقات سندی که ما پورت می کنیم دارای سبک های زیادی برای حفظ است. ایجاد یک متغیر برای هر سبکی که می خواهیم نقشه برداری کنیم به سرعت غیر عملی می شود. خوشبختانه ما می توانیم استفاده کنیم docstrings برای ترسیم هر تعداد سبک که می خواهیم در یک حرکت:

custom_styles = """ b => del
                    u => em
                    p(style-name='Heading 1') => i"""

شاید متوجه شده باشید که آخرین نقشه برداری کمی متفاوت از بقیه بود. هنگام نگاشت سبک ها، می توانیم از براکت مربع استفاده کنیم () با یک شرط در داخل آنها به طوری که فقط زیر مجموعه ای از عناصر به این شکل استایل بندی می شوند.

در مثال ما، p(style-name='Heading 1') پاراگراف هایی را انتخاب می کند که نام سبک دارند Heading 1. ما نیز می توانیم استفاده کنیم p(style-name^='Heading') برای انتخاب هر پاراگراف که نام سبکی دارد که با آن شروع می شود Heading.

Style Mapping همچنین به ما امکان می دهد تا سبک ها را به کلاس های CSS سفارشی نگاشت کنیم. با انجام این کار، می توانیم سبک HTML را آن طور که دوست داریم شکل دهیم. بیایید یک مثال انجام دهیم که در آن CSS سفارشی اولیه خود را در یک رشته مستند مانند این تعریف می کنیم:

custom_css ="""
    <style>
    .red{
        color: red;
    }
    .underline{
        text-decoration: underline;
    }
    .ul.li{
        list-style-type: circle;
    }
    table, th, td {
    border: 1px solid black;
    }
    </style>
    """

اکنون می توانیم نگاشت خود را برای ارجاع به کلاس های CSS که در آن تعریف کرده ایم، به روز کنیم <style> مسدود کردن:

custom_styles = """ b => b.red
                    u => em.red
                    p(style-name='Heading 1') => h1.red.underline"""

اکنون تنها کاری که باید انجام دهیم این است که CSS و HTML را با هم ادغام کنیم:

edited_html = custom_css + html

اگر فایل DOCX شما دارای هر یک از این عناصر باشد، می‌توانید نتایج را ببینید.

اکنون که می دانیم چگونه سبک ها را ترسیم کنیم، بیایید از یک چارچوب شناخته شده CSS (همراه با JS) استفاده کنیم تا به HTML خود جلوه بهتری بدهیم و یک سناریوی واقعی واقعی را تمرین کنیم.

نگاشت سبک ها با بوت استرپ (یا هر چارچوب رابط کاربری دیگری)

درست مثل کاری که با آن انجام دادیم custom_css، باید اطمینان حاصل کنیم که CSS با HTML بارگذاری شده است. ما باید URI یا CDN فایل Bootstrap را به HTML خود اضافه کنیم:

bootstrap_css = '<link href="https://cdn.jsdelivr.net/npm/(email protected)/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">'
bootstrap_js = '<script src="https://cdn.jsdelivr.net/npm/(email protected)/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>'

ما نیز کمی خود را نیشگون گرفتن و کشیدن custom_styles برای مطابقت با کلاس های CSS جدید ما:

custom_styles = """ b => b.mark
                    u => u.initialism
                    p(style-name='Heading 1') => h1.card
                    table => table.table.table-hover
                    """

در خط اول، ما در حال ترسیم سبک DOCX پررنگ به آن هستیم b عنصر HTML با یک کلاس mark، که معادل کلاس بوت استرپ HTML است <mark> برچسب، برای برجسته کردن بخشی از متن استفاده می شود.

در خط دوم، ما در حال اضافه کردن initialism کلاس به u عنصر HTML، اندازه فونت را کمی کاهش می دهد و متن را به حروف بزرگ تبدیل می کند.

در خط سوم، همه پاراگراف هایی را که نام سبک دارند را انتخاب می کنیم Heading 1 و تبدیل آنها به h1 عناصر HTML با کلاس Bootstrap از card، که چندین ویژگی سبک مانند رنگ پس زمینه، موقعیت و حاشیه را برای عنصر تعیین می کند.

در خط آخر، همه جداول موجود در فایل docx خود را به تبدیل می کنیم table عنصر HTML، با بوت استرپ table کلاس برای اینکه ظاهر جدیدی به آن ببخشیم، همچنین با اضافه کردن کلاس Bootstrap آن را برجسته می کنیم وقتی که ماوس را نگه می داریم table-hover.

مانند قبل، از not-notation برای نگاشت چندین کلاس به یک عنصر HTML استفاده می کنیم، حتی اگر سبک ها از منبع دیگری آمده باشند.

در نهایت CDN های Bootstrap را به HTML خود اضافه کنید:

edited_html = bootstrap_css + html + bootstrap_js

HTML ما اکنون آماده اشتراک گذاری است، با ظاهر و احساسی زیبا! در اینجا کد کامل برای مرجع است:

import mammoth

input_filename = "file-sample_100kB.docx"

custom_styles = """ b => b.mark
                    u => u.initialism
                    p(style-name='Heading 1') => h1.card
                    table => table.table.table-hover
                    """


bootstrap_css = '<link href="https://cdn.jsdelivr.net/npm/(email protected)/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">'
bootstrap_js = '<script src="https://cdn.jsdelivr.net/npm/(email protected)/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>'


with open(input_filename, "rb") as docx_file:
    result = mammoth.convert_to_html(docx_file, style_map = custom_styles)
    html = result.value 

edited_html = bootstrap_css + html + bootstrap_js

output_filename = "output.html"
with open(output_filename, "w") as f: 
    f.writelines(edited_html)

همچنین، نکته دیگری که در اینجا باید به آن توجه کرد این است که در یک سناریوی واقعی، احتمالاً مانند آنچه در اینجا انجام دادیم، Bootstrap CSS را مستقیماً به محتوای HTML اضافه نمی‌کنید. در عوض، محتوای HTML را به یک HTML خاص بارگذاری/تزریق می‌کنید page، که قبلاً دارای بسته های CSS و JS لازم است.

تا اینجا دیدید که چقدر انعطاف پذیری برای استایل کردن خروجی خود داریم. Mammoth همچنین به ما امکان می دهد محتوایی را که در حال تبدیل آن هستیم تغییر دهیم. حالا بیایید نگاهی به آن بیندازیم.

برخورد با تصاویری که نمی خواهیم به اشتراک گذاشته شوند

فرض کنید مایلیم تصاویر فایل DOCX خود را از تبدیل شدن حذف کنیم. را convert_to_html() روش a convert_image آرگومان که یک تابع کنترل کننده تصویر است. فهرستی از تصاویری که باید تبدیل شوند و به سند HTML اضافه شوند را برمی گرداند.

طبیعتاً، اگر آن را لغو کنیم و یک لیست خالی برگردانیم، آنها از فهرست تبدیل شده حذف می شوند page:

def ignore_image(image):
    return ()

حال، اجازه دهید آن تابع را به عنوان یک پارامتر به آن منتقل کنیم convert_to_html() روش:

with open(input_filename, "rb") as docx_file:
    result = mammoth.convert_to_html(docx_file, style_map = custom_styles, convert_image=ignore_image)
    html = result.value
    with open('output.html', 'w') as html_file:
        html_file.write(text)

خودشه! Mammoth تمام تصاویر را هنگام تولید یک فایل HTML نادیده می گیرد.

ما تاکنون از Mammoth با پایتون استفاده کرده ایم. Mammoth همچنین یک ابزار CLI است، بنابراین ما یک رابط دیگر برای انجام مکالمات DOCX به HTML داریم. بیایید ببینیم که چگونه در بخش بعدی کار می کند.

تبدیل فایل با Mammoth، با استفاده از CLI، معمولاً به این صورت است:

$ mammoth path/to/input_filename.docx path/to/output.html

اگر می خواهید تصاویر را از HTML جدا کنید، می توانید یک پوشه خروجی را مشخص کنید:

$ mammoth file-sample_100kB.docx --output-dir=imgs

ما همچنین می توانیم سبک های سفارشی را مانند پایتون اضافه کنیم. ابتدا باید یک فایل سبک سفارشی ایجاد کنید:

$ touch my-custom-styles

سپس استایل های سفارشی خود را به آن اضافه می کنیم، نحو مانند قبل است:

b => b.red
u => em.red
p(style-name='Heading 1') => h1.red.underline

اکنون می توانیم فایل HTML خود را با سبک سفارشی تولید کنیم:

$ mammoth file-sample_100kB.docx output.html --style-map=my-custom-styles

و شما تمام شده اید! سند شما با سبک های سفارشی تعریف شده تبدیل می شد.

نتیجه

ریخته گری نوع فایل یک موقعیت رایج هنگام کار است روی فن آوری های وب تبدیل فایل‌های DOCX به HTML شناخته شده و قابل دستکاری آسان به ما امکان می‌دهد داده‌ها را تا جایی که نیاز داریم بازسازی کنیم. با Mammoth، ما یاد گرفتیم که چگونه متن را از یک docx استخراج کنیم و چگونه آن را به HTML تبدیل کنیم.

هنگام تبدیل به HTML، می‌توانیم خروجی را با قوانین CSS که ایجاد می‌کنیم یا آنهایی که با چارچوب‌های مشترک UI ارائه می‌شوند، استایل کنید. همچنین می‌توانیم داده‌هایی را که نمی‌خواهیم در HTML در دسترس باشند، حذف کنیم. در نهایت، روش استفاده از Mammoth CLI را به عنوان یک گزینه جایگزین برای تبدیل فایل دیدیم.

نمونه فایل docx به همراه کد کامل آموزش را می توانید پیدا کنید روی این مخزن GitHub.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-11 22:29:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید