using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Drawing.Printing; namespace ConvertImage { public partial class Form1 : Form { // 截取图片数量计数器 private static int count; // 打印文档对象 private PrintDocument pdDocument; // 图片 private List<Image> listImages; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'cardIssuingDataSet.TNKIKAN' table. You can move, or remove it, as needed. this.tNKIKANTableAdapter.Fill(this.cardIssuingDataSet.TNKIKAN); } /// <summary> /// 生成datagridview图片 /// </summary> /// <param name="view"></param> /// <returns></returns> private static Bitmap GetDataGridView(DataGridView view) { // 将datagridview的自动扩展打开 view.AutoSize = true; // 建立datagridview图片 Bitmap newBitmap = new Bitmap(view.Width - 32, view.Height - 32); view.DrawToBitmap(newBitmap, new Rectangle(0, 0, view.Width, view.Height)); // 将datagridview恢复原状 view.AutoSize = false; return newBitmap; } private void button3_Click(object sender, EventArgs e) { pdDocument = new PrintDocument(); // 得到原始图片 Bitmap image = GetDataGridView(dataGridView1); // 纸张宽 int pageWidth = pdDocument.DefaultPageSettings.PaperSize.Width; // 纸张高 int pageHeigh = pdDocument.DefaultPageSettings.PaperSize.Height; // 得到所有分页图片 listImages = getAllImages(image, pageWidth, pageHeigh); count = 0; pdDocument.PrintPage += new PrintPageEventHandler(PrintDoc_PrintPage); PageSetupDialog setup = new PageSetupDialog(); setup.Document = pdDocument; setup.PageSettings.PaperSize = pdDocument.DefaultPageSettings.PaperSize; setup.ShowDialog(); PrintPreviewDialog dlgPrintPreview = new PrintPreviewDialog(); dlgPrintPreview.Document = pdDocument; dlgPrintPreview.ShowDialog(); } /// <summary> /// 打印预览 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void PrintDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { if (count < listImages.Count) { // 预览图片生成 e.Graphics.DrawImage(listImages.ElementAt(count), new Rectangle(0, 0, listImages.ElementAt(count).Width, listImages.ElementAt(count).Height)); count++; if (count < listImages.Count) { e.HasMorePages = true; } else { e.HasMorePages = false; } } } /// <summary> /// 分割图片 /// </summary> /// <param name="sourceImage"></param> /// <param name="pageWidth"></param> /// <param name="pageHeigh"></param> /// <returns></returns> private List<Image> getAllImages(Bitmap sourceImage, int pageWidth, int pageHeigh) { List<Image> listImages = new List<Image>(); // 距离图片左边位置 int left = 0; // 距离图片上边位置 int top = 0; // 切割部分 RectangleF part; // 切割图像 Bitmap s; // 下方还有图片 while ((top + pageHeigh) < sourceImage.Height) { // 右侧还有图片 while ((left + pageWidth) < sourceImage.Width) { part = new RectangleF(left, top, pageWidth, pageHeigh); s = sourceImage.Clone(part, PixelFormat.DontCare); listImages.Add(s); left += pageWidth; } // 最右边一个图片 part = new RectangleF(left, top, sourceImage.Width - left, pageHeigh); s = sourceImage.Clone(part, PixelFormat.DontCare); listImages.Add(s); top += pageHeigh; left = 0; } // 最下方的图片 while ((left + pageWidth) < sourceImage.Width) { part = new RectangleF(left, top, pageWidth, sourceImage.Height - top); s = sourceImage.Clone(part, PixelFormat.DontCare); listImages.Add(s); left += pageWidth; } // 右下角的图片 part = new RectangleF(left, top, sourceImage.Width - left, sourceImage.Height - top); s = sourceImage.Clone(part, PixelFormat.DontCare); listImages.Add(s); return listImages; } } }