Подпись Wacom на формах ASP.NET

Я пишу приложение веб-формы ASP.NET, которое должно использовать подпись планшета Wacom (STU-430) для подписи документов, созданных самим приложением.

Приложение ASP.NET запускается на веб-сервере, а удаленный клиент (в настоящее время только Internet Explorer из-за использования COM-объекта Wacom) владеет/обрабатывает планшет для подписи.

Веб-форма должна включать только код для сбора/захвата подписи. Обработка подписи должна выполняться удаленно веб-сервером.

Образцы HTML Wacom используют javascript и COM, чтобы позволить страницам html на стороне клиента захватывать подпись, «сохраняя» подпись внутри элемента в форме. Короче говоря, это структура документа HTML перед «подписью»:

  <div id="signatureDiv">
    Signature image:<br/>
    <img id="signatureImage"/>
  </div>

и это структура HTML «после» подписи:

<div id="signatureDiv">
    Signature image:<br/>
    <img id="signatureImage" src="data:image/jpeg;base64,/9j/....">
</div>

COM-объект «модифицирует» структуру DOM клиентского сайта и «вставляет» двоичные данные изображения подписи внутрь «заполнителя» img ....

Вопрос в том... как я могу получить данные элемента в клиентской структуре DOM и отправить их на сервер, чтобы он мог "обработать" подпись и правильно обработать/сохранить ее?

Можно ли «хранить» двоичное содержимое данных img внутри скрытого поля формы и использовать его в качестве шлюза для публикации данных?

Bestr С уважением, Микеле Полезно Бесполезно


person weirdgyn    schedule 14.05.2015    source источник
comment
Спасибо за отчет, Майк (я продолжу Майк, называть парня Мишель просто странно для меня :) ). Обратите внимание, что вы можете принять свой собственный ответ через некоторое время. Обратите также внимание, что я изменил ваш вопрос; тег signature зарезервирован для подписей методов на этом сайте.   -  person Maarten Bodewes    schedule 16.05.2015
comment
Алло, Маартен, Мишель - мужское имя в Италии. Мишель - женское имя (но на самом деле это французское имя), в любом случае, Майк в порядке. В Италии меня тоже зовут Майк! :-)   -  person weirdgyn    schedule 17.05.2015


Ответы (1)


Я нашел решение. Надеюсь, это может помочь кому-то еще:

1) прежде чем приступить к разработке чего-либо, использующего планшет WACOM, учтите, что процесс захвата подписи может занять очень много времени (по моему опыту, для оцифровки подписи в форме требуется даже 40 секунд);

2) код, предоставленный WACOM, работает (по крайней мере, примеры C # и HTML), просто это заняло так много времени;

3) если вы собираетесь разработать решение для веб-формы, все, что вам нужно, это образец HTML-кода, а также немного JS и немного кода на C# или VB;

4) в 64-битных системах Windows 8.1 (мне все еще нужно проверить на Win 7) во второй раз, когда вы ставите подпись, есть большая вероятность, что планшет WACOM не «покажет» подпись, пока вы ее рисуете ... если вы нажмите OK после слепой подписи, «подпись» все равно будет отправлена ​​клиенту. Единственный способ восстановить систему — отключить и снова подключить ее к USB-порту;

В веб-форме вы должны организовать что-то вроде этого:

HTML:

<link rel="stylesheet" type="text/css" href="Signature.css" />
<script type="text/javascript" src="BigInt.js"></script>
<script type="text/javascript" src="sjcl.js"></script>
<script type="text/javascript" src="Signature_encryption.js"></script>
<script type="text/javascript" src="Signature.js"></script>

<script type="text/javascript">
    var _signatureForm = null;

    function initDemo() {
        if (_signatureForm == null)
        {
            var _signatureImage = document.getElementById("signatureImage");

            _signatureForm = new SignatureForm(_signatureImage);
        }

        _signatureForm.connect();

        return false;
    }

    function signForm() {
        var _signatureImage = document.getElementById("signatureImage");
        var _hdnSignature = $("input[id$='_hdnSignature']");

        _hdnSignature.value = _signatureImage.src;

        return true;
    }
</script>

<form id="_frmMain" runat="server">
<div>
    <div id="signatureDiv">
        Signature image:<br />
        <img id="signatureImage" />
    </div>
    <div>
        Actions:<br />
        <asp:Button ID="signButton" runat="server" Text="Capture" OnClientClick="javascript: return initDemo();" />
        <asp:Button ID="_btnSign" runat="server" Text="Sign" OnClientClick="javascript: return signForm();" OnClick="_btnSign_Click" />
        <asp:HiddenField ID="_hdnSignature" runat="server" />
    </div>
</div>
<object id="wgssSTU" type="application/x-wgssSTU" ></object>
</form>

Все файлы .js, упомянутые в этом примере, предоставлены в образцах HTML Wacom SDK.

Грязную работу выполняет функция signForm(), которая берет изображение и вставляет его в скрытое поле, позволяя процедуре кода программной части обрабатывать подпись.

Код позади раздела (C# в моем случае) довольно прост. Просто обработайте событие кнопки и декодируйте изображение:

protected void _btnSign_Click(object sender, EventArgs e)
{
    string _sImage = _hdnSignature.Value.Replace("data:image/jpeg;base64,", "");

    byte[] _rgbBytes = Convert.FromBase64String(_sImage);

    string _sImageFile = Guid.NewGuid().ToString().Replace("-", string.Empty);

    _sImageFile += ".jpg";

    using (FileStream imageFile = new FileStream(Server.MapPath("~/" + _sImageFile), FileMode.Create))
    {
        imageFile.Write(_rgbBytes, 0, _rgbBytes.Length);
        imageFile.Flush();
    }
}

Учтите, что планшет WACOM не встраивает МЕТАДАННЫЕ в файл изображения, поэтому рекомендуется сделать это в коде.

С уважением, Майк

person weirdgyn    schedule 14.05.2015
comment
Для тех, кто хочет продолжить расследование, долгая задержка зависит от этого вызова: m_tablet.startCapture(0xc0ffee); в методе SignatureForm.connect() (demobuttons.js) ... к сожалению, это метод, исходящий из API объекта ActiveX. - person weirdgyn; 17.05.2015
comment
Я обнаружил, что запуск того же кода на удаленном сервере вместо локальной машины приводит к меньшей задержке (порядка 10 секунд или меньше). - person weirdgyn; 20.05.2015