« ◇いきなりPDFは詐欺製品? | トップページ | ◆青空文庫とPDF化とページレイアウトと「柿の種」 »

◆青空文庫をPDF化するツール (ソースも公開)

青空文庫の書籍をPDF化 (見開き、右綴じ、ヘッダー、ページ番号、表紙)

文字サイズとしてLARGEとHUGEを用意してあります。

LARGEサイズ
HUGEサイズ

 青空文庫本をPDFに変換するツール

ネット図書館「青空文庫」所蔵のデータをPDF化するツールを作成しました。

Pythonで作成されており、青空文庫からダウンロードした.txtファイルをB6/縦書き/右綴じの.pdfに変換します。
ページ数の多い本でも把握しやすいように、タイトルと見出しをヘッダに出し、ページ番号をフッタに出します。

   python AozoraPDF.py -in 01yoakemae1_jo.txt島崎藤村『夜明け前』.pdf

AdobeReader,QUADRENOで確認してあります。

青空文庫のデータは次のサイト
https://www.aozora.gr.jp/
からダウンロードできます。

作家名や作品名で引けるようになっており、本のタイトルをクリックすると開くページの「ファイルのダウンロード」項の[ファイル種別 テキストファイル(ルビあり)]列の.zipをクリックすると目的のtxtの入った.zipがダウンロードできます。

 ツールのダウンロードと起動

ツールはPythonで作成されており、Pythonと、Pythonの次のライブラリのインストールが必要です。

pip install reportlab
pip install pypdf

ツールは次のURLでダウンロードできます。
http://k-hiura.cocolog-nifty.com/blog/files/aozorapdf0.0.9.zip

aozorapdfx.y.z.zipの内容は次のものです。プログラムの他txt->PDFサンプルも入っています。
0.0.9でGUI起動、exe化も実装しました。

  AozoraPDFx.y.z
  +-- bin
  |   +-- AozoraPDF.py        # Pythonプログラム
  |   +-- 青空文庫.jpg        # 青空文庫ロゴ(表紙用)
  |   `-- A01_build.bat       # AozoraPDF.exe作成
  +-- test
  |   +-- A00_clean.bat       # 生成したpdfを消去する
  |   +-- A01_test.bat        # 試験起動
  |   +-- A02_font_test.bat   # 各種フォントの試験を行う
  |   +-- A05_guiTest.bat     # Python-GUI起動
  |   +-- A06_exeText.bat     # GUI-exe起動
  |   +-- 01yoakemae1_jo.txt  # 青空文庫からダウンロードした「夜明け前」
  |   +-- chikyutonan.txt     # 青空文庫からダウンロードした「地球盗難」
  |   +-- kakino_tane         # 青空文庫からダウンロードした「柿の種」
  |   |   +-- kakino_tane.txt # 「柿の種」テキスト
  |   |   +- *.png?2            # 「柿の種」が参照する画像
  | ・・・ 以下A01_test.batで作成されるもの ・・・
  |   |   +-- (寺田寅彦『柿の種』.pdf) # 本ツールで作成したPDF「柿の種」
  |   |   |                   # "-out_dir @"オプションで入力txtのディレクトリ
  |   |   +-- (寺田寅彦『柿の種』.PRE.pdf)  # -pre   -suffix PRE
  |   |   +-- (寺田寅彦『柿の種』.POS.pdf)  # -post  -suffix POS
  |   |   +-- (寺田寅彦『柿の種』.COV.pdf)  # -cover -suffix COV
  |   |   +-- (寺田寅彦『柿の種』.COV_a.pdf)# (.COVと同じだが ビューワ操作を想定)
  |   |   `-- (寺田寅彦『柿の種』.NONE.pdf) # -none  -suffix NON
  |   +-- (島崎藤村『夜明け前』.pdf)    # 本ツールで作成したPDF「夜明け前」
  |   +-- (島崎藤村『夜明け前』.L.pdf)  # 本ツール"-large -out +"オプションで作成
  |   +-- (島崎藤村『夜明け前』.H.pdf)  # 本ツール"-huge -out +"オプションで作成
  |   +-- (宮沢賢治『銀河鉄道の夜』.pdf)  # 本ツールで作成し
  |   +-- (宮沢賢治『銀河鉄道の夜』.0.pdf)# 本ツール"-0"オプションで作成
  |   +-- (宮沢賢治『銀河鉄道の夜』.1.pdf)# 本ツール"-1"オプションで作成
  |   +-- (宮沢賢治『銀河鉄道の夜』.2.pdf)# 本ツール"-2"オプションで作成
  |   +-- (chikyutonan.pdf)   # 本ツールで作成したPDF「地球盗難」
  |   |                       # "-out @" オプションで入力txt名をpdfにし生成
  |   `-- fonts
  |       `-- *.pdf           # フォント試験結果のpdf
  `--(AozoraPDF)
      +-- AozoraPDF.exe
      `-- _internal
          `-- *

(参考)他の変換プログラムで生成したPDFをhttps://tatsu-zine.com/aozora/などで入手することが出来ます。

 起動法 コマンド引数

 python AozoraPDF -in 入力ファイル [-out 出力ファイル] [-add_cover_back] [-url ソースurl表示]
 引数
   -in  入力ファイル     : 青空文庫からダウンロードシタ.txt(ルビ付き)ファイル
  [-out 出力ファイル]    : 省略すると著者とタイトルから名称が作成される
                '@'を指定すると入力ファイルの.txtを.pdfに置き換え
  [-out_dir ディレクトリ]: -outを省略または'-'指定の時の出力ファイルのディレクトリ
                           省略するとカレントディレクトリ
                           '@'を指定すると入力ファイルのあるディレクトリ
  [-suffix 添え字]       : 出力ファイルに指定の添え字を付加」する
  [-normal]              : 標準の文字サイズで出力します。(デフォルト)
  [-large]               : 少し大きめの文字サイズで出力します。
  [-huge]                : 大きな文字サイズで出力します
  [-none   | -0]         : 表紙を付加しません
  [-single | -1]         : 単純に表紙を付加します(デフォルト)
  [-post   | -2]         : 表紙の後ろにパディングページを付加します。
  [-pre    | -p]         : 表紙の前にパディングページを付加します。
  [-cover]               : 表紙が単体表示されると解釈します。
  [-url urlソース]       : ダウンロード元のURL,表紙に表示される。省略すると表示なし
  [-font フォント]       : C:/Windows/Fontsしたのttcファイルを指定します。省略時:'HGRMB'
                           ファイル名の.ttcを省いて指定します。
(test/下のtest/batを参考にしてください)
-inを省略するとGUIが起動されます

経過表示は標準エラーに出力されます。

入力ファイル名と出力ファイル名のペアが;で繋がれて標準出力に出されます。

 .exe

次の場所に.exeのフォルダ(zip化してあります)を置きました。

AozoraPDF.zip

AozoraPDF.exeをクリックするとGUIが動きます。

GUIの仕様は ◆AozoraPDF.py(Python)のGUI化、exe化 にあります。

 見開き、右綴じ、表紙単独化をAdobeReaderで調整する

本ツールではまだ見開き表示で表紙だけ単独表示とする設定はできていません。本ツールで作成したPDFをAdobeReaderで変更することができます。

  [三 メニュー]
     [文書のプロパティー Ctr+D]
        ⇒「文書のプロパティー」窓
     「開き方」タブ
       ページレイアアウト [見開きページ]
          「詳細設定」タブ
       読み上げオプション
         綴り方         [右]

本ツールは見開き、右綴じでPDFを作成します。AdobeReaderでも設定を行うことができます。

  [三 メニュー]
     [文書のプロパティー Ctr+D]
        ⇒「文書のプロパティー」窓
     「開き方」タブ
       ページレイアアウト [見開きページ]
          「詳細設定」タブ
       読み上げオプション
         綴り方         [右]

 コード解説(メモ)

~書きかけ~

 基本

ライブラリreportlabを使ったPDFの作成は、canvasと呼ばれるページ空間に、位置を指定しながら文字を配置していくことで行われます。

1ページ分作成し終えたら、showPage()し、新たなページを作成、最後にファイルにsave()する形をとります。

右綴じ指定、タイトル、著者情報添付はライブラリでは行わず、出力されたPDFファイルにMetadata記述を追加する形をとります。

 ファイル、文字コード

青空文庫からダウンロードした.txtファイルはShift-jisです。Python内部はUTF-8になっています。PDF出力時は特に文字コード変換は必要ありません。

PDFはバイナリのものとtext型のものがあります。今回使用するライブラリreportlabで出力するPDFはtext型となります。
このため、最後に行うプロパティー操作も文字列ファイルとして取り扱うことができます。

      #-- 青空文庫.txtの読み込み
      lines:List[str]=[]
      with open(in_, 'r', encoding='shift_jis') as file:
         _lines = file.readlines()
      #-- 初期版PDFの読み込み
      with open(self.out_file, 'r') as file:
         while True:
            _line:str = file.readline()
      #-- プロパティー付加用
      with open(self.out_file, 'a') as file:
         file.write(f"{_Root_obj} {_Root_gen} obj\n")

 空間座標(x,y)、単位系、論理座標(行、カラム)

PDFのページ空間は左下が原点となります。座標をx,yで指定してdrawString(x,y,text)等でページ内空間に文字列を配置します。

プログラム上は数値にmmを掛けることでミリメータ数で扱う事が可能です。

例えばB6サイズの場合左下が(0*mm.0*mm)右上が(128*mm,182*mm)となります。

         self.page.drawString(_x*mm,_y*mm,pattern_[1])

文字位置の管理は行とカラムで行っており、行-カラムは右上が0-0としていますので、注意が必要です。本当に必要です。結構頭がパズります。
なお、カラムは全角を1とし、半角やルビ表示のためにfloatとなっています。

 フォント、縦書き、横書き

フォントは横書き用フォントを用い、記号類を回転、移動させています。

回転させるのは次のものです。
 "「」『』【】[]()〈〉《》≪≫<>{}〖〗…ー―=−"
次の文字は回転させず移動させます。
 "、。"

これらは今後追加する必要があると考えています。

縦書きでは1文字ずつカラム位置制御を行っています。

 ルビ付けのための漢字判定

ルビは漢字が連続する範囲に割り付けます。例外的に'々'と'※'はルビ範囲に入るようなので特別扱いしました。

   ・云々《うんぬん》

   ・『三※[#「兆+頁」、第3水準1-93-89]《さんちょう》の図』
     [から]までは前処理で削除し、三※に《さんちょう》を振る必要があり

   if '\u4e00' <= char_ <= '\u9faf' or char_=='々' or char_=='※':

 青空文庫のレイアウト、画像指定

次のレイアウト指定に対応

指定処置補足
[#字下げ]AAA[#「AAA」は大見出し] 大見出しとして
・改ページし
・指定位置に表示、
ヘッダーにも反映
対応
[#字下げ]AAA[#「AAA」は中見出し] 中見出しとして指定位置に表示、
ヘッダーにも反映
対応
[#改丁] 見開き左ページに位置づけ(新たな紙) 対応
[#改見開き] 見開き右ページに位置づけ(新たな見開き) 対応
[#改ページ] ページ送り 対応
[#ページの左右中央] 中央行に位置づけ(ページ位置づけ後) 解釈に問題あり
[#ここから字下げ]

[#ここで字下げ終わり]
区間内字下げ 対応
[#画像説明<(画像ファイル名)、横n×縦m)入る 画像挿入 比率は反映
サイズはページサイズ
[#地から1字上げ]・・・ 地寄せ文字列 これ以降改行までの文字を地から指定文字の位置に接地させる

これらの説明は図を使って 別記事 ◆青空文庫とPDF化とページレイアウトと「柿の種」 に置きました。

 右綴じ、著者、タイトル等のプロパティ追加

PDFの右綴じ指定は、PDF本文の後ろにプロパティー記述(Metadata記述)を付加することで行います。
(右綴じとは表紙から見て右側で綴じられていること)

PDFの最後に/Info,/Root,/Size情報があり、これを反映したプロパティー記述を追加します。 最初の%%EOFまでがオリジナルのPDFです。
数値は最初がRootオブジェクトの番号で/Rootの値を用います。
/Metadataの後ろは/Size情報です。
/Pagesの後ろは新たに作成するオブジェクト番号で/Info値に1を足したものとします
著者とタイトルは既存の/Infoオブジェクトに追加しますので/Info値を指定します。日本語文字は頭にFEFFを付けたUTF-16コードで<と>で囲みます。

trailer
<<
/ID 
[<5b0de2783ad9b25a96c6480cf86d1bbb><5b0de2783ad9b25a96c6480cf86d1bbb>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)

/Info 300 0 R
/Root 299 0 R
/Size 595
>>
startxref
1000089
%%EOF
299 0 obj
<<
/Metadata 595 0 R/PageLayout/TwoPageLeft/PageMode/UseNone/Pages 301 0 
R/Type/Catalog/ViewerPreferences<</Direction/R2L>>
>>
endobj
%%EOF
300 0 obj
<<
 /Title <FEFF5730740376D796E3>
 /Author <FEFF6D7791CE53414E09>
>>
endobj
%%EOF

 現状の問題と今後

現在次の問題点があります。

  • 見開き指定、著者等プロパティの設定をPDFファイルに文字列を追加することで行っている。 これをライブラリ使用に置き換えたい。
  • 表紙単体表示プロパティ設定
  • [#ページの左右中央]がブロック位置づけされていない

次の事を検討中です

  • 目次を付ける
  • サイズに関するパラメタを外出しjson化

|

« ◇いきなりPDFは詐欺製品? | トップページ | ◆青空文庫とPDF化とページレイアウトと「柿の種」 »