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
請顯示您嘗試過的方法,或許有些步驟可以重新創建問題 –
如何打印?文件是什麼文件格式? – xpda
這裏是我用過的代碼... – Brownd92