web-dev-qa-db-fra.com

Développement d'applications POS - Impression de reçus

J'ai créé une application POS pour un restaurant/bar.
La partie design est terminée et depuis un mois je l'ai codée.
Tout fonctionne bien sauf que maintenant je dois imprimer. Je dois imprimer sur une imprimante de reçus connectée à l'ordinateur exécutant le logiciel et plus tard j'essaierai d'imprimer sur une imprimante distante comme celle de la cuisine.

J'ai cherché de l'aide en la matière uniquement pour constater que la norme pour l'impression dans ces types d'imprimantes utilise POS pour .NET. Le truc, c'est que c'est maintenant un peu dépassé ou du moins il n'a pas eu de mises à jour depuis quelques années. Il y a beaucoup de questions posées sur la façon d'utiliser cette bibliothèque et la plupart des réponses ne sont pas assez faciles à suivre. Donc, si quelqu'un pouvait vous aider pas à pas à imprimer comme une simple phrase ("Hello World") sur une imprimante de reçus, je vous en serais très reconnaissant.
J'utilise Visual Studio 2012 sous Windows 7 64 bits et je code WPF en c #.

17
Nuno

POS pour .NET est probablement la voie à suivre.

La plupart des fabricants d'imprimantes de reçus fourniront un objet de service OPOS.

Et comme l'indique cet article MSDN , POS pour .NET est compatible avec les objets de service OPOS v1.8.

OPOS/UPOS (sur lequel est basé POS pour .NET) est à mon humble avis une API mal conçue (conçue par les fabricants d'appareils plutôt que par les développeurs d'applications), mais c'est la meilleure que vous ayez aujourd'hui.

Je n'ai pas d'échantillons spécifiques, mais les bases sont les mêmes que pour OPOS - vous devez ouvrir, revendiquer, activer un appareil, puis vous pouvez appeler ses méthodes (telles que Imprimer). Vous pouvez essayer de regarder un exemple OPOS, par exemple cet exemple PosPrinter1 , qui sera probablement très similaire à POS pour .NET.

Ce blog contient des informations sur la configuration de POS pour .NET qui pourraient être utiles.

[~ # ~] mise à jour [~ # ~]

Voici un VB Hello World pour une imprimante OPOS. Vous devez d'abord créer une imprimante et l'ajouter au registre avec le nom de périphérique logique requis = LDN. Je pense que le Epson ADK comprend un utilitaire pour ajouter une imprimante dans le Registre. Cet utilitaire peut également effectuer un contrôle de santé sur l'imprimante pour vérifier qu'elle est installée correctement. Une fois que vous avez fait cela, il devrait être assez facile d'adapter le code ci-dessous à POS pour .NET

OPOSPOSPrinter.Open "MyPrinter"    ' LDN of your printer   
OPOSPOSPrinter.Claim 500           ' Timeout   
OPOSPOSPrinter.DeviceEnabled = True  

'- Print   
OPOSPOSPrinter.PrintNormal 2, "Hello world"  

'- Close the printer   
If OPOSPOSPrinter.Claimed then   
   OPOSPOSPrinter.Release   
End If  
OPOSPOSPrinter.Close  
12
Joe

Je sais que c'est un ancien poste, mais pour ceux qui recherchent toujours une solution, je peux vous dire ce que j'ai fait.

Après avoir passé de nombreuses heures à jouer avec OPOS et POS pour .Net, j'ai fini par les abandonner et à utiliser simplement le System.Drawing.Printing bibliothèques. L'OPOS et le POS pour .Net ont fini par être pénibles à travailler et, finalement, n'ont pas fonctionné aussi bien que les bibliothèques intégrées.

J'utilise une imprimante de reçus Epson TM-T20II.

Voici un code qui a bien fonctionné pour moi.

public static void PrintReceiptForTransaction()
{
    PrintDocument recordDoc = new PrintDocument();

    recordDoc.DocumentName = "Customer Receipt";
    recordDoc.PrintPage += new PrintPageEventHandler(ReceiptPrinter.PrintReceiptPage); // function below
    recordDoc.PrintController = new StandardPrintController(); // hides status dialog popup
                                                                // Comment if debugging 
    PrinterSettings ps = new PrinterSettings();
    ps.PrinterName = "EPSON TM-T20II Receipt";
    recordDoc.PrinterSettings = ps;
    recordDoc.Print();
    // --------------------------------------

    // Uncomment if debugging - shows dialog instead
    //PrintPreviewDialog printPrvDlg = new PrintPreviewDialog();
    //printPrvDlg.Document = recordDoc;
    //printPrvDlg.Width = 1200;
    //printPrvDlg.Height = 800;
    //printPrvDlg.ShowDialog();
    // --------------------------------------

    recordDoc.Dispose();
}

private static void PrintReceiptPage(object sender, PrintPageEventArgs e)
{
    float x = 10;
    float y = 5;
    float width = 270.0F; // max width I found through trial and error
    float height = 0F;

    Font drawFontArial12Bold = new Font("Arial", 12, FontStyle.Bold);
    Font drawFontArial10Regular = new Font("Arial", 10, FontStyle.Regular);
    SolidBrush drawBrush = new SolidBrush(Color.Black);

    // Set format of string.
    StringFormat drawFormatCenter = new StringFormat();
    drawFormatCenter.Alignment = StringAlignment.Center;
    StringFormat drawFormatLeft = new StringFormat();
    drawFormatLeft.Alignment = StringAlignment.Near;
    StringFormat drawFormatRight = new StringFormat();
    drawFormatRight.Alignment = StringAlignment.Far;

    // Draw string to screen.
    string text = "Company Name";
    e.Graphics.DrawString(text, drawFontArial12Bold, drawBrush, new RectangleF(x, y, width, height), drawFormatCenter);
    y += e.Graphics.MeasureString(text, drawFontArial12Bold).Height;

    text = "Address";
    e.Graphics.DrawString(text, drawFontArial10Regular, drawBrush, new RectangleF(x, y, width, height), drawFormatCenter);
    y += e.Graphics.MeasureString(text, drawFontArial10Regular).Height;

    // ... and so on
}

J'espère que cela aidera quelqu'un à éviter tous les problèmes avec les pilotes personnalisés. :)

18
Tim S

. Impression NET

L'impression sous .NET n'est pas trop difficile. Jetez un oeil ici et sur msdn .

L'impression sur une imprimante POS/ticket sera la même que l'impression sur toute autre imprimante, en supposant qu'il s'agit d'une imprimante Windows, d'un réseau ou autre. Si vous utilisez une imprimante série, les choses peuvent être un peu plus difficiles car vous devrez probablement utiliser des API spécifiques au fabricant, heureusement, bien que la plupart des bonnes imprimantes POS de nos jours soient entièrement prises en charge par le système d'exploitation.

Tout d'abord, vous devrez ajouter une référence à System.Printing dll à votre projet.

L'impression est alors aussi simple que

private void PrintText(string text)
{
    var printDlg = new PrintDialog();
    var doc = new FlowDocument(new Paragraph(new Run(text)));
    doc.PagePadding = new Thickness(10);

    printDlg.PrintDocument((doc as IDocumentPaginatorSource).DocumentPaginator, "Print Caption");
}

Utiliser..

PrintText("Hello World");

Vous pouvez également tirer parti de PrintDialog.PrintVisual et définir votre document à l'aide du modèle xaml.

Les paramètres d'impression peuvent être définis à l'aide des propriétés PrintDialog.

Obtenir l'imprimante sur laquelle vous souhaitez imprimer

private PrintQueue FindPrinter(string printerName)
{
    var printers = new PrintServer().GetPrintQueues();
    foreach (var printer in printers)
    {
        if (printer.FullName == printerName)
        {
            return printer;
        }
    }
    return LocalPrintServer.GetDefaultPrintQueue();
}

Quelques points à garder à l'esprit lors de l'impression sur une imprimante de reçus, vous devrez prendre en compte le formatage. Plus précisément, vous devrez tenir compte de la largeur de votre page et du nombre de caractères que vous pouvez insérer sur chaque ligne; cela a été beaucoup d'essais et d'erreurs pour moi, en particulier avec différentes tailles de police.

Dans la plupart des cas, vous n'avez pas vraiment à vous soucier de la pagination, l'imprimante coupera automatiquement le papier une fois votre document terminé.

4
nmaait

Si vous souhaitez imprimer à pleine vitesse de l'imprimante, vous devrez probablement utiliser des codes d'échappement spécifiques à l'imprimante et générer la sortie "brute".

Jetez un œil à la réponse de Michael Buen à cette SO , en particulier le bit UPDATE.

1
devstuff