2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

サイボウズLiveでエクスポートしたデータをPDFに変換する

Last updated at Posted at 2018-03-09

背景

機能満載のサイボウズLiveが2019年4月15日をもってサービスが終了します。

無料ということもあり、地域活動や家庭内でも利用されている方が多かったのではないかと思います。私自身も子供の保育園で利用していたために、移行先を検討中です。

また、蓄積されているデータはCSVとして出力できますが、そのままでは読みにくいのでどうにかする必要があります。いくつかのサービスはCSVのインポートに対応することを宣言していますが、現状では有料サービスしか見当たらないのがつらいところです。

そこで、CSVをそこそこ読みやすいPDFに変換し、とりあえず掲示板ぐらいは読めるようにしておこうというのが今回の趣旨です。

使うもの

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出力の分離
  • 掲示板以外の対応
  • 見た目をかっこよく
2
2
0

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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?