2016-02-14 14 views
8

Ho riscontrato un problema con il dimensionamento delle pagine su una stampante termica. Ho iniziato da questa risposta: https://stackoverflow.com/a/27165167/1030464 e ora ho incollato il codice qui sotto.Altezza carta dinamica con .NET PrintDocument

Questo funziona bene, tuttavia, nonostante sia possibile calcolare e impostare la dimensione della pagina, sembra che stampi una pagina A4 di dimensioni complete ogni volta. (Sto testando su Sam4s Ellix II e Microsoft PDF Printer) - È un grosso problema, dato che è necessario stampare spesso frammenti di testo lunghi 5-6 righe.

Ho bisogno di supportare più stampanti termiche e ho solo bisogno delle funzioni di base (quindi non c'è bisogno di ricevere segnali come l'inceppamento della carta, ecc.) Quindi ho deciso di andare con il driver della stampante di Windows, invece del POS per. Uno al netto.

ho calcolare l'altezza del testo e la dimensione della carta di conseguenza, ma non ha alcun effetto sulle dimensioni della carta in uscita. Qualcuno ha una soluzione per questo problema?

La ringrazio molto

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

stampanti termiche non utilizzare le pagine, hanno un rotolo di carta continua. L'utilizzo della classe PrintDocument non è quasi mai corretto. Non solo a causa delle dimensioni, è anche di solito troppo lento. Il POS è l'approccio corretto. –

risposta

1

Non è necessario calcolare l'altezza durante la stampa su stampanti POS, come pilota gestisce altezza della carta e tagliare alla fine del documento. Passare alle impostazioni della stampante POS e selezionare "Ricevuta" come formato carta. Di solito ci sono anche le impostazioni per controllare come e quando i tagli della carta stampante (Cut completa, Cur parziale, solo alimentare, ...)

+0

Wow, grazie! Ho completamente dimenticato di controllare le impostazioni del driver! – molbal

+0

Vale la pena ricordare che di recente ho avuto una stampante di fogli che non aveva questa impostazione "ricevuta". Tuttavia, ha una dimensione di pagina di 3,14 x 3200 (credo che questo sia il loro modo di "altezza della pagina illimitata"). La stampante tuttavia ritaglia lo slip correttamente dopo le ultime righe stampate. –

Problemi correlati