Как я могу использовать c # для настройки принтера? - PullRequest
2 голосов
/ 16 декабря 2010

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

ИЗМЕНИТЬ СНОВА Я думаю, что все установщики сидят от '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();

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

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

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

//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

любая помощь приветствуется.

спасибо

Ответы [ 2 ]

3 голосов
/ 04 января 2011

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

Задачи WMI: принтеры и печать показывает команды в VB-скрипте. Как: получить коллекции управляемых объектов показывает, как использовать SelectQuery и перечисление. Как: выполнить метод показывает, как выполнить метод: -).

РЕДАКТИРОВАТЬ: Я только что заметил Статья StackOverflow: Как программно изменить настройки принтера ... , который, кажется, использует 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 голосов
/ 08 февраля 2016
    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)
        {
        }
    }
...