Domanda

Sto cercando di stampare i dati ASCII grezzi su una stampante termica.Lo faccio utilizzando questo esempio di codice: http://support.microsoft.com/kb/322091 ma la mia stampante stampa sempre un solo carattere e questo solo quando premo il pulsante di avanzamento modulo.Se stampo qualcosa con il blocco note, la stampante eseguirà automaticamente un avanzamento modulo ma senza stampare alcun testo.

La stampante è collegata tramite USB tramite un adattatore lpt2usb e Windows 7 utilizza il driver "Generico -> Generico/Solo testo".

Qualcuno sa cosa c'è che non va?Come è possibile stampare alcune parole e alimentare alcuni moduli?Ci sono alcuni caratteri di controllo che devo inviare?E se sì:Come posso inviarli?

Modifica 14.04.2010 21:51

Il mio codice (C#) è simile al seguente:

PrinterSettings s =  new PrinterSettings();
s.PrinterName = "Generic / Text Only";

RawPrinterHelper.SendStringToPrinter(s.PrinterName, "Test");

Questo codice restituirà una "T" dopo aver premuto il pulsante di avanzamento modulo (questo piccolo pulsante nero qui:swissmania.ch/images/935-151.jpg - scusate, reputazione insufficiente per due collegamenti ipertestuali)

Modifica 15.04.2010 16:56

Sto usando ora il modulo di codice qui:c-sharpcorner.com/UploadFile/johnodonell/PrintingDirectlytothePrinter11222005001207AM/PrintingDirectlytothePrinter.aspx

L'ho modificato un po' in modo da poter utilizzare il seguente codice:

byte[] toSend;
// 10 = line feed
// 13 carriage return/form feed
toSend = new byte[1] { 13 };
PrintDirect.WritePrinter(lhPrinter, toSend, toSend.Length, ref pcWritten);

L'esecuzione di questo codice ha lo stesso effetto della pressione del pulsante di avanzamento modulo, funziona bene!

Ma un codice come questo continua a non funzionare:

byte[] toSend;
// 10 = line feed
// 13 carriage return/form feed
toSend = new byte[2] { 66, 67 };
PrintDirect.WritePrinter(lhPrinter, toSend, toSend.Length, ref pcWritten);

Verrà stampata solo una "B" ma mi aspetto "BC" E dopo aver eseguito qualsiasi codice devo ricollegare il cavo USB per farlo funzionare di nuovo.Qualche idea?

È stato utile?

Soluzione 2

Ok, il motivo di tutto questo è solo il fatto che utilizzo un adattatore perché il mio computer non ha una vecchia porta lpt.Ho copiato la mia applicazione su un vecchio computer con Windows XP e tutto funziona correttamente.

Adesso devo sperare che anche gli altri adattatori lpt2usb che ho comprato facciano il loro lavoro correttamente.

Modifica 20.04.2010

Con un altro adattatore lpt2usb ora funziona tutto bene.Se qualcuno è interessato a tutto il codice che sto utilizzando ora, contattami o commenta qui.

Altri suggerimenti

Soluzione rapida passo dopo passo

Poiché il codice non è stato fornito, lo faccio funzionare con l'aiuto dei collegamenti forniti ed ecco il codice:

Codice

using System;
using System.Runtime.InteropServices;
using System.Windows;

[StructLayout(LayoutKind.Sequential)]
public struct DOCINFO {
    [MarshalAs(UnmanagedType.LPWStr)]
    public string pDocName;
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string pOutputFile;
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string pDataType;
}

public class PrintDirect {
    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
    public static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
    public static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO pDocInfo);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long StartPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long WritePrinter(IntPtr hPrinter, string data, int buf, ref int pcWritten);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long EndPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long EndDocPrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long ClosePrinter(IntPtr hPrinter);
}

private void Print(String printerAddress, String text, String documentName) {
    IntPtr printer = new IntPtr();

    // A pointer to a value that receives the number of bytes of data that were written to the printer.
    int pcWritten = 0;

    DOCINFO docInfo = new DOCINFO();
    docInfo.pDocName = documentName;
    docInfo.pDataType = "RAW";

    PrintDirect.OpenPrinter(printerAddress, ref printer, 0);
    PrintDirect.StartDocPrinter(printer, 1, ref docInfo);
    PrintDirect.StartPagePrinter(printer);

    try {
    PrintDirect.WritePrinter(printer, text, text.Length, ref pcWritten);
    } catch (Exception e) {
        Console.WriteLine(e.Message);
    }

    PrintDirect.EndPagePrinter(printer);
    PrintDirect.EndDocPrinter(printer);
    PrintDirect.ClosePrinter(printer);
}

Utilizzo

String printerAddress = "\\\\ComputerName\\PrinterName";
String documentName = "My document";
String documentText = "This is an example of printing directly to a printer.";

this.Print(indirizzostampante, testodocumento, nomedocumento);

Fonti:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top