2012年07月05日

sphinxで Wordファイル(docx)出力する.(Windows)

ここ最近,sphinx で仕様書などを書いて,HTML/epub で出力,内容確認.
ブラウザで見たほうが軽く動かせたり,閲覧する環境を変えることで見落としていた考え方が浮かんできたりするので,多様な方法で文章を精査する方法を好んでます.なので最近はスマートフォンやタブレット上でepub 閲覧が多いというスタイルです.


その後,内容がだいたいOKなら,latex 出力して,PDF変換して,チーム内回覧という使い方をしてました.が,結局,今いる職場は,非IT技術者の方ばかりなので,追記できるようにword/excel でよこせと言われるわけです.
そのため,その度にPDFから文章コピペ,word に貼りつけ・整形としていたわけですがやはり非効率.
もう少しいい方法ないかなぁと思いつつ,文章を書くという割りと面倒な作業の敷居を低くしてくれるsphinx を使用していたわけですが,twitter で,たまたまword 形式で出力できる拡張プログラムの存在をしったので使ってみました.


https://bitbucket.org/haraisao/sphinx-docxbuilder/
上記に詳細は書かれています.
まず,事前準備として,
lxml module が必要とREADMEに書いてあるのでインストールします.(PILなども必要とあるのですが,すでに持っていたのでここでは省略します.)


% easy_install lxml
Searching for lxml
Reading http://pypi.python.org/simple/lxml/
Reading http://codespeak.net/lxml
Best match: lxml 2.3.4
Downloading http://lxml.de/files/lxml-2.3.4.tgz
Processing lxml-2.3.4.tgz
Running lxml-2.3.4\setup.py -q bdist_egg --dist-dir c:\docume~1\takaha~1\locals~
1\temp\easy_install-rv9mgi\lxml-2.3.4\egg-dist-tmp-7avqxv
Building lxml version 2.3.4.
Building without Cython.
ERROR: 'xslt-config' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

** make sure the development packages of libxml2 and libxslt are installed **

Using build configuration of libxslt
warning: no files found matching 'lxml.etree.c' under directory 'src\lxml'
warning: no files found matching 'lxml.objectify.c' under directory 'src\lxml'
warning: no files found matching 'lxml.etree.h' under directory 'src\lxml'
warning: no files found matching 'lxml.etree_api.h' under directory 'src\lxml'
warning: no files found matching 'etree_defs.h' under directory 'src\lxml'
warning: no files found matching 'pubkey.asc' under directory 'doc'
warning: no files found matching 'tagpython*.png' under directory 'doc'
warning: no files found matching 'Makefile' under directory 'doc'
error: Setup script exited with error: Unable to find vcvarsall.bat

------------------------

という感じで,vcvarsall.bat がないよと怒られる.むむむ.

(libxml2, libxslt は,こちらよりダウンロードできます.http://www.zlatkovic.com/libxml.en.html
参考: Windows環境下でlxml+python(lxmlのバイナリは未使用) http://d.hatena.ne.jp/hippu/20091103/1257259317 感謝!)

Visual C++ Express Edition 2008 を入れたいのですが,Microsoftのホームページ上には2010しか見当たりません.トライアル版で2012まで出てる始末.どうしよう...と思ってたら以下のサイトから直リンク?があり,無事にゲットできます.

Visual Studio C++2008 : http://go.microsoft.com/?LinkId=9348304

参考:
easy_install pysnmpしようと思ったらvcvarsall.bat無いよエラー。http://d.hatena.ne.jp/sakurai_youhei/20120420/1334899618

このリンクをクリックすると,vssetup.exe というファイルがダウンロードできます.
(注: あとで調べたら過去のバージョンは,Microsoftのサイトから公開されているPDFをダウンロードして,そこに書かれているリンクをクリックすると取得できるようになってました.
http://download.microsoft.com/download/4/9/1/4915E136-7EE3-4D8A-9529-B988266649E6/vstudio_2008_product_express_default.pdf )


以下のパスを通して,コマンドラインから実行できるようにしてあげればインストールが無事に出来ます.
--------------
cd C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC
set PATH=%PATH%;%CD%


これで,sphinx-docxbuilder が動作するはず.

・インストール

実は,これが結構手間取りました.
python 及び sphinx の環境構造を知らなかったので,どこに展開した置くべきか分からなかったのです.
https://bitbucket.org/haraisao/sphinx-docxbuilder/

上記から,ファイルをダウンロードして,解凍・展開します.
出来たフォルダの名前を "sphinx-docxbuilder"に変更し(これは変えなくても動作するのかもしれません),Pythonのライブラリ格納フォルダに設置します.例えば,自分はpython2.7.1 を使用していて,インストール先は以下のようになるように置きました.

C:\Python27\Lib\site-packages\sphinx-docxbuilder


あとは,それぞれsphinx 用の環境をつくり(% sphinx-quickstart で生成される環境のことです),
そこにあるconf.py に以下を書き込みます.


extensions = ['sphinx-docxbuilder']



書き込んだ後に,例えば,"% make html" とコマンド実行して,docxbuilder のインストールが上手く言ってないとエラーになるので,正しいかどうかはこうやって確認することもできます.

インストール先を個別に変えている方は以下の様な設定で出来るはず.

#------------------------------------------------
# for docxbuilder
sys.path.append(os.path.abspath('c:/work/sphinxcontrib/sphinx-docxbuilder'))
extensions = extensions + ['sphinx-docxbuilder']
#------------------------------------------------


■使い方:


$ sphinx-build -b docx [input-dir] [output-dir]


例えば,sphinx-quickstart コマンドを実行したフォルダのパス上で,

% sphinx-build -b docx . _build\docx


とすれば,_build\docx の下に Word ファイルが生成されています.
やったー,これで楽できるー!

Headings にナンバリングしたいのだけど,どうすればいいのか悩み中..
"1. hogehoge" という形ならすぐ出来たのですが,"1-2. hogefuga" のように2つ以上のナンバリングを行おうとするとどうやっていいのかわからないのです.

他にも見やすくするためにテンプレートを色々変えて遊んでいるところです.これを作ってくれた人,本当にありがとうございます.



■おまけ

% make docx


で出来るようにしたければ,Makefile またはmake.bat を編集します.
Makefile の場合.
----------------
docx:
$(SPHINXBUILD) -b docx $(ALLSPHINXOPTS) $(BUILDDIR)/docx
@echo
@echo "Build finished. The docx file is in $(BUILDDIR)/docx."

----------------

make.bat の場合.
----------------
if "%1" == "docx" (
%SPHINXBUILD% -b docx %ALLSPHINXOPTS% %BUILDDIR%/docx
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The docx file is in %BUILDDIR%/docx.
goto end
)

----------------

上記を追記しますれば,より手軽にWordのファイルが作れますよ.


posted by maplewine at 18:46| Comment(2) | TrackBack(0) | Computer | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
導入手順、大変参考になりました。ありがとうございます。

ところで「テンプレートを色々変えて」いらっしゃるとのことですが、
これはスタイルのことでしょうか?

デフォルトのstyle.docxをいじっても、
作業ディレクトリに持ってきてdocx_style = 'MyStyle.docx'のように設定しても、
出力されるドキュメントのスタイルが変わらず困っているのですが
fortunanさんはどのようにされているのでしょう?
Posted by sai at 2012年10月17日 23:20
sai 様
すみません、気づくの遅くなりました。

おっしゃるとおり、「テンプレートを変えて」とは、スタイルを変更するこ
とです。

実は、8月に、PCのHDDが吹っ飛んでしまい、現在すぐに確認できないのですが、以下のフォルダにあるstyle.docx を編集(word で開いて保存)することで出来ないでしょうか?

Python27/Lib/site-packages/sphinx-docxbuilder/docx/

このstyle.docx の書式設定を変更したり(例えば、Header1のフォントサイズを大きくするなど)すれば、反映されたりしないでしょうか?

私の場合は、
上記フォルダの下に、style.docx のコピーを作成し、その名前を変更した後(仮に style01.docx とします)に編集、それを、conf.py にて、
docx_style = 'style01.docx'

と指定しています。
要は、テンプレートとなるhoge.docx ファイルの保存場所も作業ディレクトリ上では読み込まれず、上記フォルダと同じ階層に置く必要があった気がします。間違っていたらごめんなさい。
Posted by 管理人 at 2012年11月15日 16:35
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック