У меня есть программа C# WPF .NET 4.6, которая создает файлы HTML, и я хотел бы распечатать их автоматически (без диалога) с известным принтером, отличным от стандартного. Конечно, это включает в себя визуализацию HTML. Поскольку программа создает эти файлы, данные HTML могут поступать из MemoryStream
, FileStream
или непосредственно из строки.Render and Print HTML для нестандартного принтера
У программы есть настройки, которые позволяют пользователю заранее указать принтер для печати, используя System.Drawing.Printing.PrinterSettings.InstalledPrinters
, так как каждому файлу может потребоваться другой принтер. Во время печати имя принтера известно, но, вероятно, будет отличаться от принтера по умолчанию Windows.
Я изучил много других проектов, но они, похоже, не объясняют, что принтер отличается от стандартного. Изменение принтера по умолчанию будет антисоциальным и вызовет мир, связанный с потоками. Это похоже на принятое решение №1, хотя не может быть лучшим решением?
Исследования и решения смотрели на:
Printing the contents of a WPF WebBrowser и Silently print HTML from WPF WebBrowser и corresponding MSDNforum discussions являются недостаточными в качестве функции COM ExecWB только печатает на принтере по умолчанию
MSDN example использует только (?) Print() на WebBrowser
, который снова использует принтер по умолчанию.
Итак, я пошел по пути, чтобы изменить параметры принтера. Programmatically changing the destination printer for a WinForms WebBrowser control был задан, но имеет довольно неудовлетворительный ответ, так как он имеет неработающую ссылку, и я не знаю, какие внешние программы работают на компьютере, поэтому я не могу гарантировать Adobe, OpenOffice и т. Д. OP упомянул, что они анализировали ActiveX COM не вдаваясь в подробности. Звучит сложно.
Возможно, я мог бы что-то прописать из письма в RichTextBox, например, this project, и спрятать поле?
Я думал, что Silent print HTML file in C# using WPF находится на хорошей дорожке, однако исходное сообщение имеет номера с жестким кодом для экранов экрана‽ и OP упомянули, что принтер отключил документ. В принятом (и добавленном) ответе снова используется метод настройки принтера по умолчанию ExecWB.
execCommand("Print", false, IDon'tUnderstandThisArgument) также показал обещание, как и его ответ был обновлен MSDN answer, но FileStream отправляется на принтер не позволяет HTML, ни делает DocumentStream
от WebBrowser
появляется на работе (принтер печатает один пустую страницу).
How do I programatically change printer settings with the WebBrowser control? имеет очень похожие требования ко мне, за исключением изменения реестра как решения.
Помимо исследования, как другие сделали это, я также пытался печатать МОФ WebBrowser
непосредственно, как это Visual
контроль: (?, Потому что WebBrowser
не видно)
public static bool Print(string printer, Visual objToPrint)
{
if (string.IsNullOrEmpty(printer))
{
return false;
}
var dlg = new PrintDialog
{
PrintQueue = new PrintServer().GetPrintQueue(printer)
};
dlg.PrintTicket.CopyCount = 1;
dlg.PrintTicket.PageOrientation = PageOrientation.Portrait;
dlg.PrintTicket.PagesPerSheet = 1;
dlg.PrintVisual(objToPrint, "Print description");
return true;
}
однако это ничего не печатает , И попробовал PrintDocument
как обновленный MSDN article предложил:
public static async Task<bool> PrintHTMLAsync(string printer, string html)
{
bool result;
using (var webBrowser = new System.Windows.Forms.WebBrowser())
{
webBrowser.DocumentCompleted += ((sender, e) => browserReadySemaphore.Release());
byte[] buffer = Encoding.UTF8.GetBytes(html);
webBrowser.DocumentStream = new MemoryStream(buffer);
// Wait until the page loads.
await browserReadySemaphore.WaitAsync();
try
{
using (PrintDocument pd = new PrintDocument())
{
pd.PrinterSettings.PrinterName = printer;
pd.PrinterSettings.Collate = false;
pd.PrinterSettings.Copies = 1;
pd.PrinterSettings.FromPage = 1;
pd.PrinterSettings.ToPage = 1;
pd.Print();
result = true;
}
}
catch (Exception ex)
{
result = false;
Debug.WriteLine(ex);
}
return result;
}
}
не радость.
Я также использовал PRINT команду DOS:
public static string PerformSilentPrinting(string fileName, string printerName)
{
try
{
ProcessStartInfo startInfo = new ProcessStartInfo(fileName)
{
Arguments = string.Format("/C PRINT /D:\"{0}\" \"{1}\"", printerName, fileName),
FileName = "cmd.exe",
RedirectStandardOutput = true,
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Hidden,
};
// Will execute the batch file with the provided arguments
Process process = Process.Start(startInfo);
// Reads the output
return process.StandardOutput.ReadToEnd();
}
catch (Exception ex)
{
return ex.ToString();
}
}
но команда печати, кажется, принимают только текстовые файлы.