Xamarin формирует UWP Silent Printing - PullRequest
       3

Xamarin формирует UWP Silent Printing

0 голосов
/ 12 октября 2018

У меня есть необходимость распечатать html-документ из приложения форм UWP Xamarin без диалогового окна подтверждения печати, которое будет показано пользователю.Я посмотрел в Использование полного доверия, но это, похоже, было удалено.Настройка

<Capabilities>
    <rescap:Capability Name="runFullTrust"/>
</Capabilities>

Недопустимое повторное копирование отчетов.

Я также безуспешно пытался использовать службу для печати.Использование InternetExplorer или WebBrowser для форматирования и печати работает нормально из приложения Windows Form, но при запуске в службе эфир никогда не вернется после перехода к документу или из команды для печати. ​​

void PrintOnStaThread(string htmlPath)
{
    const short PRINT_WAITFORCOMPLETION = 2;
    const int OLECMDID_PRINT = 6;
    const int OLECMDEXECOPT_DONTPROMPTUSER = 2;
    using (var browser = new WebBrowser())
    {
        DebugLog.WriteLog("Control WebBrowser created");
        browser.Navigate(htmlPath);
        while (browser.ReadyState != WebBrowserReadyState.Complete)
        {
            DebugLog.WriteLog("DoEvents loop");
            Application.DoEvents();
        }
        DebugLog.WriteLog("DoEvents loop finished");
        dynamic ie = browser.ActiveXInstance;
        ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION);
        DebugLog.WriteLog("DoEvents loop finished end of method");
    }
}

или

public void Print(string htmlFilename)
{
    documentLoaded = false;
    documentPrinted = false;
    DebugLog.WriteLog("Pre new InternetExplorer()");
    InternetExplorer ie = new  InternetExplorerClass();
    ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
    ie.PrintTemplateTeardown += new DWebBrowserEvents2_PrintTemplateTeardownEventHandler(ie_PrintTemplateTeardown);

    object missing = Missing.Value;
    DebugLog.WriteLog("Pre navigate");
    ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
    while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED)
    {
        Thread.Sleep(100);
    }
    DebugLog.WriteLog("Doc loaded");
    ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
    DebugLog.WriteLog("Printing");
    while (!documentPrinted)
    {
        Thread.Sleep(100);
        DebugLog.WriteLog("Printing loop");
    }
    DebugLog.WriteLog("Printed");
    ie.DocumentComplete -= ie_DocumentComplete;
    ie.PrintTemplateTeardown -= ie_PrintTemplateTeardown;
    ie.Quit();
}

Я перепробовал много разных вариантов этих подходов с одинаковым результатом.

Реализация кода, который люди привыкли к прошлому (датированному около 2016 года), кажется, больше не работает, поэтому я предполагаю, чтоэто было ограничено Microsoft.Кто-нибудь знает, чтобы добиться того, что мне нужно сделать?

1 Ответ

0 голосов
/ 13 октября 2018

Вы на правильном пути с компонентом полного доверия.Тихая печать - известный пробел в контексте UWP, и в настоящее время она требует компонента полного доверия.Существует запись UserVoice, позволяющая исследовать прямую печать .

Проблема, связанная с возможностью полного доверия, заключается в том, что вам необходимо определить префикс rescap в манифесте, как показано в раздел «Ограниченные возможности» документа объявлений возможностей приложения .

Чтобы объявить ограниченную возможность, измените исходный файл манифеста пакета приложения (Package.appxmanifest).Добавьте объявление пространства имен XML xmlns: rescap и используйте префикс rescap при объявлении своей ограниченной возможности.Например, вот как можно объявить возможность appCaptureSettings.

<?xml version="1.0" encoding="utf-8"?>
<Package
    ...
    xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    IgnorableNamespaces="... rescap">
...
<Capabilities>
    <rescap:Capability Name="appCaptureSettings"/>
</Capabilities>
</Package>

Я не подозреваю, что код, который вы просматривали в 2016 году, также не работал в контексте UWP.Я не знаю точно, с чем вы сталкиваетесь при печати из службы: сделать это значительно сложнее, чем кажется, как при правильной настройке службы для возможности печати, так и при использовании API печати,разработан для использования в сервисе (я думаю, что используемые вами элементы управления IE не используются).Печать из компонента полного доверия в вашем приложении будет намного проще и более прямой.Вы можете написать этот компонент в WinForms, если вы знакомы с этой средой.

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