ラベル ReportLab の投稿を表示しています。 すべての投稿を表示
ラベル ReportLab の投稿を表示しています。 すべての投稿を表示

2008年4月3日木曜日

帳票を作ってみた

申請書類をReportLabで作ってみた。そう難しくはない。
ただし、目的の申請書類専用のハードコーディングになる。データベースと連携させて自動で帳票を出力したいとか、印刷の見栄えを制御したいとかでなければ使わないかも。
Webサービスに組み込むのは印刷機能との連携で面白いかもしれない。HTMLの印刷制御って難しいし。(というか、自分のWebサービスには組み込む予定)

変換ツールは作るの面倒そうだから市販ソフト使った方が良い。ハナからpdfを作りたいならやっぱりそれ専用のツールが良いと思う。(あるとすれば自分のサーバに仕込んでおいて、出先で使うとか。便箋とかノートとかToDoリストを出先で印刷する機会があれば)
自分で作ったソフトで、なんか紙に出力する予定がある場合には覚えておくと良いかもしれない。

ReportLabはドキュメントじゃなくてソースを読め

結局、ドキュメントを探すよりソースを読むのが一番早かった…
Python25\Lib\site-packages\reportlab\libとかに入ってる、styles.pyとか読むとよくわかる。(結局ソース見ればわかる話だし、ドキュメントはいらないって事なのかな)
StyleSheet1()クラスは、

def __init__(self):
def __getitem__(self, key):
def has_key(self, key):
def add(self, style, alias=None):
def list(self):

てなメソッドを持ってる。辞書型じゃないのね。でもキーは拾えると。

getSampleStyleSheetで拾えるスタイルは、

'Normal', 'BodyText', 'Italic', 'Heading1', 'Title', 'Heading2', 'Heading3', 'Bullet', 'Definition', 'Code'

の10種類だった。結局こりゃサンプルだから、自分で定義して使えって事みたい。

イメージ的にはTeXが一番近いかな。残念ながら横着は出来ないという結果になりました。
(でもSampleのを書き換えて使う予定。楽なんだもの)

簡単なParagraphStyleの定義方法

よくよく調べると、parentを指定するとその内容を引き継げることが判った。


stylesheet.add(ParagraphStyle(name='BodyRightText',
parent=stylesheet['BodyText'],
alignment=TA_RIGHT) )

とかすると、BodyTextの内容を引き継いで、上書きすることが出来る。
もちろんParaStyle.fontName = "HeiseiMin-W3"とかってやり方もできる。直接書き換えてしまう。

でも、親を引き継いで新しく指定する方がスマートな気がする。
しかし、HeiseiMin-W3とHeiseiKakuGo-W5しか無いのがなあ。まあadobeがフリーで出してる言語パックだし仕方がないが…

ReportLabで使えるSampleStyleSheetのstyle名

結局、サンプルスタイルシートはサンプルでしかないのか。
自分で作れって事なのかもしれない。

from reportlab.lib.styles import getSampleStyleSheet
styles = getSampleStyleSheet()
TitleStyle = styles['Title']
HeaderStyle1 = styles['Heading1']
HeaderStyle2 = styles['Heading2']
HeaderStyle3 = styles['Heading3']
#HeaderStyle4 = styles['Heading4']
#HeaderStyle5 = styles['Heading5']
#HeaderStyle6 = styles['Heading6']

ParaStyle = styles['BodyText']
#ParaCenterStyle = styles['BodyCenterText']
#ParaRightStyle = styles['BodyRightText']
#IndentStyle = styles['Indent']
BulletStyle = styles['Bullet']
# new styles
#IndentIndentStyle = styles['IndentIndent']
#BulletIndentStyle = styles['BulletIndent']
PreStyle = styles['Code']

結局、'Title', 'Heading1', 'Heading2', 'Heading3', 'BodyText', 'Bullet', 'Code'sしか定義されてない。

     stylesheet.add(ParagraphStyle(name='BodyRightText',
parent=stylesheet['BodyText'],
alignment=TA_RIGHT) )


みたいな形で定義してやるしかないのかも。日本語だから結局そうなるんだけどね。
ただ、一回作ってやれば後々まで応用が利くので、暇なときに作り込むのも良いかもしれない。

ReportLabのStyleSheetについて

わーいHelloWorldかけたーじゃなくて、まともにpdfを作ろうとすると、ParagraphStyleを使いたくなる。
日本語だと、せっかく定義されてるParagraphStyleが使えないのは、前述の通り。
…そもそも、英文のParagraphStyleの一覧自体がreference.pdfに載っていないというとんでも具合。
reportlab-usersのMLアーカイブで見つけた。

platypus examples in version 1.2って書いてあるので古いんだろうけど。

styles = get_stylesheet()

TitleStyle = styles['Title']
HeaderStyle1 = styles['Heading1']
HeaderStyle2 = styles['Heading2']
HeaderStyle3 = styles['Heading3']
HeaderStyle4 = styles['Heading4']
HeaderStyle5 = styles['Heading5']
HeaderStyle6 = styles['Heading6']

ParaStyle = styles['BodyText']
ParaCenterStyle = styles['BodyCenterText']
ParaRightStyle = styles['BodyRightText']
IndentStyle = styles['Indent']
BulletStyle = styles['Bullet']
# new styles
IndentIndentStyle = styles['IndentIndent']
BulletIndentStyle = styles['BulletIndent']



PreStyle = styles['Code']

って事らしい。
もちょっと探してみよう。絶対リファレンスには載ってると思うんだがなあ。

2008年4月2日水曜日

ReportLabを使ってみる

pythonでpdfを作成しようとするとひっかかるReportLab
http://www.reportlab.org/

Reportというだけあって、英文であれば簡単にPDFのレポートが作成できそう。報告書とか見栄えを気にしないような書類を作成するのは楽ちん。
問題は日本語。「ReportLab Library is 2.1.」だと、特に問題なく日本語の作成までは通る。
Windowsでやってみてるから、「Precompiled DLLs」もダウンロードして使ってみた。Python2.5版を使った。
(ReportLab Toolkit Version 1もダウンロードできるけど、紛らわしいから止めて欲しい。それでハマった)
Acrobatのフォントを探してきて使えるようにしてくれる。Version 1はAcrobatの5までになってて、ハマりがち。Version2.1.だと、Acrobatの9まで自動で探すようになってる。
\Python25\Lib\site-packages\reportlabのrl_config.pyのなかの、~SearchPathでフォントを探してるので(CMapSearchPathとか)、そこを確認したら使えるかも。Acrobat10とか使う頃にはReportLabもヴァージョンアップしてるだろうけど:-)


from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics

をインポートして
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
をセットしておくだけで、基本的には使える。
ただ、使えるだけじゃ意味がない。

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, SimpleDocTemplate
from reportlab.lib.pagesizes import letter
styles = getSampleStyleSheet()
styleN = styles['Normal']
styleH = styles['Heading1']
story = []
story.append(Paragraph("This is a Heading",styleH))
story.append(Paragraph("This is a paragraph in Normal style.", styleN))
doc = SimpleDocTemplate('mydoc.pdf',pagesize = letter)
doc.build(story)

とかで、英文であればあっさりそれっぽいPDFが作成できる。正直、グラフや表を使わない報告書ならこれで十分対応できる。

日本語だと

from reportlab.lib.styles import ParagraphStyle
styleJ = ParagraphStyle(name='Normal',
fontName='HeiseiKakuGo-W5',
alignment = 0, #or TA_LEFT, TA_CENTER, TA_RIGHT of 0, 1, 2
fontSize=10,
leading=12)

とかで、スタイルを定義してやる必要がある。仕方がないんだが面倒だなあ…
(定義してやれば、Paragraphでちゃんと書き出してくれる)

表組みを使うときも、英字であればちゃんと「右寄せ」とか「中央寄せ」とか通るのに日本語だと通らない。(Paragraphで右寄せ中央寄せは通る。だから、Paragraphで定義してやって表組みするのが正解)

pythonでなんか大量にpdfにしたいとかなら便利かも。ただ、通常はフリーソフトとか良いのがいっぱいあるし、そっち使うのが無難かと思う。組み込み向けかなあ。