ThinReports で生成されたパスワード付き PDF を Adobe Reader で印刷するとエラーダイアログが出る問題とその対応
タイトル長っ。
ThinReports 0.7.6 以前で成されたパスワード付き PDF を Windows 環境の Adobe Reader で印刷すると次のような文言のエラーダイアログが出ます。
「このページにはエラーがあります。Acrobatはページを正しく表示できない場合があります。PDF文章の作成者に連絡して、問題を解決してください。」
エラーダイアログは出るんですが、実際は正常に印刷も表示もなされ、何か問題があるようには見えないという現象です。実用上はあまり問題は無い感じですが、気持ち悪い問題です。
で、色々調べた結果です。
なお、確認している再現環境は下記の通り。
- ThinRepors 0.7.6, 0.7.5
- Prawn 0.12.0 (PDF 生成ライブラリ。 ThinReports が依存している)
- Windows 版 Adobe Reader 9 or 10
対応方法
ThinRepors が依存している Prawn という PDF ライブラリのバグらしく、次のようなモンキーパッチで直ります。
class Prawn::Core::Reference def <<(data) (@stream ||= "") << data @data[:Length] = @stream.length @stream end def compress_stream @stream = Zlib::Deflate.deflate(@stream) @data[:Filter] = :FlateDecode @data[:Length] = @stream.length @compressed = true end end
Rails から使っている場合は、config/initializer/prawn_patch.rb などに保存しておけば良いでしょう。
ライブラリの状況
ThinReports 0.7.6 が依存している Prawn のバージョンは 0.12.0 です。それ以前のバージョンには潜在的にこの不具合をもっていると思われます。
このモンキーパッチは Prawn の master ブランチのあるコミット( https://github.com/prawnpdf/prawn/commit/34039d13b7886692debca11e85b9a572a20d57ee )から持ってきたものです。次のリリースが 1.0.0 かは分かりませんが、Prawn は 1.0.0 のリリースに向けて目下開発中(リリース時期不明)です。このコミットが含まれた Prawn 1.0.0 と、 1.0.0 に対応した ThinReports がリリースされることで恐らく完治しますが、 ThinReports 0.7.6 以前で Prawn 0.12.0 を使っている場合はまずはこのモンキーパッチでしのげます。
このモンキーパッチは次のバージョンである ThinRepors 0.8 には内包してリリースされるそうですので、ThinReports 0.8 への差し替えタイミングで消せば良いでしょう。