2011年05月03日

redmineのPDF文字化けorInternal Error対応

Redmineの環境を私は1つしか持っていません.なので,ちょっと自分の環境特有の問題なのか,Redmineそのものの処理の問題なのかを切り分けたい時には,Redmine.jpのサイトで動作確認をしていました.もちろん,プラグインの確認とかはできませんが.



今まで気になっていた問題の一つが,チケットのいくつかをPDF出力できないことでした.

そのため,いつも印刷設定から,WindowsOSの場合には,CubePDFやPrimoPDFのソフトを使うことでPDFのチケットを作成し,それを報告書として使用していました.

チケットそのものが,『開始日』『終了日』『担当者』『ステータス』『進捗率』をもち,かつ,途中経過を逐一書きこんでいけるので,私は報告書として,わざわざ作成するのではなく,これで十分だと考えています.

ボリュームの少ないチケットはPDF出力できるのに,報告したいくらいのボリュームのチケットをPDF出力しようとするとInternal Error の発生.原因は調べずに,代替手段(つまり,印刷機能から他のソフトの力を借りてPDF変換)があったのでそこまで困ってはいませんでした.


ただ,印刷によるPDF出力するとページ間の文字列が崩れたり(正確には文字がページ区切ると重なって隠れてしまったり)することがあったので,やっぱりRedmineのPDF出力を使いたいなと思う時もありました.


ふと,Redmine1.1.3のリリース情報が入り,現在入る予定のチケット一覧を眺めてたら,ja-pdfの文字が.これはと思って,patchを当ててみたら(量はそんなでもなかったので手動修正),無事直りました.Internal Errorがでなくなりました!!

"Jun NAITOH"さん,ありがとうございます!

パッチはこちら.
http://www.redmine.org/attachments/5735/ja-pdf_fix.patch

b/vendor/plugins/rfpdf/lib/rfpdf/japanese.rb 2011-03-31 05:24:03.000000000 +0900

自分の環境ではこれだけで十分でした.なんか文字化けも直ったような気がします.
(注:Redmine1.1.3からはこの修正は入っていると思うので文字化けの問題は大きく改善されていると思う)



さらに,偶然日本語の文字化けを対応できる処理を見つけました.
(注:この修正は,以前行った&メモしたものであり,最近のは上記の修正だけで十分かもしれません.)

以前,自分でも挑戦したことがある(http://in.shappi.org/article/161327947.html)し,また,最近は修正せずともそれなりにうまく出来てたのですが(Redmineのバージョンアップに伴い自分の修正をどう入れ直すべきか分からなくなりやめたというのが実情), それでも文字化けすることがあった(古いチケットとかだと起きやすい.以前のバージョンで作成したチケットかもしれない)ので,半ば諦めてましたがこの修正で今のところうまく出来ています.


http://fmkt.blog65.fc2.com/blog-entry-148.html

Index: lib/redmine/export/pdf.rb
===================================================================
--- lib/redmine/export/pdf.rb (リビジョン 3399)
+++ lib/redmine/export/pdf.rb (作業コピー)
@@ -91,14 +91,16 @@
def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
@ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
# these quotation marks are not correctly rendered in the pdf
- txt = txt.gsub(/[a^EURoea^EUR?]/, '"') if txt
+ txt = "" if txt.nil?
+# txt = txt.gsub(/[a^EURoea^EUR?]/, '"') if txt # ここ!
+
txt = begin
# 0x5c char handling
txtar = txt.split('\\')
txtar << '' if txt[-1] == ?\\
txtar.collect {|x| @ic.iconv(x)}.join('\\').gsub(/\\/, "\\\\\\\\")
rescue
- txt
+ txt.gsub(/\\/, "\\\\\\\\")
end || ''
super w,h,txt,border,ln,align,fill,link
end
@@ -243,7 +245,7 @@
pdf.SetFontStyle('B',9)
pdf.Cell(35,5, custom_value.custom_field.name + ":","L")
pdf.SetFontStyle('',9)
- pdf.MultiCell(155,5, (show_value custom_value),"R")
+ pdf.MultiCell(155,5, NKF.nkf("-W -s -m0", (show_value custom_value)),"R")
end

pdf.SetFontStyle('B',9)
@@ -255,7 +257,7 @@
pdf.SetFontStyle('B',9)
pdf.Cell(35,5, l(:field_description) + ":")
pdf.SetFontStyle('',9)
- pdf.MultiCell(155,5, @issue.description,"BR")
+ pdf.MultiCell(155,5, NKF.nkf("-W -s -m0", @issue.description),"BR")

pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
@@ -271,7 +273,7 @@
pdf.Ln
unless changeset.comments.blank?
pdf.SetFontStyle('',8)
- pdf.MultiCell(190,5, changeset.comments)
+ pdf.MultiCell(190,5, NKF.nkf("-W -s -m0", changeset.comments))
end
pdf.Ln
end
@@ -291,7 +293,7 @@
end
if journal.notes?
pdf.SetFontStyle('',8)
- pdf.MultiCell(190,5, journal.notes)
+ pdf.MultiCell(190,5, NKF.nkf("-W -s -m0", journal.notes))
end
pdf.Ln
end





RedmineのPDF出力機能の他のやや大きい不満は,Wiki記法を使用して書いた文章や画像を貼り付けたとしてもすべて元のコードで出力されてしまうこと.つまり,PDF出力しても写真とかは貼り付けられない.これじゃ,写真付きのチケットでは意味が無いよ...
他の言語のユーザもこの点は困ってると思う.



posted by maplewine at 23:01| Comment(0) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック