The type initializer for 'Microsoft.PointOfSer

2019-08-29 07:28发布

问题:

private void Form1_Load(object sender, EventArgs e)
{
    PrintReceipt();
}

private void PrintReceipt()
{
    PosPrinter printer = GetReceiptPrinter();

    try
    {
        ConnectToPrinter(printer);

        PrintReceiptHeader(printer, "ABCDEF Pte. Ltd.", "123 My Street, My City,", "My State, My Country", "012-3456789", DateTime.Now, "ABCDEF");

        PrintLineItem(printer, "Item 1", 10, 99.99);
        PrintLineItem(printer, "Item 2", 101, 0.00);
        PrintLineItem(printer, "Item 3", 9, 0.1);
        PrintLineItem(printer, "Item 4", 1000, 1);

        PrintReceiptFooter(printer, 1, 0.1, 0.1, "THANK YOU FOR CHOOSING ABC Ptr. Ltd.");
    }
    finally
    {
        DisconnectFromPrinter(printer);
    }
}

private void DisconnectFromPrinter(PosPrinter printer)
{
    printer.Release();
    printer.Close();
}

private void ConnectToPrinter(PosPrinter printer)
{
    printer.Open();
    printer.Claim(10000);
    printer.DeviceEnabled = true;
}

private PosPrinter GetReceiptPrinter()
{
    PosExplorer posExplorer = new PosExplorer(this);

    //May need to change this if you don't use a logicial name or use a different one.
    DeviceInfo receiptPrinterDevice = posExplorer.GetDevice("Generic/Text Only");

    return (PosPrinter)posExplorer.CreateInstance(receiptPrinterDevice);
}

private void PrintReceiptFooter(PosPrinter printer, int subTotal, double tax, double discount, string footerText)
{
    string offSetString = new string(' ', printer.RecLineChars / 2);

    PrintTextLine(printer, new string('-', (printer.RecLineChars / 3) * 2));
    PrintTextLine(printer, offSetString + String.Format("SUB-TOTAL     {0}", subTotal.ToString("#0.00")));
    PrintTextLine(printer, offSetString + String.Format("TAX           {0}", tax.ToString("#0.00")));
    PrintTextLine(printer, offSetString + String.Format("DISCOUNT      {0}", discount.ToString("#0.00")));
    PrintTextLine(printer, offSetString + new string('-', (printer.RecLineChars / 3)));
    PrintTextLine(printer, offSetString + String.Format("TOTAL         {0}", (subTotal - (tax + discount)).ToString("#0.00")));
    PrintTextLine(printer, offSetString + new string('-', (printer.RecLineChars / 3)));
    PrintTextLine(printer, String.Empty);

    //Embed 'center' alignment tag on front of string below to have it printed in the center of the receipt.
    PrintTextLine(printer, System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, (byte)'|', (byte)'c', (byte)'A' }) + footerText);

    //Added in these blank lines because RecLinesToCut seems to be wrong on my printer and
    //these extra blank lines ensure the cut is after the footer ends.
    PrintTextLine(printer, String.Empty);
    PrintTextLine(printer, String.Empty);
    PrintTextLine(printer, String.Empty);
    PrintTextLine(printer, String.Empty);
    PrintTextLine(printer, String.Empty);

    //Print 'advance and cut' escape command.
    PrintTextLine(printer, System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, (byte)'|', (byte)'1', (byte)'0', (byte)'0', (byte)'P', (byte)'f', (byte)'P' }));
}

private void PrintLineItem(PosPrinter printer, string itemCode, int quantity, double unitPrice)
{
    PrintText(printer, TruncateAt(itemCode.PadRight(9), 9));
    PrintText(printer, TruncateAt(quantity.ToString("#0.00").PadLeft(9), 9));
    PrintText(printer, TruncateAt(unitPrice.ToString("#0.00").PadLeft(10), 10));
    PrintTextLine(printer, TruncateAt((quantity * unitPrice).ToString("#0.00").PadLeft(10), 10));
}

private void PrintReceiptHeader(PosPrinter printer, string companyName, string addressLine1, string addressLine2, string taxNumber, DateTime dateTime, string cashierName)
{
    PrintTextLine(printer, companyName);
    PrintTextLine(printer, addressLine1);
    PrintTextLine(printer, addressLine2);
    PrintTextLine(printer, taxNumber);
    PrintTextLine(printer, new string('-', printer.RecLineChars / 2));
    PrintTextLine(printer, String.Format("DATE : {0}", dateTime.ToShortDateString()));
    PrintTextLine(printer, String.Format("CASHIER : {0}", cashierName));
    PrintTextLine(printer, String.Empty);
    PrintText(printer, "item      ");
    PrintText(printer, "qty       ");
    PrintText(printer, "Unit Price ");
    PrintTextLine(printer, "Total      ");
    PrintTextLine(printer, new string('=', printer.RecLineChars));
    PrintTextLine(printer, String.Empty);
}

private void PrintText(PosPrinter printer, string text)
{
    if (text.Length <= printer.RecLineChars)
        printer.PrintNormal(PrinterStation.Receipt, text); //Print text
    else if (text.Length > printer.RecLineChars)
        printer.PrintNormal(PrinterStation.Receipt, TruncateAt(text, printer.RecLineChars)); //Print exactly as many characters as the printer allows, truncating the rest.
}

private void PrintTextLine(PosPrinter printer, string text)
{
    if (text.Length < printer.RecLineChars)
        printer.PrintNormal(PrinterStation.Receipt, text + Environment.NewLine); //Print text, then a new line character.
    else if (text.Length > printer.RecLineChars)
        printer.PrintNormal(PrinterStation.Receipt, TruncateAt(text, printer.RecLineChars)); //Print exactly as many characters as the printer allows, truncating the rest, no new line character (printer will probably auto-feed for us)
    else if (text.Length == printer.RecLineChars)
        printer.PrintNormal(PrinterStation.Receipt, text + Environment.NewLine); //Print text, no new line character, printer will probably auto-feed for us.
}

private string TruncateAt(string text, int maxWidth)
{
    string retVal = text;
    if (text.Length > maxWidth)
        retVal = text.Substring(0, maxWidth);

     return retVal;
}

Getting the error on the following line in the GetReceiptPrinter method:

PosExplorer posExplorer = new PosExplorer(this);

I am using a TEP 220 Epson USB Printer. Any help please would be highly appreciated.

回答1:

I used your code to fit my project and it worked with this little changes.

Adding this to your app.config:

   <runtime>
      <NetFx40_LegacySecurityPolicy enabled="true"/>
    </runtime>

And

DeviceInfo receiptPrinterDevice = posExplorer.GetDevice(DeviceType.PosPrinter,"MYPRINTER");

I Hope it hepls.