ちょっと故あって、iTextでpdfをテキストに変換しています。
しかし、デフォルトのパーサーでExcelから出力されたであろうpdfファイルをテキストに変換すると、座標情報がまったく考慮されずにテキストになってしまうため、仕方なく座標情報を保持しつつテキストにするパーサーを作りました。
で、実際にその動きを試そうと思ったのですが、上記のようなことをつぶやいた時に
@mike_neck わかる http://t.co/NrvTVJgWil
— sue445 (@sue445) 2015, 3月 3
@mike_neck 僕がrubyでやった時もライブラリによってはそういうことありました。文字の座標を計算してString化するライブラリ探した方がよさそうです。
— sue445 (@sue445) 2015, 3月 3
と、いったやりとりがあったのを思い出して、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行の情報を取得できないのです。
あーエクセルで、横一列を上揃え、中揃え、下揃え統一できない奴は氏ね
— もちだでしたが、衰退しました (@mike_neck) 2015, 3月 5
- 四捨五入 → 結構揃わない行がある
- 4で割ってから四捨五入 → だいぶ頻度は落ちたけど揃わない行がある
- 6.5で割ってから四捨五入 → 2個くらい揃わない行がある
- 7で割ってから四捨五入 → 2つの行が1つの行にまとまってしまうことがある一方で、2個くらい揃わない行がある
といった感じで無駄にオブジェクトを生成するというギミックを使わざるをえない状態でした。
結論
新入社員の頃に習ったと思うけど、エクセルでドキュメントを作った後はちゃんとレビューして、上下揃えを統一しろください