2010-12-16 4 views
2

EDIT Я попытался восстановить код, который мне больше не нужно показывать. Я думаю, что это просто климатизация класса печати, не отображающая функциональность, которую можно выбрать с помощью диалога. Кажется, я должен иметь возможность настраивать и назначать объект PrinterSettings для PrintDocument, а затем печатать этот PrintDocument ... ??? Разве я не думаю прямо здесь или ??Как использовать C# для установки параметров печати?

EDIT СНОВА Я думаю, что все сеттеры сидят из «printerSettings.DefaultPageSettings». Это позволит мне изменить настройки печати. Я не доказал еще, но позже будет

PrintDocument pd = new PrintDocument(); 
pd.DocumentName = "test.doc"; 

PrinterSettings printerSettings = new PrinterSettings(); 
printerSettings.?? <- I want to set the printer setting here e.g. DL, A4, etc 
pd.PrinterSettings = printerSettings; 
pd.Print(); 

Я имею генерировать слово документы слияния в C# (чеки, письма, документы), но все они требуют различных настроек принтера (проверки = пользовательские настройки, письма = DL Env, documents = A4)

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

пример псевдо-код, что я пытаюсь сделать

//create the mail merge 
IList<Letter> letters = MailMerge.Create(enum.letters) 
Printer.Print(letters) //<-- in here I am trying set the printing preferences to DL Env 


//create the mail merge 
IList<Document> docs = MailMerge.Create(enum.documents) 
Printer.Print(docs) //<-- in here I am trying set the printing preferences to A4 

помощь оценили.

спасибо

ответ

3

Возможно, вы можете использовать WMI. Мой единственный WMI-опыт - это некоторый C# -код для WMI для получения некоторых свойств принтера, я не пытался устанавливать какие-либо свойства принтера, но я думаю, что это должно быть возможно. Возможно, эти MSDN-ссылки и код помогут вам начать работу.

WMI Tasks: Printers and Printing показывает команды в VB-скрипте. How To: Retrieve Collections of Managed Objects показывает, как использовать SelectQuery и перечисление. How To: Execute a Method показывает, как выполнить метод :-).

EDIT: Я только заметил это StackOverflow article: How do I programatically change printer settings ..., что, похоже, использует WMI для изменения некоторых настроек принтера.

Моя получить код выглядит следующим образом:

//using System.Management; 

    private void GetPrinterProperties(object sender, EventArgs e) 
    { 
     // SelectQuery from: 
     // http://msdn.microsoft.com/en-us/library/ms257359.aspx 
     // Build a query for enumeration of instances 
     var query = new SelectQuery("Win32_Printer"); 
     // instantiate an object searcher 
     var searcher = new ManagementObjectSearcher(query); 
     // retrieve the collection of objects and loop through it 
     foreach (ManagementObject lPrinterObject in searcher.Get()) 
     { 
      string lProps = GetWmiPrinterProperties(lPrinterObject); 
      // some logging, tracing or breakpoint here... 
     } 
    } 

    // log PrinterProperties for test-purposes 
    private string GetWmiPrinterProperties(ManagementObject printerObject) 
    { 
     // Win32_Printer properties from: 
     // http://msdn.microsoft.com/en-us/library/aa394363%28v=VS.85%29.aspx 
     return String.Join(",", new string[] { 
       GetWmiPropertyString(printerObject, "Caption"), 
       GetWmiPropertyString(printerObject, "Name"), 
       GetWmiPropertyString(printerObject, "DeviceID"), 
       GetWmiPropertyString(printerObject, "PNPDeviceID"), 
       GetWmiPropertyString(printerObject, "DriverName"), 
       GetWmiPropertyString(printerObject, "Portname"), 
       GetWmiPropertyString(printerObject, "CurrentPaperType"), 
       GetWmiPropertyString(printerObject, "PrinterState"), 
       GetWmiPropertyString(printerObject, "PrinterStatus"), 
       GetWmiPropertyString(printerObject, "Location"), 
       GetWmiPropertyString(printerObject, "Description"), 
       GetWmiPropertyString(printerObject, "Comment"), 
      }); 
    } 

    private string GetWmiPropertyString(ManagementObject mgmtObject, string propertyName) 
    { 
     if (mgmtObject[propertyName] == null) 
     { 
      return "<no "+ propertyName + ">"; 
     } 
     else 
     { 
      return mgmtObject[propertyName].ToString(); 
     } 
    } 
} 
0
private void startPrintingButton_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     if (DialogResult.OK == ofd.ShowDialog(this)) 
     { 
      PrintDocument pdoc = new PrintDocument(); 

      pdoc.DefaultPageSettings.PrinterSettings.PrinterName = "ZDesigner GK420d"; 
      pdoc.DefaultPageSettings.Landscape = true; 
      pdoc.DefaultPageSettings.PaperSize.Height = 140; 
      pdoc.DefaultPageSettings.PaperSize.Width = 104; 

      Print(pdoc.PrinterSettings.PrinterName, ofd.FileName); 
     } 
    } 

    private void Print(string printerName, string fileName) 
    { 
     try 
     { 
      ProcessStartInfo gsProcessInfo; 
      Process gsProcess; 

      gsProcessInfo = new ProcessStartInfo(); 
      gsProcessInfo.Verb = "PrintTo"; 
      gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      gsProcessInfo.FileName = fileName; 
      gsProcessInfo.Arguments = "\"" + printerName + "\""; 
      gsProcess = Process.Start(gsProcessInfo); 
      if (gsProcess.HasExited == false) 
      { 
       gsProcess.Kill(); 
      } 
      gsProcess.EnableRaisingEvents = true; 

      gsProcess.Close(); 
     } 
     catch (Exception) 
     { 
     } 
    } 

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

  • Нет связанных вопросов^_^