2016-02-14 14 views
8

Ich hatte ein Problem mit der Seitengröße auf einem Thermodrucker. Ich habe von dieser Antwort angefangen: https://stackoverflow.com/a/27165167/1030464 und jetzt habe ich den Code, den ich unten eingefügt habe.Dynamische Papierhöhe mit .NET PrintDocument

Dies funktioniert gut, aber obwohl ich die Größe der Seite berechnen und einstellen, scheint es jedes Mal eine volle A4-Seite zu drucken. (Ich teste auf einem Sam4s Ellix II und Microsoft PDF Drucker) - Es ist ein großes Problem, da es oft 5-6 Zeilen lange Textschnipsel drucken muss.

benötige ich für mehrere Thermodrucker und ich brauche nur die Grundfunktionen (so dass keine Notwendigkeit zu empfangen Signale wie Papierstau, etc.), so entschied ich mich zu gehen mit den Windows-Druckertreiber anstelle den POS zu unterstützen. NET eins.

Ich berechne die Höhe des Textes und grösse das Papier entsprechend, aber es hat keine Auswirkung auf die Ausgabe Papiergröße. Hat jemand eine Lösung für dieses Problem?

Vielen Dank

public int Print(DatabaseConnector dc) 
{ 
    try { 

     // Set up PrintDocument 
     PrintDocument recordDoc = new PrintDocument(); 
     recordDoc.DocumentName = "PrintTask ID "+id.ToString(); 
     recordDoc.PrintPage += new PrintPageEventHandler(PrintTask.PrintReceiptPage); // Filling in the stuff 

     // Print Controller 
     StandardPrintController spc = new StandardPrintController(); 
     recordDoc.PrintController = spc; // This hides popup 

     // Printer Settings 
     PrinterSettings ps = new PrinterSettings(); 
     ps.PrinterName = dc.ReadSetting("PrinterName"); 
     recordDoc.PrinterSettings = ps; 
     recordDoc.Print(); 

     // Clean up 
     recordDoc.Dispose(); 
    } 
    catch (Exception exc) 
    { 
     ((MainForm)Application.OpenForms[0]).msg(exc.Message); 
    } 
    return 1; // ignore this 
} 

private static void PrintReceiptPage(object sender, PrintPageEventArgs e) 
{ 
    try { 
     // Read settings 
     DatabaseConnector db = new DatabaseConnector(); 
     PrintTask pt = db.ReadTask(); 
     float x = float.Parse(db.ReadSetting("PaperMarginFromLeft")); 
     float y = float.Parse(db.ReadSetting("PaperMarginFromTop")); 
     float width = float.Parse(db.ReadSetting("PaperWidth")); 
     float height = 0F; 
     string text; 

     // Set up font 
     Font drawFont1 = new Font(db.ReadSetting("PrintFont"), Int32.Parse(db.ReadSetting("PrintFontSize")), FontStyle.Regular); 
     SolidBrush drawBrush = new SolidBrush(Color.Black); 

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

     // Draw string to screen. 
     text = pt.getData(); 
     e.Graphics.DrawString(text, drawFont1, drawBrush, new RectangleF(x, y, width, height), drawFormatLeft); 

     // calculate text size 
     SizeF textSize = e.Graphics.MeasureString(text, drawFont1); 
     y += textSize.Height; 

     // Set page size - has no effect 
     e.HasMorePages = false; 
     float inchHeight = PrintTask.PixelsToInchY(y, e.Graphics); 
     PaperSize originalPaperSize = e.PageSettings.PaperSize; 
     PaperSize scaledSize = new PaperSize("Custom", originalPaperSize.Width, (int)Math.Ceiling(inchHeight * 100)); 
     e.PageSettings.PaperSize = scaledSize; 
     e.PageSettings.PrinterSettings.DefaultPageSettings.PaperSize = scaledSize; 

    } 
    catch (Exception exc) 
    { 
     ((MainForm)Application.OpenForms[0]).msg(exc.Message); 
    } 
} 

public static float PixelsToInchX(float n, Graphics graphics) 
{ 
    return n * graphics.DpiX/300; 
} 
public static float PixelsToInchY(float n, Graphics graphics) 
{ 
    return n * graphics.DpiY/300; 
} 
+1

Thermodrucker verwenden keine Seiten, sie haben eine kontinuierliche Papierrolle. Die Verwendung der PrintDocument-Klasse ist fast nie korrekt. Nicht nur wegen der Größe ist es meist auch viel zu langsam. POS ist der richtige Ansatz. –

Antwort

1

Sie müssen Höhe nicht berechnen, wenn auf POS-Drucker drucken, als Fahrer Papierhöhe behandelt und am Ende des Dokuments abgeschnitten. Gehen Sie zu den POS-Druckereinstellungen und wählen Sie "Empfang" als Papierformat. Normalerweise gibt es auch Einstellungen, um zu steuern, wie und wann der Drucker Papier schneidet (Vollschnitt, Teilkeil, Nur Vorschub, ...)

+0

Wow danke! Ich habe komplett vergessen, die Treibereinstellungen zu überprüfen! – molbal

+0

Vielleicht ist erwähnenswert, dass ich vor kurzem einen Belegdrucker hatte, der diese "Quittungseinstellung" nicht hatte. Es hatte jedoch eine Seitengröße von 3,14 x 3200 (ich denke, das ist ihre Art der "unbegrenzten Seitenhöhe"). Der Drucker schneidet den Beleg jedoch nach den letzten gedruckten Zeilen noch korrekt. –