2014-01-29 90 views
1

我的問題是,我的代碼打印的圖像彼此重疊。我不知道如何改變x和y的位置。打印機應該每行打印3張圖像,然後移動到下一行。如何使用PrintDocument在紙張上打印圖像

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
    { 
     for (int serial = 0; serial < SaveBeforePrint.Count; serial++) 
     { 
      String intercharacterGap = "0"; 
      String str = '*' + SaveBeforePrint[serial].ToUpper() + '*'; 
      int strLength = str.Length; 

      for (int i = 0; i < SaveBeforePrint[serial].Length; i++) 
      { 
       string barcodestring = SaveBeforePrint[serial].ToUpper(); 
       if (alphabet39.IndexOf(barcodestring[i]) == -1 || barcodestring[i] == '*') 
       { 
        e.Graphics.DrawString("INVALID BAR CODE TEXT", Font, Brushes.Red, 10, 10); 
        return; 
       } 
      } 

      String encodedString = ""; 

      for (int i = 0; i < strLength; i++) 
      { 
       if (i > 0) 
        encodedString += intercharacterGap; 

       encodedString += coded39Char[alphabet39.IndexOf(str[i])]; 
      } 

      int encodedStringLength = encodedString.Length; 
      int widthOfBarCodeString = 0; 
      double wideToNarrowRatio = 3; 


      if (align != AlignType.Left) 
      { 
       for (int i = 0; i < encodedStringLength; i++) 
       { 
        if (encodedString[i] == '1') 
         widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight); 
        else 
         widthOfBarCodeString += (int)weight; 
       } 
      } 

      int x = 0; 
      int wid = 0; 
      int yTop = 0; 
      SizeF hSize = e.Graphics.MeasureString(headerText, headerFont); 
      SizeF fSize = e.Graphics.MeasureString(code, footerFont); 

      int headerX = 0; 
      int footerX = 0; 
      int printonpage = 0; 

      if (align == AlignType.Left) 
      { 
       x = leftMargin; 
       headerX = leftMargin; 
       footerX = leftMargin; 
      } 

      else if (align == AlignType.Center) 
      { 
        x = (Width - widthOfBarCodeString)/2; 
        headerX = (Width - (int)hSize.Width)/2; 
        footerX = (Width - (int)fSize.Width)/2; 

      } 
      else 
      { 
       x = Width - widthOfBarCodeString - leftMargin; 
       headerX = Width - (int)hSize.Width - leftMargin; 
       footerX = Width - (int)fSize.Width - leftMargin; 
      } 

      if (showHeader) 
      { 
       yTop = (int)hSize.Height + topMargin; 
       e.Graphics.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin); 
      } 
      else 
      { 
       yTop = topMargin; 
      } 

      for (int i = 0; i < encodedStringLength; i++) 
      { 
        if (encodedString[i] == '1') 
         wid = (int)(wideToNarrowRatio * (int)weight); 
        else 
         wid = (int)weight; 

        e.Graphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, yTop, wid, height); 

        x += wid; 



      } 
      yTop += height; 

      if (showFooter) 
       e.Graphics.DrawString(SaveBeforePrint[serial], footerFont, Brushes.Black, footerX, yTop); 
     } 

    } 

所需的輸出:

enter image description here

我越來越:

enter image description here

正如你所看到的最後一個數字是重疊的。我想把它畫在前一個旁邊

+0

它只是最後一位數字,還是將所有三個條形碼重疊在一起?目前尚不清楚最後的重疊是什麼。你是否得到一個或三個條形碼? – DonBoitnott

+0

其實它重疊所有三個條形碼作爲起始數字是相同的,這就是爲什麼它不顯示重疊@DonBoitnott –

+0

您好,請您評論代碼..我的意思是提供適當的評論,所以這將是非常容易的我檢查出整個代碼..和關於變量的一些描述。 –

回答

0

我觀察到的代碼並發現問題。在panel1_printü沒有正確遞增值..

我已經做了必要的更改,現在U將得到的線4條和第5之一另一行 - 檢查附加的圖像。

enter image description here

只是這個新的代碼替換烏爾panel1_Paint多數民衆贊成它,你可以找到的變化.. 我將其標示爲

//start changes by Deepak 
.. 
.. 
.. 
//end changes by Deepak 

,也宣告兩個變量loopValX和loopValY爲int

這裏是代碼..

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    int loopValX = 0; 
    int loopValY = -150; 

    for (int serial = 0; serial < SaveBeforePrint.Count; serial++) 
    { 
     String intercharacterGap = "0"; 
     String str = '*' + SaveBeforePrint[serial].ToUpper() + '*'; 
     int strLength = str.Length; 

     for (int i = 0; i < SaveBeforePrint[serial].Length; i++) 
     { 
      string barcodestring = SaveBeforePrint[serial].ToUpper(); 
      if (alphabet39.IndexOf(barcodestring[i]) == -1 || barcodestring[i] == '*') 
      { 
       e.Graphics.DrawString("INVALID BAR CODE TEXT", Font, Brushes.Red, 10, 10); 
       return; 
      } 
     } 

     String encodedString = ""; 

     for (int i = 0; i < strLength; i++) 
     { 
      if (i > 0) 
       encodedString += intercharacterGap; 

      encodedString += coded39Char[alphabet39.IndexOf(str[i])]; 
     } 

     int encodedStringLength = encodedString.Length; 
     int widthOfBarCodeString = 0; 
     double wideToNarrowRatio = 3; 


     if (align != AlignType.Left) 
     { 
      for (int i = 0; i < encodedStringLength; i++) 
      { 
       if (encodedString[i] == '1') 
        widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight); 
       else 
        widthOfBarCodeString += (int)weight; 
      } 
     } 


     SizeF hSize = e.Graphics.MeasureString(headerText, headerFont); 
     SizeF fSize = e.Graphics.MeasureString(SaveBeforePrint[serial], footerFont); 

     int headerX = 0; 
     int footerX = 0; 

     if (align == AlignType.Left) 
     { 
      x = leftMargin; 
      headerX = leftMargin; 
      footerX = leftMargin; 
     } 

     else if (align == AlignType.Center) 
     { 
       x = (Width - widthOfBarCodeString)/2; 
       headerX = (Width - (int)hSize.Width)/2; 
       footerX = (Width - (int)fSize.Width)/2; 
     } 
     else 
     { 
      x = Width - widthOfBarCodeString - leftMargin; 
      headerX = Width - (int)hSize.Width - leftMargin; 
      footerX = Width - (int)fSize.Width - leftMargin; 
     } 

     if (showHeader) 
     { 
      y = (int)hSize.Height + topMargin; 
      e.Graphics.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin); 
     } 
     else 
     { 
      y = topMargin; 
     } 


     //start changes by Deepak 
     if (serial % 4 == 0) 
     { 
      loopValX = 0; 
      loopValY += 150; 
     } 
     else 
     { 
      loopValX += 150; 
     } 

     x += loopValX; 
     y += loopValY; 
     footerX += loopValX; 

     //end changes by Deepak 


     for (int i = 0; i < encodedStringLength; i++) 
     { 
       if (encodedString[i] == '1') 
        wid = (int)(wideToNarrowRatio * (int)weight); 
       else 
        wid = (int)weight; 

       e.Graphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, y, wid, height); 

       x += wid; 

     } 
     y += height; 

     if (showFooter) 
      e.Graphics.DrawString(SaveBeforePrint[serial], footerFont, Brushes.Black, footerX, y); 
    } 

} 
0

你應該在DataGridView的幫助下做到這一點(它包含一列中的圖像)。 圖像將在每個新行或列中打印(通過修改爲您的願望) 下面的類將通過將其整個DataGridView和Header傳遞給其構造函數來完成您的工作。

using System; 
using System.Collections; 
using System.Drawing; 
using System.Drawing.Printing; 
using System.Windows.Forms; 
using System.Linq; 

namespace Waqas 
{ 
    internal class ClsPrint 
    { 
     #region Variables 

     private int iCellHeight = 0; //Used to get/set the datagridview cell height 
     private int iTotalWidth = 0; // 
     private int iRow = 0; //Used as counter 
     private bool bFirstPage = false; //Used to check whether we are printing first page 
     private bool bNewPage = false; // Used to check whether we are printing a new page 
     private int iHeaderHeight = 0; //Used for the header height 
     private StringFormat strFormat; //Used to format the grid rows. 
     private ArrayList arrColumnLefts = new ArrayList(); //Used to save left coordinates of columns 
     private ArrayList arrColumnWidths = new ArrayList(); //Used to save column widths 
     private PrintDocument _printDocument = new PrintDocument(); 
     private DataGridView gw = new DataGridView(); 
     private string _ReportHeader; 

     #endregion 

     public ClsPrint(DataGridView gridview, string ReportHeader) 
     { 
      _printDocument.DefaultPageSettings.Landscape = true; 
      _printDocument.DefaultPageSettings.PaperSize.RawKind = (int)PaperKind.A4; 
      _printDocument.DefaultPageSettings.Margins = new Margins(30, 30, 30, 30); 

      //_printDocument.DefaultPageSettings.PaperSize.PaperName = "A4"; 

      _printDocument.PrintPage += new PrintPageEventHandler(_printDocument_PrintPage); 
      _printDocument.BeginPrint += new PrintEventHandler(_printDocument_BeginPrint); 
      gw = gridview; 
      _ReportHeader = ReportHeader; 
     } 

     public void PrintForm() 
     { 
      //Open the print preview dialog 
      PrintPreviewDialog objPPdialog = new PrintPreviewDialog(); 
      objPPdialog.Document = _printDocument; 
      objPPdialog.ShowIcon = false; 
      objPPdialog.Text = "Print Preview"; 
      objPPdialog.WindowState = FormWindowState.Maximized; 
      objPPdialog.ShowDialog(); 
     } 

     private void _printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
     { 
      //try 
      //{ 
      //Set the left margin 
      int iLeftMargin = e.MarginBounds.Left; 
      //Set the top margin 
      int iTopMargin = e.MarginBounds.Top; 
      //Whether more pages have to print or not 
      bool bMorePagesToPrint = false; 
      int iTmpWidth = 0; 

      //For the first page to print set the cell width and header height 
      if (bFirstPage) 
      { 
       foreach (DataGridViewColumn GridCol in gw.Columns) 
       { 
        iTmpWidth = ((int) (Math.Floor((double) ((double) GridCol.Width/ 
                  (double) iTotalWidth*(double) iTotalWidth* 
                  ((double) e.MarginBounds.Width/(double) iTotalWidth))))); 

        iHeaderHeight = (int) (e.Graphics.MeasureString(GridCol.HeaderText, 
         GridCol.InheritedStyle.Font, iTmpWidth).Height) + 60; 

        // Save width and height of headers 
        arrColumnLefts.Add(iLeftMargin); 
        arrColumnWidths.Add(iTmpWidth); 
        iLeftMargin += iTmpWidth; 
       } 
      } 
      //Loop till all the grid rows not get printed 
      while (iRow <= gw.Rows.Count - 1) 
      { 
       DataGridViewRow GridRow = gw.Rows[iRow]; 
       //Set the cell height 
       iCellHeight = GridRow.Height + 30; 
       int iCount = 0; 
       //Check whether the current page settings allows more rows to print 
       if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top) 
       { 
        bNewPage = true; 
        bFirstPage = false; 
        bMorePagesToPrint = true; 
        break; 
       } 
       else 
       { 

        if (bNewPage) 
        { 
         //Draw Header 
         e.Graphics.DrawString(_ReportHeader, 
          new Font("Calibri Light", 20, FontStyle.Bold), 
          new SolidBrush(Color.Black), e.MarginBounds.Left, 
          e.MarginBounds.Top+20 - e.Graphics.MeasureString(_ReportHeader, 
           new Font(gw.Font, FontStyle.Bold), 
           e.MarginBounds.Width).Height - 13); 

         String strDate = DateTime.Now.ToString("dd-MMM-yy hh:mm tt"); 
         //Draw Date 
         e.Graphics.DrawString(strDate, 
          new Font("Calibri Light", 12, FontStyle.Bold), Brushes.Black, 
          e.MarginBounds.Left-20 + 
          (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, 
           new Font(gw.Font, FontStyle.Bold), 
           e.MarginBounds.Width).Width), 
          e.MarginBounds.Top+30 - e.Graphics.MeasureString(_ReportHeader, 
           new Font(new Font(gw.Font, FontStyle.Bold), 
            FontStyle.Bold), e.MarginBounds.Width).Height - 13); 

         //Draw Columns     
         iTopMargin = e.MarginBounds.Top+30; 
         DataGridViewColumn[] _GridCol = new DataGridViewColumn[gw.Columns.Count]; 
         int colcount = 0; 
         //Convert ltr to rtl 
         foreach (DataGridViewColumn GridCol in gw.Columns) 
         { 
          _GridCol[colcount++] = GridCol; 
         } 
         for (int i =0; i <= (_GridCol.Count() - 1); i++) 
         { 
          e.Graphics.FillRectangle(new SolidBrush(Color.Gainsboro), 
           new Rectangle((int) arrColumnLefts[iCount], iTopMargin, 
            (int) arrColumnWidths[iCount], iHeaderHeight)); 

          e.Graphics.DrawRectangle(new Pen(Color.Black), 
           new Rectangle((int) arrColumnLefts[iCount], iTopMargin, 
            (int) arrColumnWidths[iCount], iHeaderHeight)); 

          e.Graphics.DrawString(_GridCol[i].HeaderText, 
           new Font("Calibri Light", 12, FontStyle.Bold), 
           new SolidBrush(Color.Black), 
           new RectangleF((int) arrColumnLefts[iCount], iTopMargin, 
            (int) arrColumnWidths[iCount], iHeaderHeight), strFormat); 
          iCount++; 
         } 
         bNewPage = false; 
         iTopMargin += iHeaderHeight; 
        } 
        iCount = 0; 
        DataGridViewCell[] _GridCell = new DataGridViewCell[GridRow.Cells.Count]; 
        int cellcount = 0; 
        //Convert ltr to rtl 
        foreach (DataGridViewCell Cel in GridRow.Cells) 
        { 
         _GridCell[cellcount++] = Cel; 
        } 
        //Draw Columns Contents     
        for (int i =0; i <=(_GridCell.Count() - 1); i++) 
        { 
         if (_GridCell[i].Value != null) 
         { 
          if (_GridCell[i].GetType() != typeof (DataGridViewImageCell)) 
          { 
           e.Graphics.DrawString(_GridCell[i].FormattedValue.ToString(), 
            new Font("Calibri Light", 10), 
            new SolidBrush(Color.Black), 
            new RectangleF((int) arrColumnLefts[iCount], 
             (float) iTopMargin, 
             (int) arrColumnWidths[iCount], (float) iCellHeight), 
            strFormat); 
          } 
          else 
          { 








           Image img = Common.byteArrayToImage((byte[]) _GridCell[i].Value); 
           Rectangle m = new Rectangle((int) arrColumnLefts[iCount],iTopMargin, 
                  (int) arrColumnWidths[iCount], iCellHeight); 

           if ((double)img.Width/(double)img.Height > (double)m.Width/(double)m.Height) // image is wider 
           { 
            m.Height = (int)((double)img.Height/(double)img.Width * (double)m.Width); 
           } 
           else 
           { 
            m.Width = (int)((double)img.Width/(double)img.Height * (double)m.Height); 
           } 
           e.Graphics.DrawImage(img, m); 








          } 
         } 
         //Drawing Cells Borders 
         e.Graphics.DrawRectangle(new Pen(Color.Black), 
          new Rectangle((int) arrColumnLefts[iCount], iTopMargin, 
           (int) arrColumnWidths[iCount], iCellHeight)); 
         iCount++; 
        } 
       } 
       iRow++; 
       iTopMargin += iCellHeight; 
      } 
      //If more lines exist, print another page. 
      if (bMorePagesToPrint) 
       e.HasMorePages = true; 
      else 
       e.HasMorePages = false; 
      //} 
      //catch (Exception exc) 
      //{ 
      // KryptonMessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, 
      //  MessageBoxIcon.Error); 
      //} 
     } 

     private void _printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) 
     { 
      try 
      { 
       strFormat = new StringFormat(); 
       strFormat.Alignment = StringAlignment.Center; 
       strFormat.LineAlignment = StringAlignment.Center; 
       strFormat.Trimming = StringTrimming.EllipsisCharacter; 

       arrColumnLefts.Clear(); 
       arrColumnWidths.Clear(); 
       iCellHeight = 0; 
       iRow = 0; 
       bFirstPage = true; 
       bNewPage = true; 

       // Calculating Total Widths 
       iTotalWidth = 0; 
       foreach (DataGridViewColumn dgvGridCol in gw.Columns) 
       { 
        iTotalWidth += dgvGridCol.Width; 
       } 
      } 
      catch (Exception ex) 
      { 
       KryptonMessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

    } 
} 

ClsPrint _ClsPrint = new ClsPrint(myDataGridView, "MyHeader"); 
_ClsPrint.PrintForm(); 
+0

我得到常見錯誤?它是什麼?以及我如何將barCodea放入其中?我的意思是我的panel1_Paint功能? –

+0

通用類包含像bayteArrayToImage這樣的基本圖像轉換函數,反之亦然。 –

+0

public static byte [] imageToByteArray(Image imageIn) { 嘗試 { Bitmap bm = new Bitmap(imageIn); MemoryStream ms = new MemoryStream(); bm.Save(ms,ImageFormat.Jpeg); return ms.ToArray(); } catch(Exception ex) { throw ex; } } –

0

您的位置變量被宣佈循環內,這意味着它們對每個經過循環復位。保持循環外的X和Y的位置變量超過serial,並針對每個條形碼的總寬度(和高度,如果開始新一行條形碼)進行調整。

相關問題