DOBON.NET DOBON.NETプログラミング掲示板過去ログ

両面印刷について

環境/言語:[使用言語:VB.NET2003]
分類:[.NET]

みなさん、こんにちは。
現在、両面印刷機能を可能にさせようと色々調べています。
Duplexプロパティを使用すれば、実現できると思っているのですが、
その使い方がわからない状況です。。。

下記のプログラムをご確認お願いします。


'####### Aカード #######
Public Sub Print_ACard()

Dim prtdoc As New System.Drawing.Printing.PrintDocument
Dim prtpre As New PrintPreviewDialog

prtdoc.DefaultPageSettings.Landscape = False
prtdoc.DocumentName = "Aカード印刷"
AddHandler prtdoc.PrintPage, AddressOf PrintPage_Adata

prtdoc.Print() '←ここで印刷

End Sub


'/////// Aカードデータ ///////
Public Sub PrintPage_Adata(ByVal sender As Object, ByVal e As PrintPageEventArgs)

〜表示内容は省略〜

End Sub

--------------------------------------------------------------------------------------------------

'####### Bカード #######
Public Sub Print_BCard()

Dim prtdoc As New System.Drawing.Printing.PrintDocument
Dim prtpre As New PrintPreviewDialog

prtdoc.DefaultPageSettings.Landscape = True '印刷方向を横に指定
prtdoc.DocumentName = "Bカード印刷"
AddHandler prtdoc.PrintPage, AddressOf PrintPage_Bdata

prtdoc.Print() '←ここで印刷

End Sub


'/////// Bカードデータ ///////
Public Sub PrintPage_Bdata(ByVal sender As Object, ByVal e As PrintPageEventArgs)

〜表示内容は省略〜

End Sub



現在Aカード、Bカードは別々に出力されています。


〜やりたいこと〜
Aカードを印刷実行した時に、自動でAカードの裏面にBカードの内容を印刷したいと思っています。
2回ボタンを押す処理⇒1回の処理で済ませたいです。


どなたかお力を貸して頂けないでしょうか。
どうぞ、宜しくお願い致します。
・Bカードの『〜表示内容は省略〜』っていう所を、Aカードの『〜表示内容は省略〜』ってところに統合

これでAカードを印刷しようとすればAとBの内容が印刷されるはずです。
そして内容Aと内容Bの間に改ページを入れておけば2枚に印刷されます。
その2枚を1枚の紙で印刷するかはプリンタの設定なので、話はそれからですね。
づか様
コメント有難うございます。

> ・Bカードの『〜表示内容は省略〜』っていう所を、Aカードの『〜表示内容は省>略〜』ってところに統合

この方法でしたらソースが長くなってしまい、私の中では最後の手段と考えておりました。でも、、やはりこの方法しかないのでしょうか。

この他に何かあれば、ご教授お願い致します。
■No27441に返信(JTさんの記事)
■No27441に返信(JTさんの記事)
>>・Bカードの『〜表示内容は省略〜』っていう所を、Aカードの『〜表示内容は省略〜』ってところに統合
> この方法でしたらソースが長くなってしまい、

どの程度長くなりますか?

省略された部分の記述にもよりますが、トータルの長さは
今とそれほど変わらない気もしますが…。

Private cardNo As Integer

Public Sub Print_Card()
 Using prtdoc As New PrintDocument(), prtpre As New PrintPreviewDialog()
  prtdoc.DefaultPageSettings.Landscape = True
  prtdoc.DocumentName = "カード印刷"
  AddHandler prtdoc.PrintPage, AddressOf prtdoc_PrintPage
  cardNo = 1
  prtdoc.Print()
 End Using
End Sub

Private Sub PrintAdata(e As PrintPageEventArgs)
 '略
End Sub

Private Sub PrintBdata(e As PrintPageEventArgs)
 '略
End Sub

Private Sub prtdoc_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
 Select Case cardNo
  Case 1
   PrintAdata(e)
   e.HasMorePages = True '改ページ
  Case 2
   PrintBdata(e)
   e.HasMorePages = False '最終ページ
   cardNo = 1 '次回の印刷の為にリセット
  Case Else
   Debug.Fail("cardNo が不正です。")
 End Select
End Sub
魔界の仮面弁士 様

連絡遅くなり申し訳ございません。
返信有難うございます。

> どの程度長くなりますか?
>
> 省略された部分の記述にもよりますが、トータルの長さは
> 今とそれほど変わらない気もしますが…。
>
Aカード・・・1067行
Bカード・・・2703行

私まだまだ経験が浅い為、これが経験者にとって長いのか短いのか・・・。
私にとって長いソースだと思ってます。

結果ですが、魔界の仮面弁士様の方法で両面印刷可能になりましたが、
印刷が両方とも横に印刷されてしまいます。
Aカード内容は縦に、Bカード内容は横に印刷したいと思ってます。


ご教授宜しくお願いします。
> 印刷が両方とも横に印刷されてしまいます。

何処かに、それぞれのページ毎に方向を変えるっていう処理を書いてありますか?

prtdoc.DefaultPageSettings.Landscape = True '印刷方向を横に指定

『これから印刷する"全て"のページにおいて、特に指定が無い場合は横向きで印刷してね』と自分で書いているので、正常な動作です。
づか様
返信有難うございます。

私の最初の投稿(No.27436)に
>'####### Aカード #######
>Public Sub Print_ACard()

>Dim prtdoc As New System.Drawing.Printing.PrintDocument
>Dim prtpre As New PrintPreviewDialog

>prtdoc.DefaultPageSettings.Landscape = False





>'####### Bカード #######
>Public Sub Print_BCard()

>Dim prtdoc As New System.Drawing.Printing.PrintDocument
>Dim prtpre As New PrintPreviewDialog

>prtdoc.DefaultPageSettings.Landscape = True '印刷方向を横に指定

一応、Aカードは縦にBカードは横と指定しているつもりです。
■No27455に返信(JTさんの記事)
> 一応、Aカードは縦にBカードは横と指定しているつもりです。
>prtdoc.DefaultPageSettings.Landscape =

づかさんが書かれているように、そのコードでは
既定の設定(DefaultPageSettings)のみが指定されており、
ページごとの設定になっていません。ヘルプにも書かれているように、
印刷の開始後に DefaultPageSettings プロパティを使用して
ページ設定を変更しても、印刷中のページには影響を与えないのです。

DefaultPageSettings プロパティの解説にある、
「ページごとに設定を指定するには…」の項を参照してみてください。
http://msdn.microsoft.com/ja-jp/library/system.drawing.printing.printdocument.defaultpagesettings%28VS.80%29.aspx
づか様、魔界の仮面弁士様

ご返信有難うございます。
また、アドバイス頂き有難うございます。

まだまだ勉強不足です。
教えて頂いた情報を参考にしても未だ、どのように書けばよいのか分からず・・。

もっと調べていきます。
■No27470に返信(JTさんの記事)
> 教えて頂いた情報を参考にしても未だ、どのように書けばよいのか分からず・・。
質問は具体的に書いてください。その方が早く解決しますよ。


先の回答で、
>> 「ページごとに設定を指定するには…」の項を参照してみてください。
と書きましたが、その記述はご覧になられたようですね。

ということは、その記述の意味が理解できなかったということでしょうか。
だとしたら、文中のどの部分が分かりませんでしたか?

あるいは、記載されている内容に従って書いてみたものの、望んでいた結果には
ならなかったということでしょうか。であれば、実際にどのようなコードを
記載して、その結果、どのようになってしまうかを投稿してみてください。
魔界の仮面弁士様
ご返信有難うございます。

>ページごとに設定を指定するには、PrintPage イベントまたは >QueryPageSettings イベントを処理し・・・

と書いてまして、QueryPageSettingsを使えばと出来ると思ってますが
実際に、何処に書くか、またどのように書けばよいのか分からず
コードも出来てない状況です。。
■No27474に返信(JTさんの記事)
>> ページごとに設定を指定するには、PrintPage イベントまたは
>> QueryPageSettings イベントを処理し、それぞれ
>> PrintPageEventArgs または QueryPageSettingsEventArgs に含まれる
>> PageSettings 引数を変更します。

PrintPage イベントの引数 e は PrintPageEventArgs クラスですし、
QueryPageSettings イベントの方は、QueryPageSettingsEventArgs ですよね。

どちらのイベントを使うにしても、ページの設定は、イベント引数 e の
PageSettings プロパティで示されるという事です(つまり、e.PageSettings )。
その使い方は、先の prtdoc.DefaultPageSettings と一緒です。



> と書いてまして、QueryPageSettingsを使えばと出来ると思ってますが
> 実際に、何処に書くか、またどのように書けばよいのか分からず

PrintPage イベントは、「各ページの印刷時」に発生するイベントです。
ここには「n ページ目の印刷内容」を記述します。

QueryPageSettings イベントは、PrintPage イベントの直前に発生します。
Query とは質問とか問い合わせといった意味であり、ここには
「n ページ目の用紙・印刷設定」を記述します。


複数ページの印刷を行う場合、ページ数分のイベントが発生します。
現在何ページ目を印刷しているのかは、自身で管理しておいてください。
魔界の仮面弁士 様
返信が遅くなり申し訳ありません。

下記のソースで両面印刷が可能になりました。
また、実現させたかったAカード内容は縦に、Bカード内容は横に印刷ができ
非常に感謝しています。

正しい書き方ではないと思いますけど・・・。うまく動作してくれます。。



Private cardNo As Integer

Public Sub Print_CardNo()

Dim prtdoc As New System.Drawing.Printing.PrintDocument

prtdoc.DocumentName = "カード印刷"
AddHandler prtdoc.PrintPage, AddressOf Print_PrintPage

cardNo = 1
AddHandler prtdoc.QueryPageSettings, AddressOf Print_Query
prtdoc.Print()

End Sub


Private Sub Print_Query(ByVal sender As Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs)

With e.PageSettings
If cardNo = 1 Then
e.PageSettings.Landscape = False
ElseIf cardNo = 2 Then
e.PageSettings.Landscape = True
End If
End With

End Sub

Private Sub Print_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)

Select Case CardNo
Case 1
PrintPage_Adata(sender, e)
e.HasMorePages = True

Case 2

PrintPage_Bdata(sender, e)
e.HasMorePages = False '最終ページ
CardNo = 1 '次回の印刷の為にリセット
Exit Sub
Case Else
Debug.Fail("CardNo が不正です。")
End Select
CardNo = CardNo + 1

End Sub







'/////// Aカードデータ ///////
Public Sub PrintPage_Adata(ByVal sender As Object, ByVal e As PrintPageEventArgs)

〜表示内容は省略〜

End Sub


'/////// Bカードデータ ///////
Public Sub PrintPage_Bdata(ByVal sender As Object, ByVal e As PrintPageEventArgs)

〜表示内容は省略〜

End Sub
遅くなりましたが、うまく動作してくてますので解決と処理します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板