У меня возникла проблема с настройкой страниц на термопринтере. Я начал с этого ответа: 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;
}
Термальные принтеры не используют страницы, они имеют непрерывный рулон бумаги. Использование класса PrintDocument почти никогда не является правильным. Не только из-за размера, но и слишком медленно. POS - правильный подход. –