背景
機能満載のサイボウズLiveが2019年4月15日をもってサービスが終了します。
無料ということもあり、地域活動や家庭内でも利用されている方が多かったのではないかと思います。私自身も子供の保育園で利用していたために、移行先を検討中です。
また、蓄積されているデータはCSVとして出力できますが、そのままでは読みにくいのでどうにかする必要があります。いくつかのサービスはCSVのインポートに対応することを宣言していますが、現状では有料サービスしか見当たらないのがつらいところです。
そこで、CSVをそこそこ読みやすいPDFに変換し、とりあえず掲示板ぐらいは読めるようにしておこうというのが今回の趣旨です。
使うもの
- python3
- ReportLab
CSV処理
「標準形式」を使用しました。掲示板のカラム定義は以下の通りです。
"ID","タイトル","本文","作成者","作成日時","更新者","更新日時","コメント"
みたところ問題なさそうですが、「コメント」がやや曲者です。一つの投稿に対して複数のコメントがぶら下がるので、CSVでは以下のように表現されています。
--------------------------------------------------
2: 投稿者名 2018/1/1 (月) 00:00
あけましておめでとうございます!
--------------------------------------------------
1: 投稿者名 2017/12/31 (日) 23:59
来年もよろしくお願いいたします
--------------------------------------------------
内部的に一個一個のコメントを切り出して扱うために以下の処理を行いました。
57 for raw_comment in raw_comments.splitlines()[:-1]:
58 if raw_comment == '--------------------------------------------------':
59 marker = True
60 continue
61
62 m = re.match(
63 r'(\d+): (.*?) (\d{4})/(\d{1,2})/(\d{1,2}) (.*) (\d{1,2}):(\d{1,2})',
64 raw_comment
65 )
66
67 if marker and m:
68 index = m.group(1)
69 submitter = m.group(2)
70 year = m.group(3)
71 month = m.group(4)
72 date = m.group(5)
73 hour = m.group(7)
74 minute = int(m.group(8))
75 dt = '{}/{}/{} {}:{}'.format(year, month, date, hour, minute)
76
77 if next_comment:
78 next_comment.body = '<br />\n'.join(body[1:-1])
79 comments.append(next_comment)
80
81 next_comment = Comment(index, submitter, dt, '')
82 body = []
83
84 else:
85 if next_comment:
86 body.append(raw_comment)
87
88 marker = False
89
90 if next_comment:
91 body.append(raw_comment)
92 next_comment.body = '<br />\n'.join(body[1:-1])
93 comments.append(next_comment)
動作としては、セパレータ(--------------------------------------------------
)の次の行が投稿メタデータに一致した場合に投稿の区切りと判断しています。
PDF出力
ReportLab の ParagraphStyle
を利用して出力しています。文の折り返し等は自動的に行われるので便利です。ただし、改行は <br />
を入力する必要があるため注意が必要です。
また、日本語を表示したい場合には日本語フォントが必要です。今回はIPAゴシックが同じディレクトリにおいてあるものとして処理しています。
一番上に投稿、続いてコメントを降順で出力します。また、投稿ごとに改ページしています。
ソース
今後の予定
- ReportLabをもうちょっと理解する
- 目次追加
- CSV解析とPDF出力の分離
- 掲示板以外の対応
- 見た目をかっこよく