社会人から始めたプログラミング

プログラミング、エンジニアに関することでの備忘録、シェアしたい情報などを共有するためのブログです。

pdf の meta data である title を ruby で変更しようとして文字化けをなんとかした話 | chromeブラウザでのpdfタイトル表示が日本語ファイル名になるようにする

そもそもの問題

chrome ブラウザ でのpdfタイトル表示がurlになるのでファイル名の日本語をタイトルに当てたかった。

状況

  • 取り組んでいる文脈概要
 rubyXL の gem で excel にデータ埋め込んだりしている -> libreconv の gem で excel を pdf に変換 -> rails で表示
  • ブラウザへのデータ送信方法は send_data メソッドを使用
  • pdfのブラウザのタイトルを変更する方法を調べたら、combine_pdfとかprawnのgemが出てきた
  • とりあえずcombine_pdfでPDFのタイトルを変更できたが文字化けした
  • 文字コードをいじればなんとかなるのではとか思っていたがここからが本当の戦いだった…

結論

rubyXL でタイトルを設定したらlibreconv で convertされたPDFにもタイトルが文字化けされず設定された。

workbook.root.core_properties.dc_title = RubyXL::StringNode.new(value: title) こんな感じのプログラムでtitleを調整可能(おまけに書いたが、rubyXLに workbook.title で見たり設定できるようにPRをつくってみた)

ファイル名になるように色々と試みたこと

1.combine_pdfで日本語タイトル文字化け

-> 文字コードを 色々いじってみるも解決できず。。

2.prawn で title いれてみる

-> 1枚目が上書きされてしまったりしてtitle変更もできず断念

3.excel から libreconv でpdfに変換していたので、excelにタイトル打ち込んでみてconvertしてみる

-> excelのプロパティにタイトルを入れてみるも表示されず(エクセルファイルを直接操作して保存、その後libreconvでconvertした段階で消えた模様)

4.fileの文字列を直接いじってみる

-> pdf の title部分をいじってみたが、参照する形で書かないといけないらしく不可 combine_pdf で質問したらやっぱり直接いじるのは難しそうということもわかった。Boaz Segevさん回答ありがとうございます。 github.com

5.excel -> html -> pdf html経由でPDFKitを使って出力した場合はPDFのタイトル調整はできていたので、 libreconvを使い、htmlにしてからPDFにしてみた

-> タイトルは変更できた!けど、文字の大きさとか、微妙な感じになったので、調整に時間がかかりそうだったのでpending…

6.そういえば send_data の optionでファイル名をタイトルとしてブラウザが見てくれるようになるみたいなのないかな…

-> あった!!!!!たったの1行の編集だったぜ…。。(send_data のoptionにurl_based_filenameがあるので url_based_filename: false のパラメータを足してあげればよかった。)と思ったら、なぜか5のときに設定したtitleがずっと残っているようで、ファイル名を変更してもtitleが変わらなかった。。 さて、どうしたものか。

7. 3が実はできていたことが判明!

-> rubyXL でタイトルを設定したらlibreconv で convertされたPDFにもタイトルが文字化けされず設定された。

5のときに設定したtitleがずっと残っているようで、ファイル名を変更してもtitleが変わらなかった。。 これはexcelのプロパティのタイトルに設定したものを忘れて変わらないなぁとなっていた。。

おまけ

・文字化けはGarbled Charactersっていうらしいですよ。 ・rubyXLに新しいコミット作ってPRしてみました。果たしてコントリビューターになれるか!? github.com