2013-11-15 3 views
0

У меня есть две программы, одна из которых - это служба Windows, а другая - приложение для форм Windows. Они имеют точно такой же код для печати одной страницы формата А4. Они оба печатаются на одном сетевом принтере и начинают рисовать в позиции 0,0.разные результаты печати от одного и того же кода

private void pd_PrintCustomsDocument(object sender, PrintPageEventArgs ev) 
{ 
    Graphics g = ev.Graphics; 

    g.PageUnit = GraphicsUnit.Millimeter; 
    using (Font courierBig = new Font("Courier", 15)) 
    { 
    g.DrawString("Shipping Invoice", courierBig, Brushes.Black, new Point(0, 0)); 
    // etc 
    } 
} 

Приложение форм для окон печатает документ правильно, используется граница страницы. Но сервис начинает печатать точно на краю бумаги. Есть ли разница между печатью с gdi + из службы и приложением окон?

Код для фактической печати делится на основание и подкласс для переопределения параметров принтера по умолчанию, как выбрать страницу из другого лотка:

public class PrintBehaviour : IDisposable 
{ 
    private string mPrinterName; 
    private PrintPageEventHandler mHandler; 
    private PrintDocument mDocument = new PrintDocument(); 

    public PrintBehaviour(string name, PrintPageEventHandler handler) 
    { 
     mPrinterName = name; 
     mHandler = handler; 
     mDocument.PrintController = new StandardPrintController(); 
    } 

    public virtual void SettingsOverride(PrintDocument doc) {} 

    public void Print() 
    { 
     SettingsOverride(mDocument); 
     mDocument.PrinterSettings.PrinterName = mPrinterName; 
     mDocument.PrintPage += new PrintPageEventHandler(mHandler); 
     mDocument.Print(); 
    } 

    public void Dispose() 
    { 
     mDocument.Dispose(); 
    } 
} 

public sealed class CustomsPrintBehaviour : PrintBehaviour 
{ 
    private string mPaperTray; 

    public CustomsPrintBehaviour(string name, PrintPageEventHandler handler, string paperTray) 
     : base(name, handler) 
    { 
     mPaperTray = paperTray; 
    } 

    public override void SettingsOverride(PrintDocument doc) 
    { 
     base.SettingsOverride(doc); 
     doc.DefaultPageSettings.Landscape = true; 

     foreach (PaperSource source in doc.PrinterSettings.PaperSources) 
     { 
      if (source.SourceName.Trim().ToUpper() == mPaperTray) 
      { 
       doc.DefaultPageSettings.PaperSource = source; 

       PaperSize size = new PaperSize { RawKind = (int)PaperKind.A4 }; 

       doc.DefaultPageSettings.PaperSize = size; 
       break; 
      } 
     } 
    } 
} 

и называется так:

using (var pb = new CustomsPrintBehaviour(_customsPrinter, pd_PrintCustomsDocument, kv["PaperTray"].ToUpper())) 
{ 
    pb.Print(); 
} 
+0

Можете ли вы показать нам фактический код печати? –

+0

отредактировал OP с классами принтера – Laurijssen

ответ

1

С MSDN:

GDI + функции и классы нет s upported для использования в службе Windows. Попытка использования этих функций и классов из службы может вызвать непредвиденные проблемы, такие как снижение производительности и ошибок времени выполнения и ошибок во время выполнения.

+0

Я не думаю, что это имеет какое-либо отношение к pagemargins – Laurijssen

Смежные вопросы