2015-09-07 131 views
0

有人可以請在這裏指出正確的方向。 我有一個由Windows窗體創建並保存到文件系統的圖像。然後,我想在保存後將該文件發送到標籤打印機。每次我這樣做,打印機都會打印垃圾。 任何幫助,非常感謝。發送a.bmp到熱敏打印機

感謝

Imports System 
Imports System.Text 
Imports System.Runtime.InteropServices 

<StructLayout(LayoutKind.Sequential)> _ 
Public Structure DOCINFO 
    <MarshalAs(UnmanagedType.LPWStr)> _ 
    Public pDocName As String 
    <MarshalAs(UnmanagedType.LPWStr)> _ 
    Public pOutputFile As String 
    <MarshalAs(UnmanagedType.LPWStr)> _ 
    Public pDataType As String 
End Structure 'DOCINFO 
_ 


Public Class PrintDirect 
    <DllImport("winspool.drv", CharSet:=CharSet.Unicode, ExactSpelling:=False, CallingConvention:=CallingConvention.StdCall)> _ 
    Public Shared Function OpenPrinter(ByVal pPrinterName As String, ByRef phPrinter As IntPtr, ByVal pDefault As Integer) As Long 

    End Function 


    <DllImport("winspool.drv", CharSet:=CharSet.Unicode, ExactSpelling:=False, CallingConvention:=CallingConvention.StdCall)> _ 
    Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal Level As Integer, ByRef pDocInfo As DOCINFO) As Long 

    End Function 


    <DllImport("winspool.drv", CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
    Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Long 

    End Function 


    <DllImport("winspool.drv", CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
    Public Shared Function WritePrinter(ByVal hPrinter As IntPtr, ByVal data As String, ByVal buf As Integer, ByRef pcWritten As Integer) As Long 

    End Function 




    <DllImport("winspool.drv", CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
    Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Long 

    End Function 


    <DllImport("winspool.drv", CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
    Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Long 

    End Function 

    <DllImport("winspool.drv", CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _ 
    Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Long 

    End Function 
End Class 'PrintDirect 

Public Class MyPrint 
    Public Shared Function SendImageToPrint(ByVal top As Integer, ByVal left As Integer, ByVal image As System.Drawing.Bitmap) As String 
     Dim ms As New System.IO.MemoryStream() 
     Dim bw As New System.IO.BinaryWriter(ms, Encoding.ASCII) 
     Dim dWidth As Double 
     dWidth = CType(image.Width/8, Double) 
     Dim P3 As Integer = Math.Ceiling(dWidth) 
     Dim strFormat As String = String.Format("GW{0},{1},{2},{3},", top, left, P3, image.Height) 
     bw.Write(Encoding.ASCII.GetBytes(strFormat)) 
     Dim canvasWidth As Integer = P3 * 8 
     For y As Integer = 0 To image.Height - 1 
      For x As Integer = 0 To canvasWidth - 1 
       Dim abyte As Byte = 0 
       For b As Integer = 0 To 7 
        x = x + 1 
        If x < image.Width Then 
         Dim dot As Integer = 1 
         Dim color As System.Drawing.Color = image.GetPixel(x, y) 
         Dim luminance As Integer = CType(((color.R * 0.3) + (color.G * 0.59) + (color.B * 0.11)), Integer) 
         If luminance > 127 Then 
          dot = 1 
         Else 
          dot = 0 
         End If 

         abyte = abyte Or CType(dot << (7 - b), Byte) 
        End If 
       Next 
       bw.Write(abyte) 
      Next 
     Next 
     bw.Write(vbCrLf) 
     bw.Flush() 
     ms.Position = 0 
     Return Encoding.GetEncoding(1252).GetString(ms.ToArray()) 

    End Function 

    Public Shared Sub PrintFunction(ByVal barcodeImage As System.Drawing.Image) 
     Dim lhPrinter As New System.IntPtr() 

     Dim di As New DOCINFO() 
     Dim pcWritten As Integer = 0 
     Dim st1 As String 


     ' text to print with a form feed character 
     ' st1 = strContent 
     di.pDocName = "SplitPackManager" 
     di.pDataType = "NT EMF 1.008" 



     Dim resultStatus As Long = PrintDirect.OpenPrinter("Two Pilots Demo Printer", lhPrinter, 0) 
     'Dim resultStatus As Long = PrintDirect.OpenPrinter("LD670 Raster", lhPrinter, 0) 

     'MessageBox.Show(resultStatus.ToString) 

     PrintDirect.StartDocPrinter(lhPrinter, 1, di) 
     PrintDirect.StartPagePrinter(lhPrinter) 

     Try 

      'PrintDirect.WritePrinter(lhPrinter, st1, st1.Length, pcWritten) 
      Dim bitmap As System.Drawing.Bitmap 
      bitmap = CType(barcodeImage, System.Drawing.Bitmap) 
      Dim strImage = SendImageToPrint(72, 36, bitmap) 
      PrintDirect.WritePrinter(lhPrinter, strImage, strImage.Length, pcWritten) 
     Catch e As Exception 
      Console.WriteLine(e.Message) 
      MessageBox.Show("PrintFunction") 
      MessageBox.Show(e.Message) 
     End Try 

     PrintDirect.EndPagePrinter(lhPrinter) 
     PrintDirect.EndDocPrinter(lhPrinter) 
     PrintDirect.ClosePrinter(lhPrinter) 
    End Sub 


End Class 
+0

請顯示您嘗試過的方法,或許有些步驟可以重新創建問題 –

+0

如何打印?文件是什麼文件格式? – xpda

+0

這裏是我用過的代碼... – Brownd92

回答

0

這可能是更容易使用PrintDocument類。這是一個粗略的輪廓。

Dim pd As PrintDocument 
AddHandler pd.PrintPage, AddressOf printPage 
' assign pd properties 
pd.Print 

Sub printPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) 
' assign img, set rectangle, determine number of pages, etc. 
e.Graphics.DrawImage(img, rectangle) ' essentially draws on the printer page 
e.HasMorePages = ... 
end sub 
相關問題