質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
印刷

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

1回答

2446閲覧

C#.Netの印刷で異体字を使いつつ,縦横違う比率で縮小したい

Watayan

総合スコア4

印刷

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

1クリップ

投稿2020/02/27 07:22

編集2020/02/27 08:33

前提・実現したいこと

C#.Netで印刷プログラムを作っています。枠内に文字を押し込めるために,縦横の倍率を別々に変えることもあります。これをIPA mj明朝に対応させる方法について質問します。

発生している問題・エラーメッセージ

これまで文字の描画はGraphics#DrawStringを使っており,Graphics#ScaleTransformを使って縦横の倍率を変えています。しかしGraphics#DrawStringでは異体字がうまく表示されないようです。

TextRenderer#DrawTextなら正しい文字が描画できますが,印刷には対応していないらしい。それでも無理やり座標を合わせて印刷することはできたが,縦横の倍率を別々に変える方法がわかりません。

SharpDXを使えば異体字も縦横の拡大もできますだが,印刷するにあたってHDCの取得の仕方がわかりません。フォームに印字するのならPaintEventArgsのGraphicsからgetHdcを呼べばいいのですが,印刷のためにPrintPageEventArgsのGraphicsからGetHdcを呼んでもうまくいきません。

質問したいこと

上記問題のどれかを解決する方法をお尋ねしたいのです。たとえば

  • DrawStringで異体字が印字する方法
  • DrawTextで縦横の倍率を別々に変える方法
  • SharpDXで印刷するときにHDCを取得する方法

のどれか(あるいは別のアプローチ)について教示いただければ助かります。

追記

DrawString, DrawTextでの例はこんな感じです。間違い探しみたいですが,1文字目は2点しんにょう,2文字目は1点しんにょう,3文字目は最後の画がとめでなくはらいです。

C#

1String s = "鎹鎹????鎹????"; 2Font font = new Font("IPAmj明朝", 32); 3Brush brush = new SolidBrush(Color.Black); 4Rectangle rect1 = new Rectangle(0, 0, 200, 60); 5Rectangle rect2 = new Rectangle(0, 60, 200, 60); 6e.Graphics.DrawString(s, font, brush, rect1); 7TextRenderer.DrawText(e.Graphics, s, font, rect2, Color.Black);

スクリーンショット

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/02/27 08:01

うまく表示されないというのはどういう意味ですか? ただ単にフォントが対応していないだけではありませんか?
Watayan

2020/02/27 08:06

IPAmj明朝にある異体字が,同じ文字で表示されてしまう(そしてトーフがくっつく)という風です。
Zuishin

2020/02/27 08:08

それはフォントを変えれば直りますか?
Zuishin

2020/02/27 08:09

すべてのフォントに等しくすべての文字が含まれているわけではありません。「異体字」というのがもしそのフォントに含まれていないのなら、フォントを変える以外にありません。
Watayan

2020/02/27 08:33

追記しました。IPAmj明朝にある異体字を使い,フォントはIPAmj明朝を指定しています。
Watayan

2020/02/27 09:52

今読みつつ,どうやって描画まで持ち込むか考え中です。
guest

回答1

0

回答ではありません。
4~5年前に調査した結果なので状況は変わっているかもしれません。

Graphics.DrawString → GDI+
TextRenderer.DrawText → GDI

GDI+ で異体字が描画/印刷できない件については Microsoft Connect にバグレポートがあがっていました。

https://connect.microsoft.com/VisualStudio/feedback/details/620081/
リンク先は消滅していますが、URL でググるといろいろ出てきます。

MS からのコメントによると対応する予定はないということでした。

つまり、異体字を印刷するには GDI を使用するしかありません。

ところが .NET では、System.Drawing の機能を使用すると GdiplusStartup API が呼ばれ GDI+ が有効になってしまうため、事実上不可能です。

https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/Gdiplus.cs#147

異体字を印刷するには対応したアプリケーションにまかせるしかなさそうな感じです。

「IVS対応情報」
https://mojikiban.ipa.go.jp/1294.html

上の URL に対応するアプリケーションがあります。

#追記
CodePlex のアーカイブから Office 2007/2010 で IVS を扱えるようになるアドインのソースコードがダウンロードできます。

https://archive.codeplex.com/?p=ivsaddin

C# で作成されているので解析してみてはいかがでしょうか。

ざっと見たところでは、フォントファイルを読み込んで IVS を外字フォントとして作成し、印刷や描画をする際に外字に変換しているっぽいです。

投稿2020/02/28 04:35

編集2020/02/28 08:19
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Watayan

2020/02/28 05:15

ありがとうございます。知りたいのはその「対応したアプリケーション」はどうやっているんだろうということなのです。
KOZ6.0

2020/02/28 05:37 編集

GdiplusStartup を呼んでいないだけかと。
KOZ6.0

2020/02/28 08:28 編集

回答に追記したので削除しました。
Watayan

2020/02/28 09:46

コード読んでみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問