「前パン愛好会」にようこそ! 

 電車といえば、やっぱり前パンがかっこいい!
 そんな皆さんに、前パンを揃えてみました。
 えっ?前パンって何??という方。
 先頭車の前側にパンタグラフがある電車の事です。
 ぜひ、前パンの魅力にはまって下さいませ♪

【2023年】VB.NETで複数ページのPDFファイルを作成する

前回の投稿で、VB.NETで印刷機能を活用するとPDFファイルが作れることがわかりました。
ただ、複数ページの場合は複数ファイルの作成になってしまい、まとめる事ができませんでした。
そこで調べてみたところ、複数ページのPDFが作れることがわかりました。
再び、備忘録として記録しておきます。(Windows10以上のみ)
※ 前回の投稿(【2023年】VB.NETでPDFファイルを作成する)に追加した部分ですので、
  基本的な作成部分はそちらを参考にしてください。

複数ページのPDFファイルが欲しい

複数ページを印刷した場合、綴じてあると、内容がまとまっているしページの順も気にしなくていいし便利ですよね。
PDFファイルも、1枚1枚別ファイルより、一つのファイルに複数のページがあると使い勝手がよくなります。
無駄にファイル数を増やすこともありませんので。
前回、VB.NETでPDFファイルが作れることがわかったので、
今度は複数ページのPDFファイルの作成にチャレンジしてみます。

HasMorePagesがあるが…

複数ページの印刷処理について調べると、「HasMorePagesプロパティ」を利用するというのが多く出てきます。
自分も、紙での印刷処理ではこちらを使っておりました。
PDF作成も同じ印刷ロジックなので、大丈夫でしょう。

e.HasMorePages = True

を組み込んで印刷してみたところ、

と、改ページはされたものの、同じページに重なってしまいました。
見づらいし、意味がありません。
もしかすると上手くできるかもしれませんが、他のやり方を探ってみます。

PrintController.OnEndPageがあるらしい

調べてみたところ、「VB.NetでVB6のNewPageのような改ページ処理をする」というページが見つかりました。
PrintController.OnEndPageメソッドを呼び出すと、改ページ印刷ができるようです。
印刷処理の流れになっているので、
プリンター名を"Microsoft Print to PDF"で指定すれば、複数ページのPDFファイルが作成できるかもしれません。
今度は、重ならないように祈りながら…。

VB.NETで複数ページのPDFファイルが作成できた

このように書いて試してみたところ、こちらでは上手くできました。

VB.NET

'publicで宣言しておくといい
Public pd As New System.Drawing.Printing.PrintDocument
Public endpage_flg As Boolean

Dim g As Graphics = e.Graphics

' 最初のページは、そのまま印刷。最終ページフラグを印刷サブルーチンの中で判定しておく。
Call page_show(g)

' 最終ページフラグがオンになるまで、改ページして印刷。
Do Until endpage_flg = True
'ページを終了する。
pd.PrintController.OnEndPage(pd, e)
'新ページ開始。gは新ページとして更新し、印刷サブルーチンに引き渡す。
g = pd.PrintController.OnStartPage(pd, e)
Call page_show(g)
Loop

ファイルを開いてみると、

と、重ならずに別ページになりました。
これは使えそうです。

マイクロソフトのPrintController.OnStartPageの解説ページをみると、
戻り値がGraphicsになっています。
別のGraphicsを指定できるため、
HasMorePagesと違ってページが重ならずできるのかもしれません。

注意点

OnEndPageOnStartPageの関係ですが、

1ページ2ページ3ページ
EndStart    EndStart

となり、Endから始めてStartで終わる処理になります。
ついつい最後にEndPageを入れてしまいそうですが、
EndPageを入れると空のページが1枚後ろにつきますので、ご注意ください。

まとめ

前回の投稿で、VB.NETでPDFファイルが作成できるようになりましたが、
今回、機能を追加し、複数ページのPDFファイルを作る事ができました。
さらに使い勝手がよくなったかと思います。
みなさんの参考になると嬉しいです。

その他

Posted by 管理者