2013年7月17日水曜日

bonobo git server Version 1.3.0

iisで利用出来る、GIT Service
http://bonobogitserver.com/

VersionUPに伴い、開発が止まっているGITSharpから
gitlib2 に変更されていた。

これで最新のGITに対応出来ているので、助かります。

2013年7月12日金曜日

Converting Multipage TIFF image to PDF

            // creation of the document with a certain size and certain margins
            iTextSharp.text.Document document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 0, 0, 0, 0);
          
            // creation of the different writers
            iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new System.IO.FileStream(Server.MapPath("~/App_Data/result.pdf"), System.IO.FileMode.Create));

            // load the tiff image and count the total pages
            System.Drawing.Bitmap bm = new System.Drawing.Bitmap(Server.MapPath("~/App_Data/source.tif"));
            int total = bm.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);

            document.Open();
            iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
            for (int k = 0; k < total; ++k)
            {
                bm.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, k);
                iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(bm, System.Drawing.Imaging.ImageFormat.Bmp);
                // scale the image to fit in the page
                img.ScalePercent(72f / img.DpiX * 100);
                img.SetAbsolutePosition(0, 0);
                cb.AddImage(img);
                document.NewPage();
            }
            document.Close();

元ネタ
http://atashbahar.com/post/Converting-Multipage-TIFF-image-to-PDF.aspx

TIFFからPDFへ変換するには・・・

ファイル変換はよくある話で、画像ファイルからPDFともなるとほぼ王道。
有償ソフトは別として、フリーソフトでも多種多様なものが提供されているのだが、決められたルールに従って大量にPDF化する様なソフトは見当たらないようだ。(見つけられないだけかも・・・)
いつもの通り、「なければ作ればいい」という精神で試みる。
さすがにPDF変換を1から構築するのは大変なので、ツールかライブラリを探してみると以下のようなものがあった。
Zipを解凍すると itextsharp.dll が現れるので、後ほど作成するプロジェクトフォルダにコピーしておけばいい。リファレンスヘルプは・・・まぁ、適当に。
itextsharp を使うには参照設定に登録する必要がある。
「ソリューションエクスプローラ」窓から「参照設定」を右クリックし、「参照の追加」を選択する。
「参照」タブから、iTextSharp.dll を選択することで、前準備が完了する。
 コーディングの基本形は以下の通り。
01.using iTextSharp.text;
02.using iTextSharp.text.pdf;
03. 
04.// itextsharp::ドキュメントを作成
05.Document doc = new Document();
06. 
07.// itextsharp::PDF保存先を指定
08.PdfWriter.GetInstance(doc, new FileStream(@"c:\hoge\test.pdf", FileMode.Create));
09. 
10.// itextsharp::PDFを開く
11.doc.Open();
12. 
13.// itextsharp::画像データ取得
14.iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(new Uri(@"c:\hoge\image.tif"));
15. 
16.// itextsharp::書込み
17.doc.Add(image);
18. 
19.// itextsharp::PDFを閉じる
20.doc.Close();
これだとA4サイズのTIFFファイルを上記のプログラムで作成すると、TIFF画像の一部しかPDF化されないことが分かる。
ちなみにA4サイズは、インチでいうと 8.3x11.5、mmで言うと 210x297 である。
で、TIFFファイルはあくまでも画像なので、用紙サイズなどの情報は保持せず、あくまで画像サイズなのだ。そのため、上記のプログラムでは端的に言うと解像度に比例して巨大化されてしまうのだ。
最終的には次のようになった。
01.using iTextSharp.text;
02.using iTextSharp.text.pdf;
03. 
04. 
05.{
06.    // ドキュメントを作成
07.    Document doc = new Document();
08. 
09.    // PDF保存先を指定
10.    PdfWriter.GetInstance(doc, new FileStream(@"c:\hoge\test.pdf", FileMode.Create));
11. 
12.    // PDFを開く
13.    doc.Open();
14. 
15.    // 画像データ取得
16.    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(new Uri(@"c:\hoge\image.tif"));
17. 
18.    // サイズを算出
19.    // itextsharpのサイズ定義の数値が合わないので2.834の差分を補正
20.    float y = (image.PlainHeight / image.DpiY) * 25.4f * 2.834f;
21.    float x = (image.PlainWidth / image.DpiX) * 25.4f * 2.834f;
22. 
23.    // 用紙サイズを判定
24.    iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(myPaperSize(x, y));
25.                         
26.    // 縮尺率を判定
27.    // ※これでフィットするのだが理由は不明
28.    image.ScalePercent(35f);
29. 
30.    // 配置個所指定(左下が起点)
31.    image.SetAbsolutePosition(0f, 0f);
32. 
33.    // 用紙サイズを設定
34.    doc.SetPageSize(rect);
35. 
36.    // 書込み
37.    //doc.NewPage(); ←サイズが異なる複数頁のときにこの位置で頁変更をする
38.    doc.Add(image);
39. 
40.    // PDFを開く
41.    doc.Close();
42.}
43. 
44.private iTextSharp.text.Rectangle myPaperSize(float x, float y)
45.{
46.    // 誤差範囲10%とする
47.    // ※スキャン状態によって多少の誤差があるため
48.    float gosa = 0.9f;
49. 
50.    if (PageSize.A0.Height < (y * gosa)) return PageSize.B0;
51.    if (PageSize.B1.Height < (y * gosa)) return PageSize.A0;
52.    if (PageSize.A1.Height < (y * gosa)) return PageSize.B1;
53.    if (PageSize.B2.Height < (y * gosa)) return PageSize.A1;
54.    if (PageSize.A2.Height < (y * gosa)) return PageSize.B2;
55.    if (PageSize.B3.Height < (y * gosa)) return PageSize.A2;
56.    if (PageSize.A3.Height < (y * gosa)) return PageSize.B3;
57.    if (PageSize.B4.Height < (y * gosa)) return PageSize.A3;
58.    if (PageSize.A4.Height < (y * gosa)) return PageSize.B4;
59.    if (PageSize.B5.Height < (y * gosa)) return PageSize.A4;
60.    if (PageSize.A5.Height < (y * gosa)) return PageSize.B5;
61.    if (PageSize.B6.Height < (y * gosa)) return PageSize.A5;
62.    if (PageSize.A6.Height < (y * gosa)) return PageSize.B6;
63.    if (PageSize.B7.Height < (y * gosa)) return PageSize.A6;
64.    if (PageSize.A7.Height < (y * gosa)) return PageSize.B7;
65.    if (PageSize.B8.Height < (y * gosa)) return PageSize.A7;
66.    if (PageSize.A8.Height < (y * gosa)) return PageSize.B8;
67.     
68.    return PageSize.A8;
69.}
腑に落ちない部分も多々あるのだが、これでスキャンした用紙サイズのTIFFファイルを同用紙サイズのPDFファイルに変換することができる。

元ネタ
http://yonaizumi.dip.jp/weblog/cappe/2010/11/ctiffpdf.html

2013年7月11日木曜日

C#のsmtpclientでメール送信すると subjectで文字化けする

C#のsmtpclientでメール送信すると subjectで文字化けする。

どうも.NET4.0から、仕様が変わったそうです。

iso-2022-jpだと、smtpclient側で、自動エンコード を行うのが原因だとか。

http://blogs.technet.com/b/exchangeteamjp/archive/2012/10/05/3524293.aspx

今回は System.Net.Mail を利用してメールを送信する際に .NET Framework 4.5 で一部実装が変更されたことで発生する問題と対処方法についてご紹介いたします。
System.Net.Mail の MailMessage では SubjectEncoding を設定することで Subject で使用される文字コードを指定することができますが、SubjectEncoding に "iso-2022-jp" を設定した場合には Q エンコードが使用されてメールが送信されます。
Q エンコードに対応しているクライアントでは特に問題とはなりませんが、Q エンコードに対応していない一部の携帯端末やメーラーでは Subject が文字化けする問題が多数確認され、.NET Framework 4 までは以下のように SubjectEncoding は指定しないで Subject に B エンコードでエンコードした文字列を設定することで対応することができました。
    using System.Net.Mail
    using System.Text.Encoding
    public static void SendMessage(string server)
    {
        string from    = "userA@contoso.com";
        string to      = "userB@contoso.com";
        string subject = "テスト メッセージ";
        string body    = "メッセージの本文"
        MailMessage msg = new MailMessage(from, to);
        msg.Subject = EncodeMailHeader(subject);
        msg.Body = body;
        // SubjectEncoding は指定しない
        // msg.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
        msg.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
        SmtpClient sc = new SmtpClient(server);
        sc.Send(msg);
    }
    // 「=?iso-2022-jp?B?<エンコード文字列>?=」形式に変換
    public static string EncodeMailHeader(string subject)
    {
        Encoding enc = Encoding.GetEncoding("iso-2022-jp");
        string strBase64 = Convert.ToBase64String(enc.GetBytes(subject));
        return string.Format("=?{0}?B?{1}?=", "iso-2022-jp", strBase64);
    }
.NET Framework 4.5 の System.Net.Mail では Subject にエンコードされた文字列を指定してもクラス内部でデコードした値を内部で保持するように一部実装が変更されているため、上記のコードでも Q エンコードが使用されてメールが送信される結果となります。
なお、.NET Framework 4.5 では以下のように二重にエンコードした文字列を Subject に設定することで以前と同様に日本語の件名を B エンコードを使用してメールを送信することができます。
    using System.Net.Mail
    using System.Text.Encoding
    public static void SendMessage(string server)
    {
        string from    = "userA@contoso.com";
        string to      = "userB@contoso.com";
        string subject = "テスト メッセージ";
        string body    = "メッセージの本文"
        MailMessage msg = new MailMessage(from, to);
        msg.Subject = EncodeMailHeader(EncodeMailHeader(subject));
        msg.Body = body;
        // SubjectEncoding は指定しない
        // msg.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
        msg.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
        SmtpClient sc = new SmtpClient(server);
        sc.Send(msg);
    }
    // 「=?iso-2022-jp?B?<エンコード文字列>?=」形式に変換
    public static string EncodeMailHeader(string subject)
    {
        Encoding enc = Encoding.GetEncoding("iso-2022-jp");
        string strBase64 = Convert.ToBase64String(enc.GetBytes(subject));
        return string.Format("=?{0}?B?{1}?=", "iso-2022-jp", strBase64);
    }

Aipo スケジュールが登録出来ない

http://user.aipo.com/viewtopic.php?p=6148

設定ファイルが破損した為にスケジュールが登録出来ないそうだ。

tomcat/logs/all.log に、エラーが表示されている。

backup/xreg 以下にバックアップがある。
上記設定ファイルを、
C:\aipo\dpl702\tomcat\webapps\aipo\WEB-INF\conf にコピーする

今回は
C:\aipo\dpl702\tomcat\webapps\aipo\WEB-INF\conf\manhour.xreg
C:\aipo\dpl702\backup\xreg\manhour.xreg 


2013年7月10日水曜日

ファイルをダウンロードする ASP.NET ページで日本語ファイル名が文字化けする

ファイルをダウンロードする ASP.NET ページで日本語ファイル名が文字化けする

元ネタ
http://support.microsoft.com/kb/436616/ja

修正箇所
Response.AppendHeader("Content-Disposition", "Attachment; filename*=utf-8''" + Server.UrlEncode(FileName));
 
filename*=utf-8 このおまじないが必要
 
.NETの内部文字列がutf-8になっている、IEのブラウザから file downloadする時に
出力先の文字コードがOS標準の、shift-jis と判断することから発生する。

ファイル名は、utf-8だよ~の宣言があれば、漢字が文字化けせずに済んだ。