2024/06/06
鷹野凌さんのキーパーソンメッセージも出ていましたし、以前からこれが必要だと言ってきた経緯もあるのでちょっと補足説明などしておきます。
そもそもEPUB内の「ページ番号」とは
まず、そもそも「リフロー型電子書籍」は本来、固定されたページ番号を持ちません。「ページ」は各デバイスでEPUBを表示した際にEPUB内のXHTMLファイルの内容が分割されて動的に生成されます。これは鷹野凌さんも説明されている通り。画面の小さなデバイスで表示すればページ数は増えますし、画面の大きなデバイスで表示すればページ数は減るでしょう。電子書籍アプリでリフロー型の電子書籍を読むときに画面下にページ番号(ノンブル)が表示されているかも知れませんが、これは通常「そのデバイスのサイズ、文字のサイズに対応して生成されたページ番号(ノンブル)」であって、それを根拠としてその本の特定の箇所を指し示すことはできません。ちょっと専門性の高い本を読めば、割と当たり前に既存の書籍の特定ページへの参照は出てきますが、「参照されている本を電子版で所有していた場合に、参照先が不明になってしまっている」のが現状なわけです。このため、「リフロー版EPUBにも電子化元の紙の本のページ番号を入れましょう」という話になっています。
「他のEPUB内の特定の場所を指し示す電子的な技術」はまだ発展途上
EPUBは電子データなのだから既存の本のページ数にはこだわらず、EPUB内の特定位置を指し示す技術(epub-cfiなど)を使うべきだという意見もあるようですし、それはそれで意義があることも十分分かるのですが、そちらにも簡単には解決できない問題があります。
現在商業流通しているEPUBが個々のファイルを指し示す個別のIDで一元管理されている状況ではないこと、がそれです。もちろん各ストアごとに商品のIDは振られているでしょうが、「ストアAの商品X」と「ストアBの商品X」が同じタイトルであることの紐付けはなされていません。紐付けるためには双方のストアのデータベースを突き合わせて紐付ける作業が必要になってしまっているわけです。
つまり、「特定のEPUBの特定の箇所」を指し示したい場合に、「特定のEPUB」の方で参照先不明になります。これを解消するには、たとえば電話番号のように全世界的な番号管理の仕組みが必要になるはずですが、これがまだどこにもありません。これは国単位での調整も必要そうな大きな話なので、解決できるとしてもかなりの時間がかかるでしょう。
また、これが解決できたとしても、紙の本から電子書籍の特定の箇所を指し示すことはできないため、紙の本と電子書籍との間で断絶が起きてしまいます。これはもちろん良くありません。「リンクを機能させたければ電子版をあらためて買いなさい」というような話になってしまいますし、それくらいなら読者が自分でページ数を見て該当ページを開く手間があるとはいえ、ページ数そのものを情報として入れた方が現実的と言えそうです。
全てのEPUBが対象というわけではない
さて、では全てのリフロー版EPUBに紙の本のページ番号を入れる必要があるかというと、それも当然違うかと思います。小説のようなものには普通は必要ないでしょうし、紙の本から「電子化」されていない本にも元々ないものは入れようがありません。これは、「他の本の特定の箇所を参照したり、特定の箇所を参照されたりする可能性がある、紙の本から「電子化」された本」のためのものです。具体的には新書や、学術文庫などはこれに該当するでしょう(ハードな専門書は現在PDFベースで仕組みが作られているため事情が異なるかもしれません)。ストア側のアプリの対応も、そういった類の本の販売を重視しているストアは早く対応して欲しい、ということになるかと思います。
そういった事情なので、これを要件として記述するのは「紙の本のデータからの電子化の仕様書」として作られた「電書協EPUB3制作ガイド」の改訂で、となるのは自然かなと思います。現在、電書協EPUB3制作ガイドを日本語EPUB表示の要件として各ストアがアプリを作っている状況なので、電書協EPUB3制作ガイドの改訂は紙の本のデータからの電子化に留まらない影響が出そうではあるのですが、それは本来何を求められているのかを考えた上で、個々の対応を柔軟に行っていくしかないかなと思います。
なお、印刷版のページ番号をリフローのEPUB内に入れる技術的な方法はこちらを参照してください。8年前のエントリですが特に変わってはいないはずです。
(2024.6.10)
タグ: ページ番号, 電書協EPUB3制作ガイド
カテゴリー: 未分類 | コメントはまだありません »
2023/12/13
EPUB制作時の校正用PDF生成目的でVivliostyle Viewerをローカルマシン内にサーバ起動する形で使ってきたのですが(参考)、先日ブラウザからのPDF出力で白紙ページが大量に入ってしまうChromeのバグを踏んでしまい、いい機会だったのでVivliostyle開発者の村上(@MurakamiShinyu)さんに助言をいただいて、上記参考先のコードを書いたときにはまだ無かったローカル環境向けのVivliostyle CLIに切り替えましたのでメモを残しておきます。環境はmacOS13.6です。
Vivliostyle CLIの環境構築
まず、node.jsを入れます(参考)。homebrewは入っていることが前提です。ターミナルで
これだけ。
でnodeのバージョンが表示されればOKです。
次にVivliostyle CLIを入れます。同じくターミナルで
|
npm install -g @vivliostyle/cli |
これだけです。
Perl経由で自動化
これを従来同様にPerlで実行できるようにしたのが以下のコード。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
######追加CSSファイルのパス、表示するepubファイルの順でパスを指定するとepubファイルをVivliostyle CLIで開いてChromiumで表示する。Mac専用。###### use utf8; #Encodeモジュールをインポート use Encode qw/encode decode/; ############################################# #追加CSSファイルのパスを取得 my $addCssPath = $ARGV[0]; $addCssPath = decode('UTF-8', $addCssPath); #表示するepubファイルのパスを取得 my $epubFilePath = $ARGV[1]; $epubFilePath = decode('UTF-8', $epubFilePath); #Vivliostyle CLIで処理してChromiumで表示 my $openVivliostyleCliCmd = "osascript -e " . "'" . "tell application \"Terminal\" to do script " . "\"" . "vivliostyle preview " . $epubFilePath . " --style " . $addCssPath . "\"" . "'"; system $openVivliostyleCliCmd; |
ノンブル表示、見開き指定などのための追加CSSは –style オプションを使って外部ファイルを読み込む形としました。その方が修正もしやすいし(追加CSSの参考例はVivliostyle CLIのオンラインマニュアル内にある)。「vivliostyle preview」を指定しているので、Chromiumブラウザが起動してページが表示されます。あとはこれまで通り印刷ウィンドウでPDFを保存を選択して出力するだけです。だいぶ簡単になりましたね。
なお、その後Chrome側でバグが修正されたとのことなので今は古い方のスクリプトでも問題なくPDF生成はできるようです。
(2023.12.14)
タグ: PDF, vivliostyle
カテゴリー: 未分類 | コメントはまだありません »
2023/07/13
EPUBをリリースする前には必ずW3Cの公的なチェッカーであるEpubcheckに通してエラー等が出ていないかを確認する必要がありますが、そのEpubcheckに制作サイドとしては結構重要な変更があったようなので書いておきます。
OPFのManifestに記述されていないファイルがパッケージに入っていてもエラーにならなくなった
どうもEpubcheckのバージョンが4.2.6から5.0.0に上がる際にかなり重要な変更があったようです。具体的には4.2.6まではEPUB内のManifestに記述されていないファイルがパッケージ内にあることは許容されておらず、エラー扱いになっていましたが、5.0.0ではエラーにならなくなりました。
https://github.com/w3c/epubcheck/releases のEpubcheck v5.0.0のFeaturesにある
report as a usage when no reference were found to manifest items (09244a4), closes #1452
report as usage container resources not listed in manifest (f81b423)
が関連するらしいとのこと。
まあ5.0.0以降でもEpubcheckの実行時に-uオプションを付けることでファイルの混入をチェックすることはできるようなのですが、扱いとして「エラーではない」ことになったということです。
Epubcheckの出してくるアラートの区分
ここであらためてEpubcheckの出すメッセージの種類を確認しておきます。以下の4種類の分類があるようです。
・Fatal Error(致命的エラー)
・Error(エラー)
・Warnings(警告)
・Usage(利用法情報)
このうち、Fatal ErrorおよびErrorは修正しないと流通が許されない種類のもので、Warningsは警告程度のニュアンスなので流通させること自体は問題ないはずですが、電子取次の規約を理由に修正を求められることはあるようです。まあ「非推奨」くらいの意味合いかと思いますので新規にデータを作る際には直した方が無難ではあるでしょう。Usageは単なる内部データの状況のレポートなので出ていても問題は無いはずです。とは言え今回のポイントである意図しないファイルがEPUBパッケージ内に入ったまま流通してしまうことはもちろん良くはないので、管理面でチェックしておきたくはあります。
また、Fatal Error/Error/Warningsは「標準エラー出力」でアラートを出しているようですが、Usageは「標準出力」扱いなので、ターミナル等でepubcheckを直に使う分には問題ないですが、外部言語等でアラートの内容を取得している場合には「2>&1」のような指定を追加してメッセージをマージする必要があるようです。
-uオプションで混入自体は検出できるが・・・
さて前述したように、
|
java -jar Epubcheckのフォルダへのパス/epubcheck.jar -u テストファイルへのパス/test.epub |
のように-uオプションを指定すればmanifestに記述されていないファイルの混入をチェックすることはできます。ただし、電書協ガイドのテンプレートに入っているstyle-check.cssに関連するレポートもたくさんUSAGE扱いで出てきてしまいます。これはEpubcheckの機能での選別はできそうにないので、USAGE扱いの中の特定のメッセージだけを出したければ後からフィルタリングするしかないことにはなります。まあstyle-check.css自体、内容確認の際にだけ有効にして使うためのものですので消しても実害はないはずですが、電子取次の内部チェッカーで引っかかって戻ってくる可能性が無いとも言えないのでできればそのままにしておきたいところです。
Epubcheckのアラートをフィルタリングして必要なものだけ出すようにしてみる
ということでちょっとコードを書いてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
use utf8; ######### Epubcheckを-uオプション付きで実行し、電書協ガイドのstyle-check.css関連のアラートを除外して結果を出力する ######### #Encodeモジュールをインポート use Encode qw/encode decode/; #epubcheckのファイルパスを指定 my $epubCheckPath = $ARGV[0]; $epubCheckPath = decode('UTF-8', $epubCheckPath); #チェックするepubのファイルパスを指定 my $epubFilePath = $ARGV[1]; $epubFilePath = decode('UTF-8', $epubFilePath); #epubcheckを実行して結果を取得 my $epubFilePathEscaped = "'" . $epubFilePath . "'"; my $epubcheckcommand = "export _JAVA_OPTIONS=-Dfile.encoding=UTF-8;java -jar " . $epubCheckPath . " -u " . $epubFilePathEscaped . " 2>&1"; my $epubcheckResult = `$epubcheckcommand`; #epubcheck実行結果を出力 my @selectedLogTexts; $epubcheckResult =~ s@\x0D\x0A@\x0D@g; $epubcheckResult =~ s@\x0A@\x0D@g; @epubcheckResultTxts = split("\x0D",$epubcheckResult); #style-check.css関連のアラートをハネる foreach (@epubcheckResultTxts) { unless ($_ =~ /^USAGE.+?style\-check\.css.+?$/){push(@selectedLogTexts, $_);} } $epubcheckResult = join("\x0D\x0A",@selectedLogTexts); print $epubcheckResult . "\r\n"; exit; |
ぐらいの感じでしょうか。ターミナルで
|
perl このコードのファイルのパス epubcheckのパス チェックするEPUBのパス |
の形で指定すれば使えます。
これを取り込んだ「EPUB3トータルデータチェッカー2.5.0」はこちらからダウンロードできます。
(2023.7.13)
タグ: epubcheck
カテゴリー: 未分類 | コメントはまだありません »