[2] 。
ここでは、筆者が追加、修正した部分について説明します。
「YDML(Yonemitsu Densho Markup Language)」の解釈
青空キンドルは青空記法をLaTeXのソースコードに変換しているため、YDML(Yonemitsu Densho Markup Language)を解釈してLaTeXのソースコードに変換するように変更しました(YDMLの記法については第4回 を参照してください。変換方法も、第4回でも記載されていたepubと同じく正規表現を使用しています。
たとえば、以下のような「YDML」マークアップがあった場合、
マークアップを入れた本文ファイル
ふつうの文字はこれくらいですが
<large>文字大きくしたり</large>
<small>文字小さくしたり</small>
<bold>太文字にしたり</bold>
<ruby>ルビ/るび</ruby>をふったりできます。
このように変換されます。
LaTeXのソースコードに変換した結果
ふつうの文字はこれくらいですが、
{\LARGE 文字大きくしたり}
{\scriptsize 文字小さくしたり}
\textgt{太文字にしたり}
\ruby{ルビ}{るび}をふったりできます。
上記のソースコードは最終的には以下のようなPDFとなります。
図2 PDFに変換した結果
縦組から横組への変更
青空キンドルはもともと縦組のPDFファイルを作成するようになっていましたが、開発当初は一部の半角記号の表示がうまくいかなかったため横組に変更しました。テキストからLaTeXのソースコードへの変換処理と、LaTeXのスタイルファイルに修正を加えることで対応できました。
PDF文書のマージ
青空文庫は一つの作品が一つのテキストファイルになりますが、電書の本文ファイルは章ごとにファイルが別れています。そのためいったんは一つのファイルにまとめてから変換することも検討しましたが、作成時にエラーが発生した場合の箇所特定のため、そのまま各章毎にPDFに変換することにしました。章毎に作成したPDFファイルは、the pdf toolkit というPDFファイルを編集するフリーのツールで連結しています。
PC版の対応
当初は青空キンドル/iPhone用の設定をそのまま使っていたため文字が大きく、PCで見ると一画面に表示される文字数が少ないため読みづらい、との意見がありました。このため、文字を小さくしたPC版も作成しました。
今は、一つの元ファイルから、キンドル版とPC版の両方を作成しています。また、開発当初(2010年4月)キンドルには日本語フォントがなかったため、キンドル版はフォントを埋め込んでPDFを作成しています。フォントを埋め込むとファイルサイズが大きくなるため、PC版についてはフォントを埋め込まないようにしています。
追加開発
以上を2010年5月23日開催の第10回文学フリマまでに開発しました。そして、2010年7月17日開催の第一回電書フリマのために追加開発した機能が以下となります。
縦組追加
小説等は文字を縦組にしたいという要望を受けました。開発当初はうまく表示できなかった半角記号について対応策が見えたため、縦組についても作成できるようにしました。今は変換時に縦組と横組を選べるようになっています。
画像オンリー
テキストファイルからPDFを作成する処理が完成した後で、画像をページいっぱいに表示しようとしても、レイアウト上の都合でマージンが残ることが分かりました。一方で、マンガや写真を電書にするときにはマージンを省きたい、という要望も増えてきました。
このため、画像ファイルをそのままPDFファイルに変換する処理を作成しました。こちらは、pure Rubyのライブラリである、Prawnを使用しています。
キンドルの仕様変更への対応
2010年7月前後にキンドルがバージョンアップしたときに、横組のPDFの表示に仕様変更が入りました。縦方向にセンタリングされるようになったのです。キンドル/iPhone用のPDFは1ページに16行入りますが、8行しかない場合はその8行が真ん中に表示されてしまいます。第一回電書フリマ直前に発覚したため焦りましたが、足りない行数分だけ白い点を入れて必ず1ページ16行にするように修正を入れました。
Prawn
Prawn はPDFを扱うライブラリで、非常にシンプルなコードでPDFを作成することができます。たとえばテキストをPDFにする場合には、以下の手順で作成できます。
「Make PDF by Prawn」と書かれたPDFを作成するコード
require 'prawn'
pdf = Prawn::Document.new
pdf.text("Make PDF by Prawn")
pdf.render_file('prawn.pdf')
jpgファイルをPDFに変換する処理は、以下のようになります。
img.jpgという画像ファイルを元に、横600、縦800のimg.pdfPDFファイルを作成するコード
require 'prawn'
pdfsize = [600,800]
pdf = Prawn::Document.new(:page_size => pdfsize, :margin => 0) pdfsize, :margin => 0) 0)
pdf.image "image.jpg", :position => :center, :vposition => :center, :fit => pdfsize :center, :vposition => :center, :fit => pdfsize :center, :fit => pdfsize pdfsize
pdf.render_file "image.pdf"
上記のようにして作成したPDFを、通常の電書と同様にthe pdf toolkitで結合してひとつの電書にしています。
まとめ : 電書部で作成可能なPDF
現在、電書部で作成できるPDFは以下の5種類です。
キンドル/iPhone用縦組PDF
PC用縦組PDF
キンドル/iPhone用横組PDF
PC用横組PDF
画像オンリー
なお、画像オンリーで使用しているPrawnはこの後に説明するメールアドレスの埋め込みにも使用しています。
購入者のメールアドレス埋め込み
第1回、第2回で説明した通り、電書サーバーは当初GAEにホスティングする予定だったので、JavaのライブラリであるiTextの使用を検討していました。しかし、電書サーバーのホスティング先がHerokuになったことから、pure RubyのライブラリであるPrawnを使用して作成しました。
なお、当時リリースされていたPrawn0.8ではPDFを編集することができませんでした。そこで開発グループの過去のQAを元に、開発中のバージョンを試してみることにしました。ダウンロードしてすぐ試したところ、テンプレートとなるPDFファイルのサイズが取得できずにエラーになりました。このため、取得に失敗した場合は、電書部で作成したPDFのサイズをデフォルト値に設定するようPrawnに修正を入れたところ、以下のようなコードでメールアドレスを追加できるようになりました。
densho.pdf というPDFファイルの各ページにmail@gmail.comというメールアドレスを埋め込んで、densho+mail.pdfというPDFファイルにするコード
require 'prawn'
pdf = Prawn::Document.new(:template => "densho.pdf") "densho.pdf")
pdf.page_count.times do |i|
pdf.go_to_page(i+1)
pdf.text "mail@gmail.com"
end
pdf.render_file densho+mail.pdf
現在は開発中のバージョンに筆者が修正を入れたPrawnを電書サーバーにアップロードして、メールアドレスを埋め込んでいます。
ただし、WORDから作成したPDFではエラーになる、パブーで作成したPDFでは鏡文字になるなど、PDFの作成方法によっては問題が起きています。原因については不明ですが、PDFへの追記をサポートするバージョン1.0がまもなくリリースされるはずなので、その後に開発グループに報告を入れたいと考えています。
今後の対応予定
第4回で紹介されているように新しいパーサーが開発されたため、PDF形式の電書作成にもそちらを取り込むことを検討しています。
また、開発当初(2010年4月前後)はPDFを作成する手段が少なかったのですが、現在はパブーなどでも簡単に作成できます。現在は電書部で作成したPDFにしかメールアドレスを埋め込むことはできませんが、作成方法に関わらずメールアドレスが付加できるようにしたいと考えています。
最後に
PDF形式の電書作成は、青空キンドルなしでは実現できませんでした。takayama氏、齋藤修三郎氏ご両名にこの場を借りてお礼を申し上げます。