ソフトウェア開発をしていると、ある時点であるフォーマットから別のフォーマットにファイルを変換しなければならないことがあります。
DOCX (Microsoft Word で使用) は、多くの人が使用するかなり一般的なファイル形式です。そして時には、WordドキュメントをHTMLに変換したいと思うこともあります。
これは、Mammothパッケージによって簡単に実現できます。これは、DOCXファイルをHTMLに変換するために使用される、簡単で効率的、かつ高速なライブラリです。この記事では、PythonでMammothを使用してDOCXをHTMLに変換する方法を学びます。
Mammothのインストール
インストールする前に、仮想環境の準備とアクティベーションを済ませておくことをお勧めします。
$ python3 -m venv myenv
$ . myenv/bin/activate
それでは、Mammoth を pip
でインストールします。
$ pip3 install mammoth
このチュートリアルでは、Mammoth のバージョン 1.4.15
を使用します。このチュートリアルで使用するサンプルドキュメントを紹介します。変換するドキュメントがある場合は、.docx
ファイルであることを確認してください!
さて、準備ができたので、さっそくテキストを抽出して、それをHTMLとして書いてみましょう。
DOCXファイルの生テキストを抽出する
HTMLに変換する際に書式を保持することは、Mammothの最も優れた機能の1つです。しかし、DOCXファイルのテキストだけが必要な場合、必要なコード行数が少ないことに驚くことでしょう。
extract_raw_text()` メソッドを使って取得することができます。
import mammoth
with open(input_filename, "rb") as docx_file:
result = mammoth.extract_raw_text(docx_file)
text = result.value # The raw text
with open('output.txt', 'w') as text_file:
text_file.write(text)
このメソッドは有効な HTML ドキュメントを返さないことに注意してください。このメソッドは有効なHTMLドキュメントを返さないことに注意してください。これはページ上のテキストを返すだけなので、拡張子を .txt
にして保存します。もしレイアウトや書式を維持する必要がある場合は、HTMLの内容を取り出すことになるでしょう。
カスタムスタイルマッピングを使用してDocxをHTMLに変換する
デフォルトでは、Mammoth はドキュメントを HTML に変換しますが、有効な HTML ページを作成することはできません。ウェブブラウザはコンテンツを表示できますが、ドキュメントをカプセル化するための <html
タグと、ドキュメントを格納するための <body
タグが欠けているのです。その出力をどのように統合するかは、あなた次第です。例えば、テンプレートを持つウェブフレームワークを使っているとしましょう。Word ドキュメントを表示するテンプレートを定義し、Mammoth の出力をテンプレートのボディに読み込ませることになるでしょう。
Mammothは、出力の使い方だけでなく、出力の作り方も柔軟です。特に、作成した HTML にスタイルを付けたい場合、多くのオプションがあります。DOCXの各フォーマットルールを同等の(またはできるだけ近い)CSSルールにマッチさせることで、スタイルをマッピングしています。
DOCXファイルにどのようなスタイルがあるかを確認するには、2つのオプションがあります。
-
- MS Wordでdocxファイルを開き、ツールバーの「スタイル」をチェックします。
-
- DOCXファイルをアーカイブマネージャで開いてXMLファイルを調べ、
/word/styles.xml
に移動し、スタイルを見つけることができます。
- DOCXファイルをアーカイブマネージャで開いてXMLファイルを調べ、
2番目の方法は、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
を持つ段落を選択することになります。We can also use p[style-name^='Heading']
to select each paragraph that has a style name starting with Heading
.
Style mapping also allows us to map styles to custom CSS classes. By doing so, we can shape the style of HTML as we like. Let’s do an example where we define our basic custom CSS in a docstring like this:
custom_css ="""
<style
.red{
color: red;
}
.underline{
text-decoration: underline;
}
.ul.li{
list-style-type: circle;
}
table, th, td {
border: 1px solid black;
}
</style
"""
Now we can update our mapping to reference the CSS classes we’ve defined in the `