You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

153 lines
6.3 KiB

using ButcherFactory.BO;
using System;
using System.Collections.Generic;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ButcherFactory.SegmentStockUp_
{
internal static class SegmentStockUpPrint
{
const string PRINTFILE = @"PrintTemplate\SegmentStockUpPrint.html";
//public static void Print(StockUpDetail entity, string customer)
//{
// var dic = new Dictionary<string, string>();
// dic.Add("$Customer_Name", customer);
// dic.Add("$DriverLine_Name", entity.DeliverGoodsLine_Name);
// dic.Add("$Date", entity.Date.ToString("yyyy/MM/dd"));
// BwpClientPrint.BwpClientWebPrint.Print(PRINTFILE, dic);
//}
//public static void Print2(StockUpDetail entity, string customer)
//{
// PrintAPI.B_GetUSBBufferLen();
// PrintAPI.B_EnumUSB(new byte[128]);
// PrintAPI.B_CreateUSBPort(1);
// PrintAPI.B_Prn_Text_TrueType(42, 40, 36, "宋体", 1, 900, 0, 0, 0, "C1", "客户:张三");
// PrintAPI.B_Prn_Text_TrueType(42, 100, 36, "宋体", 1, 900, 0, 0, 0, "C2", "线路:青岛一线");
// PrintAPI.B_Prn_Text_TrueType(42, 160, 36, "宋体", 1, 900, 0, 0, 0, "C4", string.Format("日期:{0}", entity.Date.ToString("yyyy/MM/dd")));
// PrintAPI.B_Prn_Barcode(42, 220, 0, "1", 3, 22, 40, 'B', entity.BarCode);
// //PrintAPI.B_Prn_Text_TrueType(173, 360, 25, "宋体", 1, 500, 0, 0, 0, "C9", entity.BarCode);
// PrintAPI.B_Set_Direction('B');
// PrintAPI.B_Print_Out(1);
// PrintAPI.B_ClosePrn();
//}
public static void Print(SegmentStockUp entity,decimal last, string customer)
{
var templateString = File.ReadAllText("PrintTemplate\\SegmentStockUpPrint.txt", Encoding.UTF8);
var str = string.Format(templateString, customer, entity.DeliverGoodsLine_Name, entity.Date, entity.BarCode, last);
var printName = GetZebraPrintName();
SendBytesToPrinter(printName, System.Text.Encoding.Default.GetBytes(str));
}
private static string GetZebraPrintName()
{
foreach (string item in PrinterSettings.InstalledPrinters)
{
PrinterSettings setting = new PrinterSettings() { PrinterName = item };
if (setting.IsDefaultPrinter)
{
return setting.PrinterName;
}
}
throw new Exception("没有找到对应的打印机");
}
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string printerName, out IntPtr intptrPrinter, IntPtr intptrPrintDocument);
[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr intptrPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DocInfo docInfo);
[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr intptrPrinter);
[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr intptrPrinter);
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr intptrPrinter, IntPtr intptrBytes, Int32 count, out Int32 written);
[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr intptrPrinter);
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr intptrPrinter);
#region 定义打印文档信息类
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class DocInfo
{
[MarshalAs(UnmanagedType.LPStr)]
public string DocName;
[MarshalAs(UnmanagedType.LPStr)]
public string OutputFile;
[MarshalAs(UnmanagedType.LPStr)]
public string DataType;
}
#endregion
public static bool SendBytesToPrinter(string printerName, byte[] bytes)
{
bool bSuccess = false;
IntPtr pUnmanagedBytes = new IntPtr(0);
int nLength = bytes.Length;
// Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
// Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
// Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(printerName, pUnmanagedBytes, nLength);
// Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes);
return bSuccess;
}
private static bool SendBytesToPrinter(string printerName, IntPtr intptrBytes, Int32 count)
{
Int32 error = 0, written = 0;
IntPtr intptrPrinter = new IntPtr(0);
DocInfo docInfo = new DocInfo();
bool bSuccess = false;
docInfo.DocName = ".NET RAW Document";
docInfo.DataType = "RAW";
// Open the printer.
if (OpenPrinter(printerName.Normalize(), out intptrPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(intptrPrinter, 1, docInfo))
{
// Start a page.
if (StartPagePrinter(intptrPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(intptrPrinter, intptrBytes, count, out written);
EndPagePrinter(intptrPrinter);
}
EndDocPrinter(intptrPrinter);
}
ClosePrinter(intptrPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
error = Marshal.GetLastWin32Error();
}
return bSuccess;
}
}
}