mike-neckのブログ

Java or Groovy or Swift or Golang

エクセルでPDFとか出力する人はちゃんとレビューするべき

ちょっと故あって、iTextでpdfをテキストに変換しています。

しかし、デフォルトのパーサーでExcelから出力されたであろうpdfファイルをテキストに変換すると、座標情報がまったく考慮されずにテキストになってしまうため、仕方なく座標情報を保持しつつテキストにするパーサーを作りました。

で、実際にその動きを試そうと思ったのですが、上記のようなことをつぶやいた時に

と、いったやりとりがあったのを思い出して、T-CARDの個人情報提供先のpdfで試してみることにしました。

@sue445 さんのccc_privacy_botのpdfパーサーをgroovyで書きなおしてみた

実行結果はこんな感じ

[{"number": 1,"organization_name": "TSUTAYA・蔦屋書店","since": "2014/10/20","type": "提携先","": ["TSUTAYAフランチャイズチェーン加盟企業"]},
{"number": 2,"organization_name": "JX日鉱日石エネルギー株式会社","since": "2014/10/20","type": "提携先","": ["ENEOS"]},
...
{"number": 87,"organization_name": "カルチュア・エンタテインメント株式会社","since": "2014/11/26","type": "CCCグループ会社","": ["エンタテイメント作品・商品の調達・企画"]},
{"number": 88,"organization_name": "CCCマーケティング株式会社","since": "2014/11/26","type": "CCCグループ会社","": ["データベースマーケティング事業"]}]

本題

上記のコードの116行目あたりで文句を書いていますが、pdfを出力したExcelのファイルで行ごとに中のセルの文字列の上下揃えが統一されていないため、うまく1行の情報を取得できないのです。

  • 四捨五入 → 結構揃わない行がある
  • 4で割ってから四捨五入 → だいぶ頻度は落ちたけど揃わない行がある
  • 6.5で割ってから四捨五入 → 2個くらい揃わない行がある
  • 7で割ってから四捨五入 → 2つの行が1つの行にまとまってしまうことがある一方で、2個くらい揃わない行がある

といった感じで無駄にオブジェクトを生成するというギミックを使わざるをえない状態でした。

結論

新入社員の頃に習ったと思うけど、エクセルでドキュメントを作った後はちゃんとレビューして、上下揃えを統一しろください