Frage

Meine Anwendung muss Rechnungen drucken, dann erhalten eine die Rechnung aus der Datenbank, einfügen Informationen auf der Rechnung in einer großen Zeichenfolge (erzählt die Zeile, Spalte, etc.) danach ich die Zeichenfolge bereit halten an einen Drucker gesendet werden .

Mein Problem ist: Ich brauche ein paar ESC / P-Befehle / Zeichen in meiner großen Zeichenfolge setzen

Ich habe versucht, so etwas zu tun:

        char formFeed = (char)12;
        Convert.ToChar(12);

        MyBigString.Insert(10, formFeed);

Whith dies die Linie 10 eine Seitenvor tun, aber dies nicht funktioniert

. HINWEIS: ich das MybigString alle auf einmal an den Drucker senden

Um meinen Code Arbeiten zu machen, ich brauche die Daten Zeile für Zeile an einen Drucker senden?

Danke für die Hilfe.

PS:. Sorry, für mein Englisch, Ich bin ein brasilianischer Entwickler, die nicht Englisch sprechen (noch)

War es hilfreich?

Lösung

Umgehen Sie die Druckertreiber und den Drucker direkt zu steuern, seine nativen Befehlssprache verwendet wird, ist ein unterstütztes Szenario. Die P / Invoke erklärt auch in diesem KB Artikel .

Sicher wollen Sie das tun? Es ist ungewöhnlich, um es milde auszudrücken, in der Regel nur mit Low-Cost-Point-Of-Sale Thermo- oder Matrixdruckern versucht. Wenn Sie die Mechanik der PrintDocument.PrintPage nicht wie zu tun, niemand tut, könnte man meinen Code in Dieser Thread . Beachten Sie die Seitenvor Methode.

Andere Tipps

ich auch über diese gebloggt danach auf die harte Tour lernen, auch am selben Projekt.)

Dann verwende ich einen Code die byte Array zu senden, wie von den BinaryWriter erhalten, direkt an den Drucker durch P / Hervorrufen:

private static void Print(string printerName, byte[] document)
{
    NativeMethods.DOC_INFO_1 documentInfo;
    IntPtr printerHandle;

    documentInfo = new NativeMethods.DOC_INFO_1();
    documentInfo.pDataType = "RAW";
    documentInfo.pDocName = "Bit Image Test";

    printerHandle = new IntPtr(0);

    if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero))
    {
        if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo))
        {
            int bytesWritten;
            byte[] managedData;
            IntPtr unmanagedData;

            managedData = document;
            unmanagedData = Marshal.AllocCoTaskMem(managedData.Length);
            Marshal.Copy(managedData, 0, unmanagedData, managedData.Length);

            if (NativeMethods.StartPagePrinter(printerHandle))
            {
                NativeMethods.WritePrinter(
                    printerHandle,
                    unmanagedData,
                    managedData.Length,
                    out bytesWritten);
                NativeMethods.EndPagePrinter(printerHandle);
            }
            else
            {
                throw new Win32Exception();
            }

            Marshal.FreeCoTaskMem(unmanagedData);

            NativeMethods.EndDocPrinter(printerHandle);
        }
        else
        {
            throw new Win32Exception();
        }

        NativeMethods.ClosePrinter(printerHandle);
    }
    else
    {
        throw new Win32Exception();
    }
}

Viel Glück!

".... Openprinter (printerName.Normalize (), aus printerHandle, IntPtr.Zero) ..."

ist erforderlich IntPtr.Zero zu roh gesetzt zu.

Drucker, insbesondere Punktmatrix, kann es direkt mit DOS, CMD-Methode, die viel einfachste und schneller sein, aber auch zum Bedrucken kann mit einfachem ESC / 0x1b Befehlscodes, um den Drucker zu kontrollieren ,. . etc.

als windowos / Grafik, kann er Grafiken und roh, indem open sein (,, PRINTER_DEFAULTS) PRINTER_DEFAULTS und doc-inf, pls win32 sdk Referenzen verweisen.

für eine beliebigen Raw-Druck kann es Anwendungen ESC-Befehl (siehe Druckerhandbuch Details) beliebige Grafik als das, was Fenster drucken Fahrer haben.

als Druck roh, es nur append jede der ersten 20 ASCII-, wie oxoc (Seitenvorschub) 0x0doa (0x0A, 0x0d, \ n oder Neue-Zeile) jeder Drucker leichte ESC-Befehle Unterschiede hat aber mit dem Master ESC-Befehl für die meisten Dot-Matrix-ähnliche bestraft wird.

als Rohmodus Beispiel folgt, Seitenvor, \ n & \ r

char cFormfeed = 0x0c; // oder \ f

char CStr [] = "1 = text, ...... @ \ n2 = text ..... \ r \ f3 = text ......."; // Verwendung \ f nicht cFormfeed verwenden Sie es arbeiten können

CStr> lpt1; // Ausgabe an den Drucker dos oder cmd-Methode, der Ursache muss der LPT1 zur Verfügung bekommen.

auszudrucken wird

erste Seite

1 = Text, ...... @

2 = text .....

auf der 2. Seite ist

3 = Text .......

hoffen, diese können helfen, viel Glück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top