2016-02-14 3 views
8

У меня возникла проблема с настройкой страниц на термопринтере. Я начал с этого ответа: https://stackoverflow.com/a/27165167/1030464, и теперь у меня есть код, который я наклеил ниже.Динамическая высота бумаги с .NET PrintDocument

Это работает красиво, однако, хотя я рассчитываю и устанавливаю размер страницы, он, кажется, печатает всю страницу формата A4 каждый раз. (Я тестирую Sam4s Ellix II и Microsoft PDF Printer). Это большая проблема, так как часто приходится печатать 5-6 строк текста.

Мне нужно поддерживать несколько термопринтеров, и мне нужны только основные функции (поэтому не нужно принимать такие сигналы, как замятие бумаги и т. Д.), Поэтому я решил пойти с драйвером принтера Windows, а не с POS. NET один.

Я вычислил высоту текста и размер бумаги соответственно, однако он не влияет на размер выходной бумаги. У кого-нибудь есть решение этой проблемы?

Большое спасибо

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

Термальные принтеры не используют страницы, они имеют непрерывный рулон бумаги. Использование класса PrintDocument почти никогда не является правильным. Не только из-за размера, но и слишком медленно. POS - правильный подход. –

ответ

1

Вы не должны рассчитать высоту при печати на POS-принтеры, так как драйвер обрабатывает высоту бумаги и вырезать в конце документа. Перейдите к настройкам принтера POS и выберите «Квитанция» в качестве формата бумаги. Обычно есть также настройки для управления тем, как и когда принтер режет бумагу (Full Cut, Partial Cur, Feed Only, ...)

+0

Wow thanks! Я полностью забыл проверить настройки драйвера! – molbal

+0

Не стоит упоминать, что у меня недавно был принтер для проскальзывания, у которого не было этой настройки «получения». Однако он имел размер страницы 3,14 x 3200 (я думаю, это их способ «неограниченной высоты страницы»). Тем не менее принтер по-прежнему разрезает проскальзывание после последних напечатанных строк. –