電書部技術班、電子書籍配信サーバーに挑む

第6回電書原稿からPDFをつくりだす

今回はPDF形式の電書を作成する仕組みについて説明します。既に原稿フォーマットについては第4回で説明したので、元となる原稿からPDFを作成する部分を中心に説明していきます。

PDF

PDF(Portable Document Format)は、現在幅広く使用されているファイルフォーマットです。PCではもちろんのこと、キンドルや iPhoneでも同様のレイアウトで読むことができます。電書部ではキンドルで読めるようにするために、当初からPDF形式の対応が必須の要件になっていました。

開発を志したきっかけ

第1回でも触れられていたとおり、最初にPDFを作成して販売したのは2009年12月9日に開催された第9回文学フリマでした。そもそもの発端は米光初代部長の「キンドルで売ったら絶対話題になる!」という一言でした。正直ぴんと来ていませんでしたが、新しいものが好きだったのでやってみることにしたのです。

私達は文学フリマでbnkrという同人誌を販売する予定で、印刷用のPDFファイルをInDesignを使用して作成していました。しかし、そのままでは文字が小さくてキンドルで読むには不向きです。文字を大きくすると今度はレイアウトが崩れるなど、微調整に時間がかかり、結局元の原稿からコピーペーストして、WordでPDFを作成しました。当日朝の5時まで作業を繰り返し、もうろうとする意識の中で、簡単にPDF化できるようにしようと決意しました。

当初の要件

PDF形式の電書に関する要件は、大きく分けて以下の2つです。

  • 電書部のフォーマットに沿って作成されたファイルを元に、PCとキンドルで表示できるPDFを作成する
  • 「精神的DRM」としてPDFに購入者のメールアドレスを埋め込む

開発開始当初は組版もPDFの知識もなかったため、自分で対応する部分をできるかぎり少なくするように既存のツールやサービスを組み合わせていきました。PDF形式の電書作成では青空キンドル、作成後のPDFに購入者のメールアドレスを埋め込む処理ではRubyのライブラリであるPrawnを中心にすえています。

以降で、それぞれの処理について説明します。

PDF形式の電書作成の流れ

PDF形式の電書は以下の流れで作成しています。青線で囲った部分と青い矢印で示した部分が青空キンドルで公開されていた処理、赤い矢印が私が追加、修正した部分です[1]⁠。

図1 okuduke.txt、01~03.txtを元にdensho.pdfを作成する場合の例
図1 okuduke.txt、01~03.txtを元にdensho.pdfを作成する場合の例

大きく分けて以下の順序で処理されます。

  1. ファイル名、作者名などの電書情報が記載されているokuduke.txtファイルから表紙(cover.tex)や奥付(okuduke.tex)のLaTeXソースコードを、各章毎に別れている本文ファイルから本文のLaTeXソースコードを生成する
  2. 各ソースコードを元にPDFを作成する
  3. 各PDFを連結して、ひとつのPDFにする

このうちキモとなるLaTeXのソースコードとPDF作成部分を、青空キンドルで公開されている情報を元に作成しています。このため、まず青空キンドルから説明します。

青空キンドル

青空キンドルは、takayama氏が作成・公開されている、青空文庫のテキストを元にキンドルで読めるPDFファイルを作成するサイトです。また使用しているスタイルファイルは齋藤修三郎氏から提供されています。

青空文庫で公開されているテキストファイルは、青空記法という独自の記法に沿って書かれています。青空キンドルはRubyを使用して青空記法をLaTeXのソースコードに変換し、それを元にPDFファイルを作成しています。このとき、書式やレイアウトを指定するスタイルファイルも必要となります。これらのRubyスクリプト、LaTeXのスタイルファイルはすべてサイトで公開されています。PDF形式の電書作成処理は、これらのファイルを元に作成しました[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に変換した結果
図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氏、齋藤修三郎氏ご両名にこの場を借りてお礼を申し上げます。

おすすめ記事

記事・ニュース一覧