Тема: Axapta и PDF417
Показать сообщение отдельно
Старый 15.06.2013, 10:07   #12  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от Pustik Посмотреть сообщение
Вот готовое решение работы с матричным(двумерным) штрихкодированием в Аксапте (QRCode). В проекте подготовлен класс-обертка и пример работы QRCode на стандартном отчете.
1)Прикручиваем dll к \References.
2)Компилируем проект.
3)Запускаем отчет.
Сборка сделана на C#.
Спасибо за пример! Решение прекрасно работает.

Но есть одна проблема.

Чтобы не устанавливать этот компонент на каждое клиенское рабочее место сделал исполнение кода класса на сервере.

Но так как класс Image работает только на клиенте, получить картинку с qr кодом в виде Аксаптовского е container оказалось не просто.

Сохранять картинку в виде временного файла, а затем читать его - не совсем производительное решение.

В итоге решение навеяло одна из последних тем форума.

Привожу код - может кому пригодится.
На выходе имеем container, который можно использовать для вывода картинок с qr кодом в любые отчеты Аксапта.

X++:
static container encode(str _encoding)
{
    System.IO.MemoryStream  memoryStream;
    System.Drawing.Bitmap   bitmap;
    container               ret;
    str                     tmpBuffer;
    
    int encodeMode = 2;
    int scale =2;
    int version = 4;
    int errorCorrect = 3;
    
    ThoughtWorks.QRCode.Codec.QRCodeEncoder qrCodeEncoder;
    ;
    if (!_encoding)
        throw error('Нет данных для кодирования!');

    new InteropPermission(InteropKind::ClrInterop).assert();

    qrCodeEncoder = new ThoughtWorks.QRCode.Codec.QRCodeEncoder();

    try
    {
        qrCodeEncoder.set_QRCodeEncodeMode(EncodeMode);
        qrCodeEncoder.set_QRCodeScale(Scale);
        qrCodeEncoder.set_QRCodeVersion(Version);
        qrCodeEncoder.set_QRCodeErrorCorrect(ErrorCorrect);

        bitmap = QRCodeEncoder.Encode(_encoding);

        memoryStream = new System.IO.MemoryStream();

        bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat::get_Bmp());

        
        tmpBuffer = CLRInterop::staticInvoke("System.Convert", "ToBase64String", memoryStream.GetBuffer());

        ret = binData::loadFromBase64(tmpBuffer);
        
        bitmap.Dispose();

        memoryStream.Close();
        memoryStream.Dispose();
    }
    catch (Exception::CLRError)
    {
        throw error(AifUtil::getClrErrorMessage());
    }

    return ret;
}
За это сообщение автора поблагодарили: Pustik (3), jonny (4).