Hatena::ブログ(Diary)

虎塚 このページをアンテナに追加 RSSフィード Twitter

2012-10-15

MarkdownドキュメントをWordに変換するPandocで、独自スタイルが使えない

ふと、Markdownで書いたドキュメントをMicrosoft Office Wordに自動変換してくれるツールがないかなぁ…と思って検索したら、ありました

おぉ……! 対応しているフォーマットが、めっさ多様です。これだこれだ! ただし、まさかのHaskell製。

3日前にマイナーバージョンアップされていて、開発継続中です。ダウンロードサイトはGoogle Projectですが、現在のコードはgithubでホスティングされています。いい感じ。

と、喜んだのもつかの間、触ってみると、テンプレートの参照が上手くいきませんでした。

未解決ですが、やったことをメモします。

環境

インストール

インストーラ(pandoc-1.9.4.2b-setup.exe)を次のページからダウンロードします。

実行するだけ。インストール中に、PATHも通してくれます。

入力ファイルの準備

Markdownで記述した20121015_input.txtを用意します。

# hogeプロジェクト構成管理計画書

R0.1

最終更新日: 2012/10/15

## 目的
本ドキュメントの目的は、あれをこうしてなにすることである。対象読者は、ほげもがを担当する者とする。

## 関連ドキュメント
* hogeプロジェクト変更管理手順書
* hogeプロジェクト構成管理手順書

中身もファイル名も、テキトーに。任意のフォルダに置きます。

動作確認(HTML出力)

まずは、htmlに変換してみます。

入力ファイルを置いたフォルダに異動して、実行。

pandoc -o output.html 20121015_input.txt

次のようなoutput.htmlが、カレントディレクトリに生成されました。

<h1 id="hogeプロジェクト構成管理計画書">hogeプロジェクト構成管理計画書</h1>
<p>R0.1</p>
<p>最終更新日: 2012/10/15</p>
<h2 id="目的">目的</h2>
<p>本ドキュメントの目的は、あれをこうしてなにすることである。対象読者は、ほげもがを担当する者とする。</p>
<h2 id="関連ドキュメント">関連ドキュメント</h2>
<ul>
<li>hogeプロジェクト変更管理手順書</li>
<li>hogeプロジェクト構成管理手順書</li>
</ul>

Validには程遠いけれど、headを前につけて、bodyでサンドするスクリプトを書けば、使えるでしょうか。

動作確認(Wordファイル出力)

続いて、本命のdocxに出力します。

pandoc -o output.docx 20121015_input.txt

Wordで開けるdocxファイルが、生成されました。

見出し1のフォントは、Calibri、18pt、見出し2のフォントは、MS ゴシック、16ptになっていました。

このドキュメントには、reference.docxというデフォルトテンプレートの書式(スタイル)が適用されているようです。reference.docxは、Pandocをインストールしたルートフォルダに、最初から入っていました。

Wordファイル出力のスタイル変更でハマる

さて、ユーザドキュメントを見ると、docxに適用するスタイルを変更できるようです。

ということは、Markdownで書いたドキュメントを、プロジェクト標準のスタイルを適用したWordファイルに変換することも、できるわけです。上手く動いてくれれば。

スタイルファイルを指定するには、次のオプションを使います。

pandoc --reference-docx=reference_copy.docx -o output.docx 20121015_input.txt

reference_copy.docxが、独自のスタイルファイルですね。

しかし、試したところ、上手くいきませんでした。スタイルが何も設定されていない、プレーンな(?)Wordファイルが生成されてしまいます。

検索すると、同じ問題で困っている人たちがぞろぞろ。

(ツラいけどemacsでdocxを編集しよう!とか言いだす人までいて、カオス)

ここから先は、何をやってダメだったか、という実りのない話なので注意です。

  1. デフォルトのreference.docxから生成されたdocxを、Wordで編集して、新規テンプレート用に名前をつけて保存し、指定した。→失敗
  2. reference.docxをカレントフォルダにコピーし、Wordで編集して上書き保存し、指定した。→失敗
  3. reference.docxをカレントフォルダにコピーし、OpenXMLエディタで編集して上書き保存し、指定した。→失敗
  4. ルートフォルダのreference.docxを、編集済みスタイルファイルに置き換えた。→失敗

3番目だけ、初めてのことをしたので、少し詳しく備忘を書いておきます。

reference.docxのコピーをOpenXMLエディタで編集

docxの実体はバイナリファイルではなく、OpenXML(OOXML)です。そのため、XMLを直接編集することができます。

Open XML パッケージ内で、スタイルは 要素のスタイル定義が入った固有パーツ (styles.xml) に格納されます。 http://msdn.microsoft.com/ja-jp/library/office/bb735940%28v=office.12%29.aspx

じつは最初、docxを7zipで解凍して、styles.xmlサクラエディタで直接編集しました。そのスタイルを指定してpandocを実行したところ、ファイル生成まではできたものの、ファイルを開こうとするとエラーが出て開けませんでした。 そこで、もしかして野蛮な編集が原因で失敗したのかと思い、専用のツールを使ってみました。 OpenXML専用のエディタがあるんですね。 インストールは、適当なフォルダに解凍するだけです。PackageExplorer.exeを実行すると、起動します。 編集したいdocxを開くと、そのファイルを構成する複数のXMLファイルが、エクスプローラ風のツリー構造で表示されます。 styles.xmlの途中に、こんな箇所がありました。 <!--略--> <w:style w:type="paragraph" w:styleId="Heading1"> <w:name w:val="Heading 1" /> <w:basedOn w:val="Normal" /> <w:next w:val="Normal" /> <w:uiPriority w:val="9" /> <w:qFormat /> <w:pPr> <w:keepNext /> <w:keepLines /> <w:spacing w:before="480" w:after="0" /> <w:outlineLvl w:val="0" /> </w:pPr> <w:rPr> <w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi" /> <w:b /> <w:bCs /> <w:color w:val="345A8A" w:themeColor="accent1" w:themeShade="B5" /> <w:sz w:val="36" /> <w:szCs w:val="36" /> </w:rPr> </w:style> <!--略--> 「見出し1」のスタイルが定義されている部分です。 オリジナルから変更したスタイルを実験的に作成するため、フォントの色を変えることにしました。 上のコードの次の箇所に注目します。
    <w:rPr>
    <!--略-->
      <w:color w:val="345A8A" w:themeColor="accent1"
      w:themeShade="B5" />
    <!--略-->
    </w:rPr>
themeColorを指定しているのに、valも指定しています。この場合、themeColorに取って代わられるのだそうです。 ということは、themeColorに指定されたaccent1の定義を書きかえれば、変更したスタイルファイルが手に入る、ということだと思います。 theme1.xmlに、次の記述があります。
<a:accent1><a:srgbClr val="4F81BD"/></a:accent1>
16進数の色指定を書き換えます。
<a:accent1><a:srgbClr val="FF0000"/></a:accent1>
保存して、実行! しかし、ファイル生成はできたものの、サクラエディタで編集した時と同じく、やはり開けませんでした。 「詳細はありません」という不親切なエラーが出た後、次のメッセージが出ます。
このoutput.docxは破損しています。プログラムのエラーの結果破損したか、悪意のある作成元が意図的に破損させた可能性があります。[開いて修復]の機能を実行すると、文書の内容を復元できることがあります。(略)
「開いて修復」を実行すると、オリジナルのreference.docxが適用されたものが出てきてしまいました。どうなっているのか。
  • Pandocは、Haskellで書かれているが、自分がHaskellをよく知らないので、読む気が起こらない
  • OpenXMLの仕様をまったく知らない
まあ、このあたりが、解決できない根本原因なのですが・・・。 いつか解決したら、続きを書くかも。

E_MattsanE_Mattsan 2012/10/18 19:27 わたしもMarkdownをレンダリングするツール探していたので、なんとタイムリー。わたしも、ちと追いかけてみました。…解決しませんでしたが。
#414の対策のコメントに「Wordのバグじゃね?」と書いてあったり。

https://github.com/jgm/pandoc/commit/5cfec4b9224462524040aae8312e3b3e61cbf422#src/Text/Pandoc/Writers/Docx.hs

わたしはWordを持っていないので役に立つ情報ではないのですが。書き換えたreference.docxを使っても、少なくともMacのPagesではファイルを開くことはできました。スタイルは反映されてなかったですが。


あと。別件ですが。調べていてわかったので。
standalone ( -s ) オプションとto format ( -t ) オプションを使うとテンプレートファイルを読み込んで単独で成り立つファイルを生成してくれるみたいですヨ。
pandoc -t html5 -s -o output.html input.md

torazukatorazuka 2012/10/20 00:18 コメントありがとうございますっ。

うーん、そうなのですね。やはりWordの側のスタイル指定のバグなのかなぁという感じですね。
Pandocを使わずにOLEを叩いてみれば分かるハズなのですが、横着してますゴニョゴニョ…

> standalone ( -s ) オプションとto format ( -t ) オプション
情報ありがとうございます。
自分もWordを持っていないので(^^; 週明けにWord環境に戻ったら試してみます〜

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/torazuka/20121015/pandoc
リンク元