トップ回答者
WPFのDocumentViewerの 印刷設定を変更して印刷したい

質問
-
WPF のDocumentViewerのPrintDialogに、PrintTicketを設定後、
印刷を行うようにしているのですが、
ソース内で設定したPrintTicketの設定が反映されません。
下記のソースから、印刷処理を行うと、
Microsoft XPS Document Writer を選択して出力すると用紙の向きを反映してくれるのですが
通常のプリンタから出力すると、ソースで変更した用紙の向きを反映せずに印刷されてしまいます。
どのように設定すれば通常プリンタでも用紙の向きを反映して印刷するか、どなたかご教示お願い致します。
ソース
-----------------------------------------------
Private Sub CommandBinding_Executed(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs)
e.Handled = TrueDim viewer As DocumentViewer = CType(sender, DocumentViewer)
Dim doc As FixedDocument = CType(viewer.Document, FixedDocument)
Dim dlg As New PrintDialogdlg.PrintTicket.PageOrientation = Printing.PageOrientation.Landscape 'ここで用紙の向きを設定
dlg.PrintTicket.CopyCount = SetCount '部数設定
doc.PrintTicket = dlg.PrintTicketDim result As Boolean? = dlg.ShowDialog()
If (result.HasValue AndAlso result.Value) Then
Dim writer As Xps.XpsDocumentWriter = Printing.PrintQueue.CreateXpsDocumentWriter(dlg.PrintQueue)
writer.WriteAsync(doc)
Me.Close() '印刷後 自分閉じる
End If
End Sub
回答
-
前の投稿のコードはC#からVBに書き直したときに印刷で反映させる部分が漏れてました。
他にもやりようはあると思いますが、WritingPrintTicketRequiredイベントでPrintTicketを設定し直してやると反映されます。#昼休みに急いで書いたから寸法換算の係数も間違えてるし…
Class Window1 Sub New() ' この呼び出しは、Windows フォーム デザイナで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 Me.documentViewer1.Document = CreateFixedDocument() End Sub Public Function CreateFixedDocument() As FixedDocument Dim mm2diu As Double = 96 / 25.4 Dim doc As New FixedDocument Dim page As New FixedPage page.Width = 297 * mm2diu page.Height = 210 * mm2diu Dim sz As Size = New Size(page.Width, page.Height) Dim border As New Border border.BorderBrush = Brushes.Black border.BorderThickness = New Thickness(3) border.Width = 277 * mm2diu border.Height = 190 * mm2diu border.Margin = New Thickness(10 * mm2diu) page.Children.Add(border) Dim content As New PageContent CType(content, System.Windows.Markup.IAddChild).AddChild(page) doc.Pages.Add(content) Return doc End Function Private Sub CommandBinding_Executed(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs) e.Handled = True Dim viewer As DocumentViewer = CType(sender, DocumentViewer) Dim doc As FixedDocument = CType(viewer.Document, FixedDocument) Dim dlg As New PrintDialog 'dlg.PrintTicket = CType(doc.PrintTicket, System.Printing.PrintTicket) dlg.PrintTicket.PageOrientation = Printing.PageOrientation.Landscape Dim result As Boolean? = dlg.ShowDialog() If (result.HasValue AndAlso result.Value) Then doc.PrintTicket = dlg.PrintTicket Me.ticket = dlg.PrintTicket Dim writer As Xps.XpsDocumentWriter = Printing.PrintQueue.CreateXpsDocumentWriter(dlg.PrintQueue) AddHandler writer.WritingPrintTicketRequired, AddressOf writer_WritingPrintTicketRequired writer.Write(doc) Me.ticket = Nothing End If End Sub Private ticket As System.Printing.PrintTicket Private Sub writer_WritingPrintTicketRequired _ (ByVal sender As Object, ByVal e As System.Windows.Documents.Serialization.WritingPrintTicketRequiredEventArgs) e.CurrentPrintTicket = ticket End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク VbBeginer001 2012年5月29日 12:00
すべての返信
-
前の投稿のコードはC#からVBに書き直したときに印刷で反映させる部分が漏れてました。
他にもやりようはあると思いますが、WritingPrintTicketRequiredイベントでPrintTicketを設定し直してやると反映されます。#昼休みに急いで書いたから寸法換算の係数も間違えてるし…
Class Window1 Sub New() ' この呼び出しは、Windows フォーム デザイナで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 Me.documentViewer1.Document = CreateFixedDocument() End Sub Public Function CreateFixedDocument() As FixedDocument Dim mm2diu As Double = 96 / 25.4 Dim doc As New FixedDocument Dim page As New FixedPage page.Width = 297 * mm2diu page.Height = 210 * mm2diu Dim sz As Size = New Size(page.Width, page.Height) Dim border As New Border border.BorderBrush = Brushes.Black border.BorderThickness = New Thickness(3) border.Width = 277 * mm2diu border.Height = 190 * mm2diu border.Margin = New Thickness(10 * mm2diu) page.Children.Add(border) Dim content As New PageContent CType(content, System.Windows.Markup.IAddChild).AddChild(page) doc.Pages.Add(content) Return doc End Function Private Sub CommandBinding_Executed(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs) e.Handled = True Dim viewer As DocumentViewer = CType(sender, DocumentViewer) Dim doc As FixedDocument = CType(viewer.Document, FixedDocument) Dim dlg As New PrintDialog 'dlg.PrintTicket = CType(doc.PrintTicket, System.Printing.PrintTicket) dlg.PrintTicket.PageOrientation = Printing.PageOrientation.Landscape Dim result As Boolean? = dlg.ShowDialog() If (result.HasValue AndAlso result.Value) Then doc.PrintTicket = dlg.PrintTicket Me.ticket = dlg.PrintTicket Dim writer As Xps.XpsDocumentWriter = Printing.PrintQueue.CreateXpsDocumentWriter(dlg.PrintQueue) AddHandler writer.WritingPrintTicketRequired, AddressOf writer_WritingPrintTicketRequired writer.Write(doc) Me.ticket = Nothing End If End Sub Private ticket As System.Printing.PrintTicket Private Sub writer_WritingPrintTicketRequired _ (ByVal sender As Object, ByVal e As System.Windows.Documents.Serialization.WritingPrintTicketRequiredEventArgs) e.CurrentPrintTicket = ticket End Sub End Class
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク VbBeginer001 2012年5月29日 12:00