作成日: 2015/05/21 最終更新日: 2015/05/21
文書種別
制限事項
詳細
標準のPrintDocumentにDrawStringメソッドで日本語を描画し、これをC1PdfDocumentのDrawImageメソッドでイメージとして描画したのち、PDFファイルに保存すると、日本語の位置がずれてしまいます。
PDF for .NETでは、フォントサイズをWin32の LPtoDP関数を利用して計算しますが、この関数には丸め誤差があるためで、す。
【再現ステップ】
1.標準のPrintDocumentのPrintPageイベントで、DrawStringメソッドを使用して複数行の日本語を描画する。
e.Graphics.DrawString(" 漢字漢字ひらがな :漢字", font, Brushes.Black, 100, 200);
e.Graphics.DrawString(" 漢字漢字ひら(漢字カタカナ) :漢字", font, Brushes.Black, 100, 200);
e.Graphics.DrawString(" 漢字 :漢字", font, Brushes.Black, 100, 200);
※「MS ゴシック」フォントを指定して、複数行の「:漢字」の位置が揃うようにします。
2.C1PdfDocumentのDrawImageメソッドで、1で描画した日本語をイメージとしてC1PDFに描画する。
3.C1PdfDocumentのSaveメソッドを使用して、PDFファイルに保存する。
【結果】
右側の「:漢字」の位置が揃わず、ずれてしまう。
PDF for .NETでは、フォントサイズをWin32の LPtoDP関数を利用して計算しますが、この関数には丸め誤差があるためで、す。
【再現ステップ】
1.標準のPrintDocumentのPrintPageイベントで、DrawStringメソッドを使用して複数行の日本語を描画する。
e.Graphics.DrawString(" 漢字漢字ひらがな :漢字", font, Brushes.Black, 100, 200);
e.Graphics.DrawString(" 漢字漢字ひら(漢字カタカナ) :漢字", font, Brushes.Black, 100, 200);
e.Graphics.DrawString(" 漢字 :漢字", font, Brushes.Black, 100, 200);
※「MS ゴシック」フォントを指定して、複数行の「:漢字」の位置が揃うようにします。
2.C1PdfDocumentのDrawImageメソッドで、1で描画した日本語をイメージとしてC1PDFに描画する。
3.C1PdfDocumentのSaveメソッドを使用して、PDFファイルに保存する。
【結果】
右側の「:漢字」の位置が揃わず、ずれてしまう。
回避方法
この現象は製品の制限です。
大きなフォント(例えば12ポイントや14ポイントなど)を使用すると、内部関数の丸め誤差による影響を受けにくくなります。
また、半角スペースより全角スペースを用いたほうが誤差の影響が小さくなります。
たとえば次のように、DrawStringで描画する半角スペースをすべて全角スペースに置き換えることで、位置のずれを小さく抑えることができます。
◆サンプルコード
--------------------------------------------
//半角スペース2個を全角スペース1個に変換
// e.Graphics.DrawString(" 漢字漢字ひらがな :漢字", ・・・; //半角スペース20個
e.Graphics.DrawString(" 漢字漢字ひらがな :漢字", ・・・; //全角スペース10個
--------------------------------------------
大きなフォント(例えば12ポイントや14ポイントなど)を使用すると、内部関数の丸め誤差による影響を受けにくくなります。
また、半角スペースより全角スペースを用いたほうが誤差の影響が小さくなります。
たとえば次のように、DrawStringで描画する半角スペースをすべて全角スペースに置き換えることで、位置のずれを小さく抑えることができます。
◆サンプルコード
--------------------------------------------
//半角スペース2個を全角スペース1個に変換
// e.Graphics.DrawString(" 漢字漢字ひらがな :漢字", ・・・; //半角スペース20個
e.Graphics.DrawString(" 漢字漢字ひらがな :漢字", ・・・; //全角スペース10個
--------------------------------------------
旧文書番号
81287