2016-02-14 27 views
8

Wystąpił problem z wielkością stron na drukarce termicznej. Zacząłem od tej odpowiedzi: https://stackoverflow.com/a/27165167/1030464, a teraz mam kod, który wkleiłem poniżej.Dynamiczna wysokość papieru z .NET PrintDocument

To działa ładnie, ale mimo że obliczyłem i ustawiłem rozmiar strony, wydaje się, że za każdym razem drukowana jest strona o pełnym formacie A4. (Testuję na Sam4s Ellix II i Microsoft PDF Printer) - Jest to duży problem, ponieważ często trzeba wydrukować 5-6-wierszowe fragmenty tekstu.

Potrzebuję obsługi wielu drukarek termicznych i potrzebuję tylko podstawowych funkcji (więc nie trzeba odbierać sygnałów, takich jak zacięcie papieru, itp.), Więc zdecydowałem się pójść ze sterownikiem drukarki Windows, zamiast POS dla. NET jeden.

Wyliczam wysokość tekstu i odpowiednio dopasowuję format papieru, jednak nie ma to wpływu na rozmiar papieru wyjściowego. Czy ktoś ma rozwiązanie tego problemu?

Dziękuję bardzo

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

Drukarki termiczne nie używają stron, mają ciągłą rolkę papieru. Używanie klasy PrintDocument prawie nigdy nie jest poprawne. Nie tylko ze względu na rozmiar, zwykle jest też zbyt wolny. POS jest właściwym podejściem. –

Odpowiedz

1

nie trzeba obliczyć wysokość podczas drukowania do drukarek POS, jako kierowca obsługuje wysokość papieru i pokroić na końcu dokumentu. Przejdź do ustawień drukarki POS i wybierz "Potwierdzenie" jako rozmiar papieru. Zwykle istnieją również ustawienia kontrolujące, w jaki sposób i kiedy drukarka tnie papier (pełne cięcie, częściowe drukowanie, tylko podawanie, ...).

+0

Wow, dziękuję! Całkowicie zapomniałem sprawdzić ustawienia sterownika! – molbal

+0

Może warto wspomnieć, że ostatnio miałem drukarkę poślizgową, która nie miała ustawienia "pokwitowania". Miał jednak rozmiar strony 3,14 x 3200 (myślę, że to jest ich sposób na "nieograniczoną wysokość strony"). Drukarka nadal jednak prawidłowo odcina poślizg po ostatnich wydrukowanych liniach. –