LoginSignup
261
229

Markdownで技術同人誌のPDFが生成できるOSSを公開しました

Last updated at Posted at 2023-11-05

こんにちは、以前 FlightBooksというサービスを立ち上げていたのですが、2年ほどメンテしていなかったため、ローカル動作するOSS版として公開することにしました。

OSS版を作るにあたり、エディタ部分はVSCodeなりお好きなエディタを使ってもらうとして、

  • MarkdownからHTMLを生成する部分
  • HTMLからPDFを生成する部分

を切り出して公開しました。

ほかのサービスや技術と何が違うの?

技術書をマークアップテキストで書くプラットフォームとしては、Re:VIEW、Vivliostyleなどがありますが、FlightBooksは「出版やDTPに関する知識がなくても印刷所にだしたい」というエンジニア諸氏のために開発されました。

「商業印刷」にどこまで向き合うか

ご家庭のプリンタに印刷を指示すると、ファイルの情報がプリンタドライバに送信され、そこでインクの出し方を制御するためのデータに変換されます。印刷所での印刷も基本は同じで、データをRIPというものに送ると、印刷機が扱える形式にデータを変換します。

しかし商業印刷、とくに版を作って大量印刷するオフセット印刷では以下のような点が異なります。

  • 1色ごとに印刷するので、いい感じに色が再現できるバランスで色の3原色を混ぜないといけない。
  • 印刷したい人が見ている色にできるだけ忠実に再現したい
  • 製作者のパソコンにインストールされているフォントがRIPにインストールされているとは限らない
  • 紙はだいたい模造紙みたいなサイズに一気に複数ページ印刷して後で裁断する方式

そのため、画像はCMYK形式で350dpi、用紙は一回り大きいサイズでデータを用意して実際の紙のサイズにはトンボと呼ばれるマークで裁断位置を指定、裁断が1mmずれてもいいように3mm大目に背景色を塗っておく、ノンブルと呼ばれるページ数を必ず埋め込むように、フォントは埋め込みまたはアウトライン化などなどを施す必要があります。

しかし同人印刷所はこの辺をよしなに対応してくれるので、同人印刷所ではカバーしきれないフォントの埋め込みと、上下左右の余白をちゃんととってノンブルを合成することだけFlightBooksで担っています。イラスト同人誌などと違い、技術同人誌は紙の端っこまで印刷することはほぼないですからね。

同人印刷所に「仕上がりサイズのPDF原稿です、テキスト主体なので塗足しなし、カラーはRGB、フォント埋め込み済みです」という呪文を唱えれば受け付けてもらえるはずです。

Re:VIEWやVivlioStyleは残りの項目にも対応していますが、中身はpress-readyを使っているようなので、ご自身でpress-readyを活用すれば同人印刷所以外でも印刷できるようになるかもしれません(未検証)

「組版」にどこまで向き合うか

さて、印刷所に出せるデータが作れるとわかりましたが、つぎは「本」としての体裁をどこまで作りこむかです。本には表紙、裏表紙、中表紙などがあり、本文に入る前に「はじめに」や目次、奥付や「おわりに」がありますね。

ページの中でも章タイトルや見出しなどがあります。画像を挿入したら下部にキャプション「図6.1:Like数の推移」などを入れたいかもしれません。このテキストや画像などを紙の中にどうレイアウトするかが「組版」とよばれています。そしてそこにも専門用語が多数登場します。

出典:日本印刷技術協会

出典:https://www.jagat.or.jp/archives/25594

これらを何らかの技術でレイアウトとして実現しなくてはなりません。Re:VIEWは原則TeXで、FlightBooksとVivlioStyleはHTMLとCSSで実現していますが、特にこだわりのないエンジニアも多数いると思い、FlightBooksではシンプルなテンプレートとして提供しています。

妥協した部分としては、目次にページ数がありません。PDFを生成するまでどこが何ページになるかわからないためです。同様の理由で右のページと左のページで余白サイズを変えることもしていません(一般的に書籍は紙の真ん中で折って綴じるのでその分余白が大きいほうが読みやすい)また、〇章を参照といった自動リンクや脚注表記にも対応していません。

設計思想として、できることが少ない=使い始める時に知っておかないといけないことが少ないを目指しています。

FlightBooksではMarkdownをPDFに変換するためにNodeJS/HTML/CSSを用いているため、これらの知識を活用すれば自分でカスタマイズすることも簡単です。

コード品質については本職のエンジニアではないので、期待しないでください。2年前のコードを引っ張り出してChatGPT先生とペアプロしながら公開することができました。

使い方

https://github.com/ku-suke/flightbooks をcloneして、ビルド環境を整えます。おすすめはDockerで、以下のコマンドを打ち込めばbuild/ディレクトリにPDFが生成されます。

docker compose build
docker compose run flightbooks node generate_html.js
docker compose run flightbooks node generate_pdf.js

最終的なPDF以外にも

  • Markdownを単純にHTMLにしたもの
  • HTMLをPDFに変換したもの(ページ番号・メタデータなし)

が中間生成物として出力されますので、お好みでいじってみてください。

要望や不具合に関しては?

Twitter(X)でつぶやくか、ここにコメントをするとひとまず目は通します。しかし対応できる技術力があるとは限らないので、PRを送っていただくのが一番たすかります。

261
229
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
261
229