.NET 3.5 で作業しています。
概要:
Windows 7 で壊れる既存のサード パーティ製コンポーネントの機能を複製しようとしています。これまで、ユーザーは印刷する画像ファイルの束を選択し、各画像のページ サイズを指定してから、一度に送信してすべてを印刷することができました。各ページを印刷するときにその場でページサイズを切り替えて印刷する方法の概念的な説明が必要です。
詳細
これまでのところ、複数の画像をすべて同じページサイズで印刷する方法を見つけました。画像のリストを使用し、PrintDocument
オブジェクトを使用して、リストの最後に到達するまでのHasMorePages
プロパティPrintPageEventArgs
を true に設定します。
これをテストするためにすぐにまとめたクラスを次に示します。
public partial class Form1 : Form
{
private List<Image> images { get; set; }
private PrintDocument printDocument { get; set; }
public Form1()
{
InitializeComponent();
this.images = new List<Image>();
this.images.Add(Image.FromFile(@"C:\test60.bmp"));
this.images.Add(Image.FromFile(@"C:\SuperLargeTest.jpg"));
this.printDocument = new PrintDocument()
{
PrinterSettings = new PrinterSettings()
};
this.printDocument.PrintPage += printDocument_PrintPage;
}
private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
e.PageSettings.PaperSize = this.paperSizes[this.currentImageIndex];
RectangleF marginBounds = e.MarginBounds;
RectangleF printableArea = e.PageSettings.PrintableArea;
int availableWidth = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Width : (e.PageSettings.Landscape ? printableArea.Height : printableArea.Width));
int availableHeight = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Height : (e.PageSettings.Landscape ? printableArea.Width : printableArea.Height));
g.DrawRectangle(Pens.Red, 0, 0, availableWidth - 1, availableHeight - 1);
g.DrawImage(this.images[currentImageIndex], printableArea);
e.HasMorePages = ++currentImageIndex < this.images.Count();
}
private void button1_Click(object sender, EventArgs e)
{
this.printDocument.OriginAtMargins = false;
this.printDocument.Print();
}
}
私が本当に理解できないのは、たとえば 2 番目の画像のページ サイズを変更する方法です。最初の画像を A4 で印刷し、次に 2 番目の画像を A3 で印刷したい場合、どうすればよいでしょうか?
私はこのSO question hereを見つけましPageSize
たPrintPageEventArgs
.
私もQueryPageSettingsEventArgs
イベントを使用してPageSettings
そこに設定しようとしましたが、それもうまくいかなかったようです...
私が達成したいのは、サイズの異なる複数のページを 1 つのドキュメントとして印刷することです。提案、リンク、説明、サンプル コードは大歓迎です。
C# や VB.NET であれば何でも構いません。