rst2pdf で日本語PDF生成

GitHub - ralsina/rst2pdf: Use a text editor. Make a PDF.

いまさらなんですが、Django Hack a thon Disc8 ハンズオン C に参加した時、講師のイアンさんと松尾さんが、資料の ReST ファイルを PDF に出力していたので、これはパクらねば、と思いたったもので。

ちなみに MacPorts 常用。PIL, Docutils, ReportLab はインストール済み。

rst2pdf のインストール

rst2pdf-0.10.1.tar.gz をダウンロードして解凍。

インストール::

  $ cd rst2pdf-0.10.1
  $ sudo python setup.py install
  ...
  Installing rst2pdf script to /opt/local/Library/Frameworks/Python.framework/Versions/2.5/bin
  ...

/opt/local/bin 以下に rst2pdf のシンボリックリンクを張っておしまい。

埋め込み用フォントをインストール

VLゴシックをダウンロードしてインストール。

  • ~/Library/Fonts/VL-Gothic-Regular.ttf
  • ~/Library/Fonts/VL-PGothic-Regular.ttf

実行してみる

テスト用の ReST は、ハンズオンCのドキュメントを使用(test.rst にリネーム)。
そしてtokibito さんの日本語設定を、VLゴシックだけを利用するように修正して使わせて頂きます(test.json)。

  {
    "embeddedFonts" :
  [["VL-Gothic-Regular.ttf","VL-PGothic-Regular.ttf","VL-Gothic-Regular.ttf","VL-Gothic-Regular.ttf"]],
    "fontsAlias" : {
      "stdFont": "VL-PGothic-Regular",
      "stdBold": "VL-PGothic-Regular",
      "stdItalic": "VL-PGothic-Regular",
      "stdMono": "VL-Gothic-Regular"
    },
    "styles" : [
      ["base" , {
        "wordWrap": "CJK"
      }],
      ["literal" , {
        "wordWrap": "None"
      }]
    ]
  }

スタイルシートを指定して実行

  $ rst2pdf -s test.json -o test.pdf test.rst
  [ERROR] styles.py:218 Error processing font VL-Gothic-Regular: Can't open file "VL-Gothic-Regular.ttf"
  [ERROR] styles.py:219 Registering VL-Gothic-Regular.ttf as Helvetica alias
  Traceback (most recent call last):
    File "/opt/local/bin/rst2pdf", line 8, in <module>
      load_entry_point('rst2pdf==0.10.1', 'console_scripts', 'rst2pdf')()
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/createpdf.py", line 1435, in main
      footnote_backlinks=options.footnote_backlinks,
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/createpdf.py", line 94, in __init__
      self.styles = sty.StyleSheet(stylesheets, fontPath, stylePath)
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/styles.py", line 256, in __init__
      fname, pos = findfonts.guessFont(style[key])
    File "/opt/local/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/findfonts.py", line 247, in guessFont
      family, mod = fname.split('-')
  ValueError: too many values to unpack

おりょ、フォントフォルダ(~/Library/Fonts)も指定しましょ。

  $ rst2pdf -s test.json --font-folder="~/Library/Fonts" -o test.pdf test.rst
  [ERROR] styles.py:218 Error processing font VL-Gothic-Regular: Can't open file "VL-Gothic-Regular.ttf"
  [ERROR] styles.py:219 Registering VL-Gothic-Regular.ttf as Helvetica alias
  Traceback (most recent call last):
    File "/opt/local/bin/rst2pdf", line 8, in <module>
      load_entry_point('rst2pdf==0.10.1', 'console_scripts', 'rst2pdf')()
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/createpdf.py", line 1435, in main
      footnote_backlinks=options.footnote_backlinks,
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/createpdf.py", line 94, in __init__
      self.styles = sty.StyleSheet(stylesheets, fontPath, stylePath)
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/styles.py", line 256, in __init__
      fname, pos = findfonts.guessFont(style[key])
    File "/opt/local/lib/python2.5/site-packages/rst2pdf-0.10.1-py2.5.egg/rst2pdf/findfonts.py", line 247, in guessFont
      family, mod = fname.split('-')
  ValueError: too many values to unpack

ありゃ、同じだ。あそか、絶対パスで指定しましょ。

  $ rst2pdf -s test.json --font-folder="/Users/xxx/Library/Fonts" -o test.pdf test.rst
  test.rst:73: (WARNING/2) Title underline too short.
  
  poll \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002
  --------------------------------------------
  test.rst:73: (WARNING/2) Title underline too short.
  
  poll \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002
  --------------------------------------------
  [WARNING] flowables.py:386 BoundByWidth too wide to fit in frame: <BoundByWidth at 0x1a9b9e0> size= maxWidth=0x
  $ ls test.pdf
  test.pdf

おー、エラーがなくなって PDF が生成されました。