Как удалить диалоговое окно «Сохранить вывод как» при печати текстового файла в С#

Здравствуйте, сообщество stackoverflow, я разрабатываю простое приложение формы Windows, в котором прослушиватель в определенном каталоге прослушивает текстовый файл, если прослушиватель обнаруживает новый файл, он автоматически отправляет текстовый файл на локальный принтер по умолчанию, но также отображает диалоговое окно «Сохранить вывод на печать как», и мне нужно, чтобы процесс печати был мгновенным, без необходимости взаимодействия с каким-либо диалоговым окном.

Для этого я использую текущее пространство имен «используя System.Drawing.Printing; используя System.IO;» и я видел определение метода Print(), но похоже, что код защищен, поэтому у меня нет доступа для удаления диалогового окна «сохранить вывод на печать как». Любые идеи?

Вот мой код...

Наблюдатель за файлами:

private void fileSystemWatcher1_Created(object sender, FileSystemEventArgs e)
{
    try
    {
        MyPrintMethod(e.FullPath);
    }
    catch (IOException)
    {
    }
}

Мой метод печати:

private void MyPrintMethod(string path)
{
    string s = File.ReadAllText(path);
    printDocument1.PrintController = new StandardPrintController();
    printDocument1.PrintPage += delegate (object sender1, PrintPageEventArgs e1)
    {
        e1.Graphics.DrawString(s, new Font("Times New Roman", 12), new SolidBrush(Color.Black), new RectangleF(0, 0, printDocument1.DefaultPageSettings.PrintableArea.Width, printDocument1.DefaultPageSettings.PrintableArea.Height));

    };
    try
    {
        printDocument1.Print();
    }
    catch (Exception ex)
    {
        throw new Exception("Exception Occured While Printing", ex);
    }
}

person Sergio Molina    schedule 26.04.2017    source источник
comment
Я не вижу, чтобы вы указывали фактический принтер для печати.   -  person Andrew Harris    schedule 27.04.2017
comment
попробуйте эту ссылку для идей или выполните поиск в Google - stackoverflow.com/questions/10572420/   -  person MethodMan    schedule 27.04.2017
comment
Где определяется printDocument1? Я просто скопировал и вставил ваш код, но мне пришлось добавить var printDocument1 = new PrintDocument(); для его компиляции, и он отлично распечатался на моем принтере по умолчанию здесь, на работе, без диалогов.   -  person Rufus L    schedule 27.04.2017
comment
@RufusL Я перетащил объект из панели инструментов печати, если вы это сделаете, вам не нужно определять его с помощью кода, Visual Studio сделает это за вас. В вашем случае вы поступили правильно, добавив var для его определения. Он действительно печатался без диалога?   -  person Sergio Molina    schedule 27.04.2017
comment
@MethodMan На самом деле я использовал его решение, вы можете увидеть его в MyPrintMethod, определяя printController как StandarPrintController, но все равно появляется диалоговое окно сохранения вывода на печать.   -  person Sergio Molina    schedule 27.04.2017
comment
@AndrewHarris класс печати отправляет документ на принтер по умолчанию в Windows. Идея состоит в том, что пользователю не нужно взаимодействовать с каким-либо диалоговым окном конфигурации или диалоговым окном сохранения, пользователю необходимо загрузить файл в определенный каталог, и приложение автоматически выполнит процесс печати.   -  person Sergio Molina    schedule 27.04.2017
comment
Да, потому что мой принтер по умолчанию был сетевым принтером. Вероятно, вы являетесь автором документов? Проверьте мой ответ и посмотрите, поможет ли это...   -  person Rufus L    schedule 27.04.2017


Ответы (1)


Это диалоговое окно появляется, когда используемый принтер является средством записи документов, например Microsoft XPS Document Writer или Microsoft Print to PDF. Поскольку вы не указываете принтер по имени, вероятно, проблема в том, что это текущий принтер по умолчанию.

Если вы знаете имя принтера, который хотите использовать, вы можете указать его следующим образом:

printDocument1.PrinterSettings.PrinterName = 
    @"\\printSrv.domain.corp.company.com\bldg1-floor2-clr";

Если вы не знаете имя, то, вероятно, лучшее, что вы можете сделать, это спросить пользователя, на какой из них он хочет печатать. Вы можете получить список установленных принтеров следующим образом:

var installedPrinters = PrinterSettings.InstalledPrinters;

И затем, когда он выбран, вы можете указать имя, как в первом примере кода. Вот некоторый код, который вы можете использовать, чтобы запросить у пользователя принтер и установить принтер на тот, который они выбирают:

Console.WriteLine("Please select one of the following printers:");
for (int i = 0; i < installedPrinters.Count; i++)
{
    Console.WriteLine($" - {i + 1}: {installedPrinters[i]}");
}

int printerIndex;
do
{
    Console.Write("Enter printer number (1 - {0}): ", installedPrinters.Count);
} while (!int.TryParse(Console.ReadLine(), out printerIndex)
         || printerIndex < 1 
         || printerIndex > installedPrinters.Count);

printDocument1.PrinterSettings.PrinterName = installedPrinters[printerIndex - 1];
person Rufus L    schedule 26.04.2017
comment
Спасибо, я попробую ваше решение, и если оно сработает, я выберу ваш ответ как лучший ответ;) - person Sergio Molina; 27.04.2017
comment
Я так понимаю, вам нужно было указать принтер? - person Andrew Harris; 27.04.2017
comment
Привет, Эндрю, моя проблема заключалась в том, что на моем компьютере не установлен принтер, поэтому Windows выбирает 1 из следующих Microsoft XPS Document Writer или Microsoft Print to PDF. Таким образом, эти параметры предлагают пользователю сохранить вывод на печать. Я попробовал это на другом компьютере с установленным физическим принтером, и он работал отлично! - person Sergio Molina; 28.04.2017