Der Trick besteht darin, jeden Teil des Bildes in eine eigene Seite zu bekommen, und zwar im PrintPage
Ereignis der PrintDocument
.
Ich denke, dass der einfachste Weg ist, das Bild in separate Bilder aufzuteilen, eins für jede Seite. Ich nehme an, dass Sie das schon handhaben können (vorausgesetzt, Sie versuchen, das Bild zu partitionieren; dasselbe, legen Sie sie einfach auf separate Bilder). Dann schaffen wir die Printdocument-Instanz, haken Sie das Printpage-Ereignis auf, und gehen:
private List<Image> _pages = new List<Image>();
private int pageIndex = 0;
private void PrintImage()
{
Image source = new Bitmap(@"C:\path\file.jpg");
// split the image into 3 separate images
_pages.AddRange(SplitImage(source, 3));
PrintDocument printDocument = new PrintDocument();
printDocument.PrintPage += PrintDocument_PrintPage;
PrintPreviewDialog previewDialog = new PrintPreviewDialog();
previewDialog.Document = printDocument;
pageIndex = 0;
previewDialog.ShowDialog();
// don't forget to detach the event handler when you are done
printDocument.PrintPage -= PrintDocument_PrintPage;
}
private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
// Draw the image for the current page index
e.Graphics.DrawImageUnscaled(_pages[pageIndex],
e.PageBounds.X,
e.PageBounds.Y);
// increment page index
pageIndex++;
// indicate whether there are more pages or not
e.HasMorePages = (pageIndex < _pages.Count);
}
Hinweis, die Sie benötigen pageindex auf 0 vor dem Drucken des Dokuments wieder zurückgesetzt werden (zum Beispiel, wenn Sie das Dokument drucken möchten nach zeigt die Vorschau).
Ihre Lösung funktionierte auch für mich, ich habe innerhalb der PrintDocument_PrintPage-Methode den Seitenindex auf 0 zurückgesetzt, wenn er innerhalb der PrintDocument_EndPrint-Methode hätte sein sollen ... – coson
Kann jemand wie SplitImage (source, 3) ausführen? –