‘csv’ タグのついている投稿

表組みをCSV経由でXHTMLにしてみた

2014/09/16

 InDesignデータからのEPUB制作で、悩ましいポイントのひとつが「表組み」の対応です。InDesignのEPUB書き出し機能を使うことでInDesign内の表をテーブル形式で書き出すことはできますが、InDesignの表組み機能では、そもそもセルの内容が複数ページにまたがるような場合には分割して作る必要があり、これの修正には当然相応の手間がかかります。また、そもそも元データがInDesign内の表作成機能を使用して作られていないケースも多々あります。
 また、現状多くのビューアでテーブル表示の対応が不完全で、これを受けて電書協ガイドではテーブル要素を非対応としているという現状もあります。このため、現在のEPUB作成では、現実的な解として表組みのページを画像として挿入しています。
 ただ、この形では当然文字を拡大することはできませんし、将来的にはアクセシビリティ対応にも支障をきたしそうです。

 そこで、InDesign内の表組みをCSV経由でXHTMLに変換することを考えてみました。CSV(カンマ区切りテキスト)は、ExcelやKeynoteから書き出して生成することができますので、InDesign内の表をコピーしてExcel等にペーストし、CSV形式で書き出してPerlで変換するという流れでワークフロー化することができます。Excel等の表計算ソフトであれば、比較的簡単に表の内容の編集・整理が可能ですので、かなり柔軟な処理ができると思います。

 PerlでCSVを扱う際に問題になるのは各項目の分割(パース)で、項目内にカンマが含まれていないなら普通にsplit関数で分割できるのですが、含まれている場合には結構面倒なことになりますので、今回は素直にCSV用のモジュール「Text::CSV_XS」を使いました。cpanminusがインストール済みの環境であれば、ターミナルで

sudo cpanm Text::CSV_XS

 と入力すればインストールできるはずです。

 また、今回出力するXHTMLファイルは最初の項目と次の項目を全角スペース区切りで並べ、次行との区別のためにぶら下がりインデントを指定する形にしてみました。表ではなくなってしまいますが、これならばまあ表示できないビューアはありません。本当はtable要素なりdiv要素のdisplay:table指定なりを使いたいところですが、現状ではまあ仕方ありません。

変換元データ 変換元データはこんな感じ。なお今回はPerl側で変換元の文字コードにUTF-8を指定しています。ExcelからCSVを出力した場合はShift_Jisで出力されるようですので、一度テキストエディタで開いて文字コードを変換する必要があります。なお、今回利用したNumbersでは出力時に文字コードを指定できる模様です。

 スクリプト的には外部からXHTMLのテンプレートを読み込む形にしても良いのですが、今回はコンパクトにしたかったのでソースコード内部に直にテンプレートを記述する形にしています。こういうのを「ヒアドキュメント」と呼ぶらしいです(初めて使いましたよ)。まあ可読性も良いですし悪くない形かなと思っています。以下が変換スクリプトになります。これに引数としてCSVファイルを食わせてやればXHTMLファイルを出力します。

 出力結果はこんな感じ。

 できたできた。

 やっていることは比較的単純で、読み込んだCSVファイルの各行の項目をモジュールで分割し、各行のテンプレートに入れ込む処理をしてから合成済みのテキストを配列に収納し、最後に配列内の各行を結合しています。その後でヘッダフッタを合成。テンプレート部分を書き換えるだけでそれなりに便利に使えるかと思います。いずれEPUBでテーブルが普通に使用できるようになったとしても、まあ応用は効きそうかなと思っています。

(2014.9.16)

プロフィール
Jun Tajima

こちらにて、電子書籍&Web制作を担当しています。
このブログは、EPUB3をはじめとした電子書籍制作担当オペレータからの、「電子書籍の制作時にたとえばこんな問題が出てきていますよ」的な「現地レポート」です。少しでも早い段階で快適な電子書籍閲覧・制作環境が整うことを願って、現場からの声を発信していこうと目論んでおります。

当ブログ内の記事・資料は、私の所属しております組織の許諾を得て掲載していますが、内容は私個人の見解に基づくものであり、所属する組織の見解を代表するものではありません。また、本ブログの情報・ツールを利用したことにより、直接的あるいは間接的に損害や債務が発生した場合でも、私および私の所属する組織は一切の責任を負いかねます。

最近のコメント