C#(Windows Form)で作る電子印鑑
C#で電子印鑑を作っています。
前提として、私はプログラマーではありません。過去に大学の講義でCを受けており、コードの理解はできます。趣味程度でVisualStudio 2022とAIチャットを駆使して作っています。Framework 4.8.1
ChatGPTで限界を感じたので、ここで質問させていただきます。
※ひたすらChatGPTで質問した後なので、補足がくどい場合があります。ご承知おきください。
※質問内のコードが有効な方法かは知りません。普通はやらないコードも使ってるかもしれません。藁にも縋る思いです。すでにpng・メタファイル・ChatGPT・Geminiと格闘し続けて3週間以上です
一通りコードを書き終え、白背景で印影をAdobe ReaderのPDF(以下、単純に「PDF」と書きます)にCtrl+Vで貼り付けるところまで実装できました。BMP形式なので割とすんなりでした。もともとある画像を読み込んでいるのではなく、描画はすべてDrawLineやDrawEllipseで実施しています。
この白背景は、ラジオボタンで背景透過画像と切り替えできるようにしています。背景透過画像が肝心です。
今、実装できていないのが、この背景透過画像をPDFにCtrl+Vで貼り付ける動作です。
PDFに背景透過画像を貼り付けるコードにできますでしょうか?拡張メタファイル形式でコピーできれば貼り付けられると思うのですが…
下にも書きますが、Office系には背景透過画像の貼り付けが成功しています。
今のコードが以下です。if文内なので、usingでくくってます。ボタンクリックでクリップボードコピーです。
名前空間
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Windows.Forms;
using System.Runtime.InteropServices;
if文分岐内
using (Bitmap bmp = new Bitmap(diameter, diameter, PixelFormat.Format32bppArgb)){
using(Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.Transparent);
DrawGraphics(g, h, x, y); (DrawGraphicsメソッドですべての描画を実施)
}
bmp.Save(ms, ImageFormat.Png);
System.Windows.Forms.IDataObject dataObject = new DataObject();
dataObject.SetData("png", true, ms);
Clipboard.SetDataObject(dataObject, true);
bmp.Dispose();
ms.Dispose();
}
}
透過画像なので、ImageFormatsやSetDataは"png"で指定しています。このまま実行すると、Office系のソフトには正常に透過画像が貼り付けられますが、貼り付け先がPDFだと貼り付けができません。ただし、Office系に貼り付けたあとの背景透過画像をそのままCtrl+Cでコピーし、PDFにCtrl+Vするとなぜか正常に貼り付けられます。Office系でコピーした時点で拡張メタファイルか何かに変換されているのでしょう…
そもそも最初のbmpの時点で透過情報消えるやないか、と思っていましたが、Bitmapクラスは透過情報が保持できる?ようです。
そのため、C#のコード内でOffice系に貼り付け後のコピーの動作(おそらくpng→emf変換)を実装しようとしたのですが、
ImageFormats.Emf/SetData("emf")や、
ChatGPTにて
①png→メタファイル
②png→バイト列→メタファイル
③png→bmp→メタファイル(bmpの時点で透過情報が死ぬので不採用ですが、ChatGPTから提案され続けました。)
など、すべて不発に終わりました。
ImageFormats.Emf/SetData("emf")、これに関しては、
コード内のbmp.Save(ms, ImageFormat.Emf);これの時点で、すでに変換に失敗しているようです。wmfにしてもダメでした(デバッグ開始でボタンを押すとnullが返ってくる)
ラスター画像なので描画自体は少し汚いですが、WPFだと拡張メタファイルやクリップボードをうまく扱えませんでした…
コピーの様子をみるためにWPFは途中まで書きましたが、メタファイルの扱いがうまくいきませんでした。私の知識がないだけかもしれませんが、有力な情報もヒットしません…
その他情報必要な場合は追加しますので、よろしくお願いいたします。
アプリケーションの使用先OSはWin10/11です。
お礼
ご回答ありがとうございます。 PPTをPDF化することが仕事上多々あるため、 ご教授いただいた方法ではとうてい間に合いません。。。 アクロバットの設定の問題かとおもいましたが、 バージョンの問題だったようで、 6.0では×でしたが、8.0では粗粗ながら、 透過は維持されました。 でも、やはりよくある現象なのですね。 ありがとうございます!