‘未分類’ カテゴリーのアーカイブ

電書協EPUB3用XHTMLファイルを自動分割する

2013/02/03

 先日1月18日に、JEPAセミナーEPUB 第18回 EPUB 3制作の現場から IIに登壇させていただきました。ご来場いただいたみなさまありがとうございます。私が最初でその後に話題のSF小説Gene Mapper作者の藤井太洋さん、最後に電子雑誌トルタルの古田靖さんと小嶋智さんのセッションという構成でした。
 200人の会場が満員に近い盛況ぶりで、とても有り難いことだと思っております。動画がこちらにアップされておりますので、ご興味をお持ちの方はご覧になってみてください。

 さて、今回は当日私のセッションの中のInDesignからXHTMLを書き出すパートの中で、XHTMLの途中で1ページ画像を挿入するために自動分割する部分のシステム開発がまだ間に合っていないために、手動で分割しているというお話をさせていただいたのですが、その後(必要に迫られて)ファイル分割スクリプトを制作いたしましたので、アフターフォロー的な意味合いを込めまして発表させていただきます。
 なお、これはあくまで「電書協EPUB3制作ガイド」仕様のEPUB用XHTMLファイル専用の分割スクリプトですので、全てのEPUB用XHTMLファイルに使えるわけではありません。
 また、このスクリプトを使用したことに伴う損害等に関しましては、私として一切の責任は負いかねますので、あくまで自己責任でご利用ください。

use utf8;

#Encode/File::Basenameモジュールをインポート

use Encode qw/encode decode/;

use File::Basename qw/basename dirname/;

#引数1で指定した分割するファイルをインポート

$splitFilePath = $ARGV[0];

$splitFilePath = decode(‘UTF-8’, $splitFilePath);

open(IN,”$splitFilePath”);

#改行コードの統一処理、行ごとに再分割してリストに格納

@mySPLITFILEtxts = <IN>;

$mySPLITFILEtxts = join(“”,@mySPLITFILEtxts);

$mySPLITFILEtxts =~ s@\x0D\x0A@\x0D@g;

$mySPLITFILEtxts =~ s@\x0A@\x0D@g;

$mySPLITFILEtxts = decode(‘UTF-8’, $mySPLITFILEtxts);

@eachLine = split(“\x0D”,$mySPLITFILEtxts);

close (IN);

#入力ファイルのフォルダパス、拡張子を取ったファイル名を取得

my $myDirName = dirname $splitFilePath;

my $myFileName = basename $splitFilePath;

$myFileName =~ s@\.xhtml@@;

#ヘッダ部分を抽出して変数リストに格納

my @headerBlockTxt;

foreach $line (@eachLine){

if ($line =~ /<div class=\”main\”>/){

last;

} else {

push(@headerBlockTxt,$line)

}

}

#——————-分割処理——————-

#出力用変数リスト定義、連番カウント用変数定義

my @outputTxt = ();

my $outputFileCount = 1;

#文書先頭〜<div class=”main”>までは捨てる

foreach $line (@eachLine){

if ($line =~ /<div class=\”main\”>/){

@outputTxt = ();

#分割マークで区切られたブロックの出力

} elsif ($line =~ /■+分割■+|〓+分割〓+|〓+1ページ図入る〓+/){

my $finalOutputPath = $myDirName . “/” . $myFileName . “_” . $outputFileCount . ‘.xhtml’;

open(OUT,”> $finalOutputPath”);

foreach (@headerBlockTxt){print OUT $_ . “\n”;}

print OUT ‘<div class=”main”>’ . “\n”;

foreach (@outputTxt){print OUT $_ . “\n”;}

print OUT ‘</div>’ . “\n” . ‘</body>’ . “\n” . ‘</html>’;

close (OUT);

@outputTxt = ();

$outputFileCount++;

$outputFileCount++;

#最後の分割マーク〜文書末ブロックの出力

} elsif ($line =~ /<\/html>/){

my $finalOutputPath = $myDirName . “/” . $myFileName . “_” . $outputFileCount . ‘.xhtml’;

open(OUT,”> $finalOutputPath”);

foreach (@headerBlockTxt){print OUT $_ . “\n”;}

print OUT ‘<div class=”main”>’ . “\n”;

foreach (@outputTxt){print OUT $_ . “\n”;}

print OUT ‘</html>’;

close (OUT);

@outputTxt = ();

$outputFileCount++;

$outputFileCount++;

} else {

push(@outputTxt,$line);

}

}

exit;

分割文字挿入例 以上のスクリプトを「splitfile.pl」等の名前で保存し、xhtmlファイルを分割したい行に

「■分割■」「〓分割〓」「〓1ページ図入る〓」

などと指定しておいてから(分割文字に関しては、必要でしたら適宜書き換えてご使用ください)、ターミナルで

perl パス名+splitfile.pl パス名+処理するxhtmlファイル名

 と入力して実行すれば、指定したxhtmlファイルと同じフォルダに分割後のファイルが連番出力されます。分割ファイルの間に1ページ画像を配置したxhtmlファイルを挿入していくことを想定していますので、連番ファイル名は「p-000_1.xhtml」、「p-000_3.xhtml」のような形で出力されますが、仕様です。

 一応ダウンロード版もご用意しました。以下からダウンロードしていただけます。


 分割したいソースファイルをアイコンにドラッグ&ドロップすれば分割されます。

 分割したいソースファイルをバッチファイルにドラッグ&ドロップすれば分割されます。
 なお、事前にActiveperl等のperl環境のインストールが必要です。

(2013.2.04)

緊デジ(電書協)仕様のリフロー型EPUB3を作ってみる

2012/12/03

 AmazonのKindleストアもついに日本展開を開始し、Google Play Booksもサービス開始するなど、いわゆる「黒船」陣営も軒並み出揃ったことで、ついに本当の意味での「電子書籍元年」が始まった感があります(Apple iBookStoreが未だにロールアウトしないのが気になるところではありますが)。こうした中でpubridgeと紀伊國屋書店、楽天koboとの電子書籍配信・販売合意が発表され、緊デジ事業で制作されたコンテンツの提供先も確定しました。これから先も次々に提供先が増えていくことになるのでしょうか。

 緊デジ仕様のEPUB3は、まだ校正用ビューア等の仕組みが発表されていないため正式には制作開始前の状態ですが、「電書協EPUB3制作ガイド」に準拠するという方針は発表されており、「緊デジ版EPUB3テンプレート」も発表されているため、既に制作自体は可能です。

 ということで、以下は緊デジ仕様のリフロー型EPUB3コンテンツ制作の具体的な流れです。あくまでまだテスト段階ではありますが、ご参照いただければ幸いです。

1 本文用のXHTML/CSSファイルを準備する

本文用のXHTML/CSSファイルを準備

本文用のXHTML/CSSファイルを準備

 本文用のXHTML/CSSファイルを準備します。私は今回、テキスト部分に関しては以前のエントリで発表させていただいたInDesignでXMLのタグ付けをしてXMLを書き出し、Perlで変換する方法でXHTMLファイルを制作しましたが、これは印刷用データからの変換を前提としたワークフローですので、もとがテキストデータであれば初めからDreamWeaverなどweb系のツールを利用したほうが効率は良いかと思います。XHTMLファイルのタグ付けルールは前述の「緊デジ版EPUB3テンプレート」及び準拠している「電書協EPUB3制作ガイド」に従います。

 画像のみで1ページのページに関しては、「kinidigi_reflow_template」内の「p-005.xhtml」(1ページ画像テンプレート)を元に、タイトル、ファイル名、alt(代替名称)を書き換えてファイルを準備します。

 「電書協EPUB3制作ガイド」は基本的に紙書籍の電子化を目的としたガイドラインで、印刷データや.book、XMDFといったレガシーフォーマットからの変換を念頭に置いているものと思われ、全体的に現在もしくは近い将来に各ビューアが実装可能なプロパティだけに絞り込んだ、かなり保守的な仕様です。そのため電子ならではのインタラクティブな表現などはほとんど期待できませんが、その分ビューアの側の表現の揺れなどはそこまで気にしなくても良さそうな印象があります。緊デジ用EPUBに用いるためのXHTMLファイルは、この「電書協EPUB3制作ガイド」に従い、基本的に支給されたCSSファイルの記述を利用する形で制作します。通常書籍で必要とされる表現はほぼ網羅されていますので、書籍(文章もの)のコンテンツであればほぼ事足りるものと思います。自分でclass名を定義する必要はほとんどありません。

見出しid番号を連番で振っておく

見出しid番号を連番で振っておく

 もし、各作品ごとにCSSの追記が必要な場合は、必ず「book-style.css」内の作品別カスタマイズ領域内に記述します。その場合でも電書協ガイド(17ページ)で規定されている「RSによる対応を想定するHTML 要素とCSSプロパティ」の範囲内での記述に留める必要があります。

 本文用のXHTMLファイルは最終的に「p-001.xhtml」「p-002.xhtml」といった形で連番のファイルにリネーム※1し、目次に表示させたい見出しには「id="toc-001"」といった形でユニークな見出し番号を振っておきます。なお、IDの属性番号は1文字目は必ず英文字である必要があります。これはXHTMLを含むXMLの属性名命名規則の縛りです。数字は2文字目以降にしか使用出来ませんので念のため(私は一度やらかしました)。

2 カバー/注意書き/奥付/本扉などのXHTMLファイルを準備する

テンプレートをコピーし、書き換える

テンプレートをコピーし、書き換える

 「緊デジ版EPUB3テンプレート」のファイルをコピーし、書き換える形で、カバー/注意書き/奥付/本扉などのファイルを整えます。

 カバー「p-cover.xhtml」は、タイトル名を書き換え、イメージファイルのalt領域にタイトル名を記述すればOKです。カバーに用いる画像ファイルは「cover.jpg」の名前で準備しておいてください。

 電子化にあたっての注意書き「p-caution.xhtml」は、タイトル名と縦/横の記述を書き換えればOKです。

 奥付は通常、電子化クレジット「p-credit.xhtml」と、底本奥付(テンプレートの「p-006.xhtml」を参照)の2種類が必要です。電子化クレジットは各出版社から支給されるデータをもとに入力することになります。底本奥付は画像を用意し、タイトル名とファイル名の連番(p-xxx.xhtml)、目次用のid番号を書き換えればOKです。底本奥付用の画像ファイルは「original_credit.jpg」の名前で準備しておいてください。

 本扉「p-titlepage.xhtml」も基本的には画像ページでOKですが、出版社からの指定があった場合はテキストで準備することになります。画像の場合はテンプレートの「p-005.xhtml」(1ページ画像テンプレート)を元にファイルを整えます(ファイル名は「p-titlepage.xhtml」にリネーム)。テキストの場合はテンプレートの「p-titlepage.xhtml」を書き換えてください。

 書き換えが必要な箇所は、「電書協EPUB3制作ガイド」(26ページ〜)に色文字で示されています。ご参照ください。

3 作成した各ファイルをEPUB圧縮用のフォルダにまとめる

 「kinidigi_reflow_template」のフォルダをまるごとコピーし、フォルダ名をリネームしてから、作成したXHTMLファイルを「xhtml」フォルダに収納します。元から入っているファイル類は捨てるか上書きしてしまってOKですが、次のステップで「OPFパッケージファイル生成アプリ(緊デジ用)」を使用する場合は、「p-toc.xhtml」はそのまま残しておいて下さい(名前の抽出用です)。画像ファイルは「image」フォルダに収納します。元から入っているファイル類は捨てるか上書きしてしまってOKです。

4 OPFパッケージドキュメントを準備する

ファイルごとの見開き表現の有無を記述

ファイルごとの見開き表現の有無を記述

 OPFパッケージドキュメントを準備します。OPFパッケージドキュメントは、書誌情報やユニークIDの記述、EPUBパッケージ内に収納する全ファイルの登録、コンテンツの並び順や右綴じ/左綴じの規定、見開き表現の有無などを規定するもので、電書協ガイド/緊デジのテンプレートでは「standard.opf」の名称で規定されています。基本的にこのファイルを書き換えることになります。なお、このファイル名は「META-INF」フォルダ内の「container.xml」に登録されていますので、変更するとEPUBファイルとしてパッケージングができなくなります。

 今回私は、以前のエントリで発表済の「OPFパッケージファイル生成アプリ(緊デジ用)」を使用してOPFパッケージドキュメントを準備しました。image/xhtmlの登録作業や書誌情報やユニークID入力補助を目的としたアプリです。なお、このアプリを利用した場合でも、ファイルごとの見開き表現の有無(spine項目内「properties="page-spread-left"」記述部分)は手動で書き換える必要があります。
 ちなみに緊デジ仕様のEPUBでは、ユニークIDにJP-eコードを用いる部分が電書協ガイドのそれとは異なります。もし上記アプリを用いて緊デジ仕様以外のEPUBを制作する場合は、JP-eコードはuuid等に置き換える必要があります。

5 目次(p-toc.xhtml)ファイルを準備する

目次ファイルを準備する

目次ファイルを準備する

 目次ファイル「p-toc.xhtml」を準備します。なお、ここで言う目次ファイルは本文内にページとして表示される目次ファイルです。リーディングシステム内メニュー表示用の目次ファイルは「navigation-documents.xhtml」ですが、こちらには「表紙」「目次」「電子化クレジット」のみが登録され、緊デジでのEPUB3制作では通常書き換える必要はありません。この「p-toc.xhtml」も「OPFパッケージファイル生成アプリ(緊デジ用)」で自動抽出が可能です。ただし、目次は各書籍ごとに底本の体裁が異なるため、いずれにせよ後から細かな部分の編集は必要と思われます。

 目次のリンクの確認は、ファイルをSafari/Chrome等のブラウザで開くことで行うことができます。目次に限らず体裁の確認は、実際にEPUB圧縮するのと同じ構成のフォルダにXHTMLファイルを収納した上で、ブラウザで行うのが便利です。

6 EPUB圧縮を実行する

epub packagerを用いたepub圧縮

epub packagerを用いたepub圧縮

 OPFファイル、目次ファイルを上書きし、EPUB制作に必要な全てのファイルが整ったところで、EPUB圧縮を実行します。macで作業をしている場合は、フォルダ内の不可視ファイル「.DS Store」を除去する必要がありますので、まず「Ds Store Remover」にEPUB圧縮するフォルダをドラッグ&ドロップし、「.DS Store」を除去します(同種のアプリは複数あるようです)。

 その後、実際にEPUB圧縮を行います。ターミナルでコマンドを打ち込んで圧縮することも出来るのですが、私は普段「epub packager」を利用しています。ドラッグ&ドロップで圧縮できるので便利です。

7 エラーを修正する

epub Checkerでバリデートチェック

epub Checkerでバリデートチェック

 epub内のエラーを修正します。xhtml内idの二重登録、画像ファイル名の記述ミスなど、epub制作には間違いは付き物です。これをチェックし、全てのリーディングシステムできちんと表示されるepubを制作するために、バリデータでepubをチェックする必要があります。

 前出の「epub packager」では、epub作成時にバリデートもしてくれるのですが、実際にどういった部分に問題があったのかまでは表示してくれませんので、「Not Valid」と表示された場合は、バリデータでepubデータをチェックし、エラー部分を修正する必要があります。私は同じ会社から出ているアプリ「epub Checker」に、生成されたepubをドラッグ&ドロップし、バリデート作業を行っています。これはIDPFのepubcheckを内部的に利用したGUIアプリですが、epubcheckに関してはIDPFからCUI版のコマンドラインツールも配布されていますので、Windowsなどの環境でもそちらを利用してバリデート作業を行うことができます。epubcheckのエラーメッセージについては、前エントリ「IDPFのバリデータに叱られてみた」をご参照ください。

 全てのエラーを修正し、バリデータをノーエラーで通過できれば、epubファイルはひとまず完成です。

※1 電書協ガイドでは、ファイル名/id番号共に版元ごとに変更可能な項目として指定されていますが、本エントリではサンプルコンテンツの表記に従って「連番」としています。項目があまりに多数に及ぶ場合など、修正がしやすいような命名法を採用しても特に差し支えはありません

(2012.12.3)

 ファイル名/ID名の命名方式に関してご指摘をいただきましたので、追記いたしました。

(2012.12.10)

緊デジフィックス型EPUB3用XHTML生成スクリプト

2012/10/30

 前回のエントリに引き続き、緊デジ用のスクリプトを公開します。そもそもこちらのスクリプトはスタジオ・ポットSDの日高さんの制作されたPHPスクリプトです(いきなり送られてきて割とびっくりしました(汗))。これはあらかじめPHPソース「mk-epub-fixed.php」を開いて出力する総ページ数を書き換え、同じく「source.xhtml」内の書籍タイトル名を書き換えた上でターミナル(Windowsの場合はコマンドプロンプト)からスクリプトを実行すると、xhtmlフォルダ内に連番でリネームされたxhtmlファイルが生成されるというものです。
 あとはimageフォルダ内にスキャン済の各ページの画像を入れ、OPFファイルや目次を整えれば緊デジフィックス型EPUB3の必要ファイルが一通り整います。
 なかなか便利そうなスクリプトと思いましたので、先方の許可をいただいて私のブログで公開させていただくことにしました。

Mac用GUI版

Mac用GUI版

 そのまま公開するのもあまりに芸がありませんので、ぺージ数だけ引数で指定できるようにしたものと、Mac用に簡易GUIを付けたものを別に作ってみました。GUIプログラムに関しては説明するまでもないと思いますので、以下、主にコマンドライン版の説明をします。

 なお、WindowsのコマンドプロンプトでPHPのプログラムを実行するには、あらかじめPHPのプログラムをインストールし、パスを通しておく必要があります。こちらこちらなどを参考に、PHPの実行環境を整えておいてください。ちなみに私の環境では、XAMPPをインストールした上で環境変数の末尾に「;C:\xampp\php」と追加してパスを通すことでOKになりました(コマンドプロンプト画面で「php -v」と入力し、PHPのバージョンが表示されればOKです)。

ターミナルの文字エンコーディングをUTF-8に

文字エンコーディングをUTF-8に

 Mac OS Xに関してはもともとシステムにPHPがプリインストールされています。私の手元の環境で確認した限りではMac OS X 10.6/10.7では問題なく実行できるようです。ただ、私の制作しましたGUI版のプログラム版を実行する場合、引数に日本語を指定する関係上、ターミナルの言語環境が「日本語(Mac OS)」などになっていると正常にファイルが生成されないことがあるようです。あらかじめターミナルの「環境設定」メニュー「詳細」タブで、文字エンコーディングを「Unicode(UTF-8)」に設定した上でスクリプトを実行してください。

1 ファイル出力フォルダを整える

フォルダ構成

フォルダ構成

 こちらのスクリプトは緊デジフィックス型EPUB専用のファイル生成スクリプトで、「item」フォルダ内に「xhtml」フォルダがあることを前提に連番のxhtmlファイルを生成します。この条件を満たすためにあらかじめフォルダ構成を整えておく必要があります。Finder上でゼロからフォルダを作るなら「item」フォルダを新規に作成し、「mk-epub-fixed.php」及び「source.xhtml」のファイルをコピーして、「xhtml」フォルダを作成してください。緊デジのテンプレートを元にしてももちろん問題ありません。

2 「source.xhtml」内のタイトル名を書き換える

タイトル名を書き換え

タイトル名を書き換え

 「source.xhtml」をテキストエディタで開き、「〓タイトル〓」の部分を書籍の題名に合わせて書き換え、セーブします。

3 「source.xhtml」内の短辺のピクセル数を書き換える

短辺のピクセル数を書き換える

短辺のピクセル数を書き換える

 さらに、「source.xhtml」内の、「〓短辺ピクセル数〓」の部分(3ヶ所)をスキャン画像の短辺のピクセル数に合わせて書き換え、セーブします。なお、緊デジフィックス型(電書協EPUB3ガイド仕様)の場合、全ての画像の縦横のピクセル数を統一することが規定されています。緊デジの規定では長辺のピクセル数は1536ピクセル固定です。

4 「mk-epub-fixed.php」内の出力ページ数を書き換える

出力ページ数を設定

出力ページ数を設定

 同じく「mk-epub-fixed.php」をテキストエディタで開き、「$counter = XXX;」のXXXの部分に出力ページ数を入力します。
 なお、ページ数を引数で入力できるようにしたバージョン(mk-epub-fixed-pagenumimport.php)では、こちらのステップは必要ありません。

5  コマンドプロンプト/ターミナルからスクリプトを実行します

ターミナルからスクリプトを実行

ターミナルからスクリプトを実行

 まず、「CD “itemフォルダ名へのパス”と入力し、カレントディレクトリを切り替えてから(CD+半角スペース入力後にFinderからitemフォルダをターミナルにドラッグ&ドロップ、リターン)、「php mk-epub-fixed.php」と入力してスクリプトを実行すると、xhtmlフォルダ内に指定したページ数のXHTMLファイルが生成されます。
 なお、ページ数を引数で入力できるようにしたバージョンを使用する場合には、「php mk-epub-fixed-pagenumimport.php xxxの形で指定してください(xxxの部分にページ数を入力)。

ダウンロードは以下からどうぞ。



Mac/Winのターミナル/コマンドプロンプトで使用。


(ユニバーサルバイナリでビルド、Mac OS X 10.6/10.7にて起動確認済。Mac OS X 10.5でも起動自体は可能ですが、実行時にエラーが出ました。おそらくプリインストールされているPHPのバージョンの問題と思われます。こちらあたりを参考にPHPのバージョンを5に上げれば動作するのではないかと思うのですが未検証です。)

 なお、こちらのアプリを利用したことによって生じた損害等に関しまして、私として一切の責任は負いかねますので、あくまで自己責任でご利用ください。

(2012.10.30)

 日高さんの所属を「スタジオ・ポットSD」に修正しました。また、コンテンツによってそれぞれ画像の短辺サイズ指定値を変える必要があるとのご指摘をいただき、表記を修正いたしました。コマンドライン/ターミナル用スクリプト及びMac用GUIプログラムも同様に修正しました。

(2012.10.30追記)

プロフィール
Jun Tajima

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

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