ThinReports で生成されたパスワード付き PDF を Adobe Reader で印刷するとエラーダイアログが出る問題とその対応

タイトル長っ。

ThinReports 0.7.6 以前で成されたパスワード付き PDF を Windows 環境の Adobe Reader で印刷すると次のような文言のエラーダイアログが出ます。
「このページにはエラーがあります。Acrobatはページを正しく表示できない場合があります。PDF文章の作成者に連絡して、問題を解決してください。」
エラーダイアログは出るんですが、実際は正常に印刷も表示もなされ、何か問題があるようには見えないという現象です。実用上はあまり問題は無い感じですが、気持ち悪い問題です。

で、色々調べた結果です。

なお、確認している再現環境は下記の通り。

対応方法

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 への差し替えタイミングで消せば良いでしょう。

ThinReports チケット

http://osc.matsukei.net/issues/409

[twitter:@hidakatsuya] さん、迅速な確認ありがとうございました。