Печать на определенном принтере с использованием элемента управления IE без изменения принтера по умолчанию

#c #internet-explorer #printing #webbrowser-control #iwebbrowser2

#c #internet-explorer #печать #webbrowser-control #iwebbrowser2

Вопрос:

Есть ли способ передать структуру PrintDlg (или что-то подобное) моему элементу управления WebBrowser (Internet Explorer / IWebBrowser2) таким образом, чтобы он печатал на принтере, указанном в PrintDlg, без появления диалогового окна печати? Я хочу сделать это без изменения принтера по умолчанию. IWebBrowser2::ExecWB предоставляет способ пропустить всплывающее диалоговое окно (OLECMDEXECOPT_DONTPROMPTUSER), но не способ указать принтер.

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

После IE 5.5 текущий принтер не сохраняется в реестре Windows.

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

  1. Использование IViewObject::Draw. Я могу получить изображение, но не могу масштабировать его на бумаге так же, как при печати для IE:

    RECTL rect;
    rect.слева = 0;
    rect.top = 0;
    rect.right = GetDeviceCaps(высота принтера, ФИЗИЧЕСКАЯ ШИРИНА);
    rect.bottom = GetDeviceCaps(высота принтера, ФИЗИЧЕСКАЯ ВЫСОТА);

    StartDoc(printerhdc, amp;di);
    StartPage(printerhdc);
    HRESULT hr = pViewObj->Draw(DVASPECT_DOCPRINT, page, NULL, pTargetDevice, printerhdc, printerhdc, amp;rect, NULL, NULL, 0); //печатает слишком маленькую
    конечную страницу (printerhdc);
    EndDoc(printerhdc);

  2. Отправка WM_PAINT элементу управления IE. Я мало что сделал с этим, так как прочитал в онлайн-ветке, что это сработало не так хорошо.

  3. AxDHTMLEDLib. Очень мало документации, и я думаю, что это только для .net

  4. Используя IHTMLElement, IHTMLElementRender->SetDocumentPrinter, IHTMLElementRender->DrawToDC. Microsoft прекратила поддержку IE9

Любые идеи, которые у вас могут возникнуть, были бы высоко оценены! Заранее спасибо!

Ответ №1:

Если у вас есть некоторая гибкость в использовании принтера по умолчанию, вот еще одна идея. Хотя это немного запутанно.

  • установите на свой принтер по умолчанию какой-нибудь PDF writer (например, Amyuni PDF или Adobe Distiller). Эти драйверы принтера преобразуют входящее задание в файл PDF, и вы можете настроить его для сохранения файла в каком-либо месте на диске.

  • используйте PowerShell, чтобы распечатать этот PDF-файл на нужном вам целевом принтере. Вы можете либо использовать интерфейс библиотеки DLL PrintUI, либо использовать и команду «print». http://www.eggheadcafe.com/software/aspnet/30441939/how-to-suppress-printdialog-when-using-print-verb.aspx приведен пример. Делая это, вы можете выполнить все настройки очереди принтера в этом скрипте и оставить принтер по умолчанию как есть

Комментарии:

1. Спасибо за вашу идею! Я этого не учел. Это было бы сложно, поскольку у наших пользователей не обязательно будет установлен драйвер PDF.

2. Это также приведет к снижению производительности, но я рассмотрю это, если не будет представлено другого прямого метода.