Печать преобразованного XML - PullRequest
2 голосов
/ 02 апреля 2009

Ввиду не зависящих от меня обстоятельств, я заменяю все наши Crystal Reports домашними XML-отчетами, которые прекрасно работают. Для большинства отчетов, открывающих окно просмотра Crystal Reports, следующий код красиво открывает их в IE, преобразуя их в HTML с помощью таблицы стилей XSLT.

ProcessStartInfo psi = new ProcessStartInfo(reportFilename)
{
   UseShellExecute = true
};

using (Process p = new Process {StartInfo = psi})
{
    p.Start();
}

Проблема в том, что некоторые отчеты просто печатаются непосредственно на принтере, никогда не показывая отчет пользователю, что прекрасно работает в CR. Я не могу понять, как это сделать, используя код выше.

Я бы предпочел не запускать процесс IE, если это возможно, но я гарантирую, что они работают под управлением Windows, так что это не сложное требование. Кроме того, будет ли печать непосредственно таким способом преобразовывать XML в HTML через XSL и печатать его, или просто печатать фактический текст XML?

РЕДАКТИРОВАТЬ : я уже пробовал добавить:

Verb = "Print"

для объекта ProcessStartInfo, но это приводит к исключению, которое выдает:

"No application is associated with the specified file for this operation"

ВНОВЬ РЕДАКТИРОВАТЬ : Указание IE в качестве исполняемого файла для запуска снова загрузило XML, но не предлагает действия «печать». Добавление «window.print ()» в блок JavaScript работает, но требует ручного нажатия кнопки печати после разрешения запуска сценария, поскольку IE блокирует его.

РЕДАКТИРОВАТЬ ТРЕТЬЕ : Мой начальник сказал мне не беспокоиться об этом, что они могут печатать из IE. Я все еще хочу понять это. Я пробовал командную строку "print.exe", но это только печатает сырой XML на принтер. Пробовал XslCompiledTransform с PrintDocument, но это тоже не то, что я ищу.

1 Ответ

3 голосов
/ 03 апреля 2009

Разобрался, наконец. Я только что создал невидимый элемент управления WebBrowser, который выполняет рендеринг IE, и в DocumentCompleted вызывает его метод Print (). Работал как брелок, используя настройки принтера по умолчанию.

private static void PrintReport(string reportFilename)
{
    WebBrowser browser = new WebBrowser();

    browser.DocumentCompleted += browser_DocumentCompleted;

    browser.Navigate(reportFilename);
}

private static void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser browser = sender as WebBrowser;

    if (null == browser)
    {
        return;
    }

    browser.Print();

    browser.Dispose();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...