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

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

新規登録して質問してみよう
ただいま回答率
85.31%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1168閲覧

WPF で印刷時に同時にPDFファイルを作成したい

byori

総合スコア72

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2023/08/31 12:22

実現したいこと

印刷のXps.XpsDocumentWriterで使用した内容をそのまま画像に落としさらにPDFファイルにしたいのですが、どのような手順がありますでしょうか?

画像に変換してPDFファイルにする理由は、PDFファイル自体内容(データ)の変更・改ざんができるためそれを無効にしたく一旦画像(形式問わず)に変更してPDFファイルを作成したいです。

前提

コードは、部分的ですが、FixedPage を作成し下記で印刷しようと考えています。基本は1ページのみの予定です。

該当のソースコード

C#

1 LocalPrintServer lps = new LocalPrintServer(); 2 // PrintQueue queue = lps.DefaultPrintQueue; 3 PrintQueue queue = lps.GetPrintQueue(printerMei); 4 5 System.Windows.Xps.XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(queue); 6 PrintTicket ticket = queue.DefaultPrintTicket; 7 8 // 用紙サイズの設定 9 ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4); 10 ticket.PageOrientation = PageOrientation.Landscape; 11 12 writer.Write(doc, ticket);

Windows11 WPF C# VS2019

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

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

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

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

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

TN8001

2023/09/01 08:49

> 印刷のXps.XpsDocumentWriterで使用した内容をそのまま画像に落としさらにPDFファイルにしたいのですが、どのような手順がありますでしょうか? 1. XPSをPDFにしたいという話ですか? 2. FixedPageを画像にしたいという話ですか? 3. 画像をPDFにしたいという話ですか? 1や3なら何かライブラリの使用を検討されたほうが楽じゃないでしょうか(わたしは特に知見はありません) [c# pdf library - Google 検索](https://www.google.co.jp/search?q=c%23+pdf+library) 2ならFixedPageもVisualなので簡単です。 [方法: ビジュアルをイメージ ファイルにエンコードする - WPF .NET Framework | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/graphics-multimedia/how-to-encode-a-visual-to-an-image-file) > 画像に変換してPDFファイルにする理由は、PDFファイル自体内容(データ)の変更・改ざんができるためそれを無効にしたく一旦画像(形式問わず)に変更してPDFファイルを作成したいです。 画像にしたところで改ざん防止になるとは思えません(ただの文字より面倒になるとは思いますが) 電子署名をつけるとかのほうが真っ当じゃないですか。
byori

2023/09/02 11:11

TN8001 様 いつもお世話になります。 > 1や3なら何かライブラリの使用を検討されたほうが 最終的には、それを考えています。たさ、 > 画像にしたところで改ざん防止になるとは思えません 例えば、JPG 画像にしたものをPDFファイルにした時、画像そのものを変更されれば改ざんかもしれませんが、中に含まれるテキストなどは変更不可なので、そういった意味で改ざん不可と考えていました。 ただ、ご指摘いただいた電子署名はどういった内容で改ざん防止になるのでしょうか? 私なりに調べますが、もしわかりやすいサイトなどありましたら教えてください。 とりあえず、「2ならFixedPageもVisualなので簡単です。」を試して一旦画像に落としてみようと思います。
TN8001

2023/09/02 13:06

> 例えば、JPG 画像にしたものをPDFファイルにした時、画像そのものを変更されれば改ざんかもしれませんが、中に含まれるテキストなどは変更不可なので、そういった意味で改ざん不可と考えていました。 途中でだれか悪意のあるものに文字を書き換えられてしまう可能性があるのなら、画像だろうと書き換えられますし、ファイル丸ごと入れ替えたりだってできちゃうでしょう。 > ただ、ご指摘いただいた電子署名はどういった内容で改ざん防止になるのでしょうか? > 私なりに調べますが、もしわかりやすいサイトなどありましたら教えてください。 「電子署名」一般のメリットというか目的は↓でしょう。 > 作成者の保証 >  通常の紙文書に用いる印や署名に相当する、電子文書の作成者の証明が可能な仕組み。 > 内容の同一性 >  電子文書が改竄されていないことの保証、つまり改竄された場合にそれが検出できる仕組み。 [電子署名 - Wikipedia](https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E7%BD%B2%E5%90%8D) PDFでの実際の用例はggってください^^; [pdf 電子署名 - Google 検索](https://www.google.co.jp/search?q=pdf+%E9%9B%BB%E5%AD%90%E7%BD%B2%E5%90%8D) AcrobatやAcrobat Readerでの話ばかりですが、一度試してどう改ざん防止になるのか確認してください。 C#でどう署名をつけるかですが、有償のライブラリならほぼ対応していると思います。 無償のものだとあまりこれといったものが見当たらないです^^;
guest

回答1

0

自己解決

TN8001 様
いつもお世話になります。

印刷イメージ(FixedPage)を画像ファイルにするには下記のようにしました。

C#

1 public static void ToImage(FixedPage page, string outputPath) 2 { 3 // Create a RenderTargetBitmap to render the FixedPage. 4 RenderTargetBitmap rtb = new RenderTargetBitmap( 5 (int)page.Width, 6 (int)page.Height, 7 96, // DPI X 8 96, // DPI Y 9 PixelFormats.Pbgra32 10 ); 11 12 // Create a visual container to host the FixedPage content. 13 Canvas container = new Canvas(); 14 container.Children.Add(page); 15 16 // Measure and arrange the container to render the content correctly. 17 container.Measure(new Size(page.Width, page.Height)); 18 container.Arrange(new Rect(0, 0, page.Width, page.Height)); 19 20 // Render the FixedPage content to the RenderTargetBitmap. 21 rtb.Render(container); 22 23 // Create a PngBitmapEncoder to encode the RenderTargetBitmap as a PNG file. 24 // PngBitmapEncoder pngEncoder = new PngBitmapEncoder(); 25 JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder(); 26 jpgEncoder.Frames.Add(BitmapFrame.Create(rtb)); 27 28 // Save the PNG file to the specified output path. 29 using (Stream stream = File.Create(outputPath)) 30 { 31 jpgEncoder.Save(stream); 32 } 33 }

PDFファイルにするにはライブラリを利用することにしようとおもい、作製枚数制限がありますが、
using Spire.Pdf;
で進めてみようと思います。
iTextSharp も考えましたが、Ver4.x なのでこの先 .NET の更新でどこまで使用可能か不安がありました。

C#

1 public static void ToPDF(string path, string pdfMei) 2 { 3 // PDFファイルに変換する 4 // Create a pdf document. 5 PdfDocument doc = new PdfDocument(); 6 7 // マージン 8 PdfUnitConvertor unitCvtr = new PdfUnitConvertor(); 9 PdfMargins margins = new PdfMargins(); 10 margins.Top = unitCvtr.ConvertUnits(/*2.54f*/0.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point); 11 margins.Bottom = margins.Top; 12 margins.Left = unitCvtr.ConvertUnits(/*3.17f*/0.30f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point); 13 margins.Right = margins.Left; 14 15 // Create one page 16 PdfPageBase page = doc.Pages.Add(PdfPageSize.B5, margins); 17 18 using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read)) 19 { 20 var img = Image.FromStream(stream); 21 22 // イメージを読みPDFファイルで保存する 23 Spire.Pdf.Graphics.PdfImage bmp = Spire.Pdf.Graphics.PdfImage.FromImage(img); 24 25 // 印字位置 26 //CurrentHeight = CurrentHeight + (float)(fnt.Height * 1.60 + gyokanChosei); // 1.50 27 //drawPoint = new PointF((float)(PageWidthPDF * 0.12) + (float)PaperLeft, CurrentHeight); // 0.125 28 if (bmp != null) 29 { 30 page.Canvas.DrawImage(bmp, 0, 0, (int)((float)bmp.Width / 1.5/*2.15*/), (int)((float)bmp.Height / 1.5/*2.15*/)); 31 } 32 33 img.Dispose(); 34 doc.SaveToFile(pdfMei); // "Image.pdf" 35 doc.Close(); 36 37 // パスワードセット 38 EncryptPDF(pdfMei); 39 } 40 } 41 public static PdfDocument EncryptPDF(string mei) 42 { 43 //PdfDocument クラスのオブジェクトを作成する 44 PdfDocument pdf = new PdfDocument(); 45 46 //PDFファイルを読み込む 47 pdf.LoadFromFile(mei); // @"C:\Users\YDY_17628305272oEgOG\Desktop\Sample1.pdf"); 48 49 //パスワードでPDFファイルを暗号化する 50 pdf.Security.Encrypt("open", "permission", PdfPermissionsFlags.Print | PdfPermissionsFlags.CopyContent, PdfEncryptionKeySize.Key128Bit); 51 52 //のファイルを保存する 53 pdf.SaveToFile(/*"PDFの暗号化.pdf"*/mei, FileFormat.PDF); 54 55 return pdf; 56 }

現時点では、ToImage() で物理的に画像ファイルにしてますが、System.IO.Drawing に変換できれば、ToPDF() 内の Spire.Pdf.Graphics.PdfImage.FromImage(img) の引数 img の型に合わせられれば、保存することもないのですが・・・

多少の問題点(画像作製・保存時にデータの位置がずれる件と電子署名)がありますが、目的のPDFが作成できたので終了とさせていただきます。

有難うございます。

投稿2023/09/04 03:32

byori

総合スコア72

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問