Я знаю его известную тему на многих форумах и блогах. Я прочитал много статей. И многие из них тихо информативны. Но для меня, похоже, он требует нового подхода для достижения этой задачи.html или pdf-печать на стороне сервера C#
Ищет решение для печати html на стороне сервера. Но после работы с большим количеством вариантов я понял, что мы
- не могу дать имя принтера или
- его печать HTML содержание сырого, как текстовый файл
Позже стало известно о Ghostscript (https://stackoverflow.com/a/2600189/1238159) может быть используется для печати PDF на стороне сервера.
попытался также с кристаллом отчета (но как передать содержание HTML для него динамически Eventhough оно не поддерживает много тегов), itextsharp, SSRS, PDFsharp и т.д. и т.п., но ни один из них не поддерживает многие из HTML-теги & стандартам W3C. Итак, я закончил с одной точкой генерировать PDF. Только wkhtmltopdf идеально подходит для преобразования html в pdf. он поддерживает все теги html, в отличие от других, по моему опыту. но печать PDf - вопрос для меня с многих лет.
Но теперь я столкнулся с проблемой даже с GhostScript (использую ver 9.05). С localhost я могу использовать его отлично. Я могу печатать на стороне сервера, что бы ни было имя принтера, выходящее из пользовательского интерфейса. но с IP-адресом или именем компьютера его не работает. Я даже реализовал олицетворение. Несмотря на то, что процесс вызывает зависание при вызове GhostScript.
Теперь то, что я хочу, чтобы получить ясно
- Можно ли напечатать HTML или PDF (фактическое содержание) на стороне сервера?
- Любые открытые инструменты источника есть для достижения этого имени
- принтера Я хотел бы передать динамически
Любой ключ или обходной путь может помочь много часов людей по всему земному шару. :)
Большое спасибо заранее.
Привет, Паван N
После использования предложения по Lau. я могу сделать это в командной строке (значит, cmd.exe работает под моей учетной записью). но мое приложение будет работать под сетевым сервисом. Теперь я получаю проблему только от вида этого ACCESS Denied
Да. Наконец, я смог запустить этот процесс. и я могу видеть мой gswin32c.exe процесс в диспетчере задач с моими учетными данными домена. код выглядит следующим образом:
public bool PrintVSPDF(string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName)
{
Logger.AddToLog("printerName", printerName);
string impersonationUsername = "";
string impersonationDomain = "";
string impersonationPWD = "";
if (ConfigurationManager.AppSettings["UName"] != null)
{
impersonationUsername = Encryption.Decrypt(ConfigurationManager.AppSettings["UName"].ToString(), Encryption.DEFAULT_KEY, Encryption.DEFAULT_SEED);
impersonationDomain = impersonationUsername.Split('\\').Count() > 1 ? impersonationUsername.Split('\\')[0] : "";
impersonationUsername = impersonationUsername.Split('\\').Count() > 1 ? impersonationUsername.Split('\\')[1] : impersonationUsername.Split('\\')[0];
}
if (ConfigurationManager.AppSettings["PD"] != null)
{
impersonationPWD = Encryption.Decrypt(ConfigurationManager.AppSettings["PD"].ToString(), Encryption.DEFAULT_KEY, Encryption.DEFAULT_SEED);
}
using (Impersonation imp = new Impersonation(impersonationUsername, impersonationDomain, impersonationPWD))
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = "-dPrinted -dNoCancel -dNOPAUSE -dBATCH -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=mswinpr2 -sOutputFile=%printer%\"" + printerName + "\" \"" + pdfFileName + "\" ";
startInfo.FileName = ghostScriptPath;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
//startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.UserName = impersonationUsername;
startInfo.Domain = impersonationDomain;
SecureString ss = new SecureString();
for (int i = 0; i < impersonationPWD.Length; i++)
{
ss.AppendChar(impersonationPWD[i]);
}
startInfo.Password = ss;
Process process = null;
try
{
process = Process.Start(startInfo);
//Logger.AddToLog("Error VS", process.StandardError.ReadToEnd());
//Logger.AddToLog("Output VS", process.StandardOutput.ReadToEnd());
//Logger.AddToLog(process.StartInfo.Arguments.ToString(), "VS Print Arguments");
//Console.WriteLine(process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd());
//Logger.AddToLog(process.StartInfo.FileName.ToString(), "VS Print file name");
process.WaitForExit(30000);
if (process.HasExited == false)
process.Kill();
int exitcode = process.ExitCode;
process.Close();
return exitcode == 0;
}
catch (Exception ex)
{
Logger.AddToLog(ex);
return false;
}
}
}
Но процесс прекрасно работает в локальном хосте:. 5030 то есть, во время работы с моей визуальной студии. но с IP-адресом или именем машины. он просто зависает и выдает эту ошибку
То же самое происходит и в Adobe Acrobat Reader, Foxit, и т.д. и т.п.
(Process must exit before requested information can be determined. : at System.Diagnostics.Process.EnsureState(State state)
at System.Diagnostics.Process.get_ExitCode())
Я смущен тем, что вы имеете в виду под «печатной стороне сервера». Где принтер подключен? Вы говорите об инициировании печати на локальном принтере пользователя с удаленного веб-сервера? – Joe
«сторона сервера печати» означает, что я пытаюсь напечатать строку HTML, сгенерированную XML + XSL на стороне сервера, то есть IIS. И да принтер подключен к серверу IIS. его приложение для интрасети. –