none
WPFのDocumentViewerの 印刷設定を変更して印刷したい RRS feed

  • 質問

  • 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 = True

            Dim viewer As DocumentViewer = CType(sender, DocumentViewer)
            Dim doc As FixedDocument = CType(viewer.Document, FixedDocument)
            Dim dlg As New PrintDialog

            dlg.PrintTicket.PageOrientation = Printing.PageOrientation.Landscape 'ここで用紙の向きを設定
            dlg.PrintTicket.CopyCount = SetCount                          '部数設定
            doc.PrintTicket = dlg.PrintTicket

            Dim 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

    2012年5月29日 8:45

回答

  • 前の投稿のコードは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
    2012年5月29日 9:46

すべての返信

  • 前の投稿のコードは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
    2012年5月29日 9:46
  • 凄すぎです

    助かりました><

    ありがとうございました

    2012年5月29日 12:00