2016-02-14 23 views
8

Termal yazıcıdaki sayfaların boyutlandırılmasıyla ilgili bir sorunla karşılaştım. Bu cevaptan başladım: https://stackoverflow.com/a/27165167/1030464 ve şimdi aşağıda yapıştırdığım kodum var..NET PrintDocument ile dinamik kağıt yüksekliği

Bu, güzel çalışır, ancak sayfanın boyutunu hesapladığım ve ayarladığımda, her seferinde tam A4 boyutunda bir sayfa yazdırıyor gibi görünüyor. (Ben bir Sam4s Ellix II ve Microsoft PDF Yazıcı üzerinde test ediyorum) - Sık sık 5-6 satır uzun metin parçacıkları yazdırmak için gerekli olduğu gibi büyük bir sorundur.

Birden çok termal yazıcıyı desteklemem gerekiyor ve yalnızca temel işlevlere ihtiyacım var (bu nedenle kağıt sıkışması, vb. Gibi sinyalleri almanıza gerek yok), bu yüzden POS yerine Windows yazıcı sürücüsüne gitmeye karar verdim. NET bir.

Metnin yüksekliğini hesaplıyorum ve kağıdı buna göre boyutlandırıyorum, ancak çıktı kağıt boyutu üzerinde bir etkisi yoktur. Bu konuda herkesin bir çözümü var mı? Sürücü kağıt yüksekliğini kolları ve dokümanın sonunda kesilmiş olarak

, size POS yazıcılara yazdırırken boyunu hesaplamak gerekmez

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

Termal yazıcılar sayfa kullanmaz, sürekli bir kağıt rulosuna sahiptir. PrintDocument sınıfını kullanmak neredeyse hiç doğru değildir. Sadece boyutundan dolayı değil, aynı zamanda genellikle çok yavaştır. POS doğru bir yaklaşımdır. –

cevap

1

çok teşekkür ederim. POS yazıcı ayarlarına gidin ve 'Makbuz' seçeneğini kağıt boyutu olarak seçin. Genellikle, yazıcının kağıdın nasıl ve ne zaman kesildiğini denetleme ayarları da vardır (Tam Kesim, Kısmi Yığın, Yalnızca Besleme, ...)

+0

Vay teşekkürler! Sürücü ayarlarını kontrol etmeyi tamamen unuttum! – molbal

+0

Bu "makbuz" ayarına sahip olmayan bir yazıcımın yakın zamanda söz ettiğine değinebilirim. Ancak, 3.14 x 3200'lük bir sayfa boyutuna sahipti (sanırım bu, "sınırsız sayfa yüksekliği" şeklindedir). Bununla birlikte yazıcı, son yazdırılan satırlarınızdan sonra kaymayı doğru şekilde keser. –

İlgili konular