Не удается получить обновленное изображение штрих-кода через сайт, открытый в веб-браузере

Моя проблема следующая: я пытаюсь открыть онлайн-генератор штрих-кода через веб-браузер и получить изображение штрих-кода. Вот мой код:

/// <summary>
/// Main form of barcode server
/// </summary>
public partial class MainForm : Form
{
    #region Constants
    private const String BarCodeSite = "http://www.abarcode.net/online.aspx?barcode=EAN13";//"http://barcode.tec-it.com/en#";
    #endregion

    /// <summary>
    /// Main form constructor
    /// </summary>
    public MainForm()
    {
        InitializeComponent();
    }

    /// <summary>
    /// This event occured after form load
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainForm_Load(object sender, EventArgs e)
    {
        webBrowser.Navigate(new Uri(BarCodeSite));
    }


    /// <summary>
    /// Occurs when form is closing.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        try
        {
            barcodeServer.Abort();
        }
        catch (Exception ex)
        {
            // do nothing
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var code = textBox1.Text;
        var editText = webBrowser.Document.GetElementById("ValueToEncode");
        editText.SetAttribute("Value", code.Trim(new char[] { '\0' }));
        webBrowser.Document.GetElementById("Label13").InvokeMember("click");
    }
}

Какие действия я выполняю: 1. Запускаю проект 2. В опциях выбираю масштаб изображения 250% 3. Вставляю в textBox1 контрол код 8414034620202 4. Нажимаю на кнопку1

Ожидаемый результат: Штрих-код введен в текстовое поле, а изображение обновлено в соответствии с введенным штрих-кодом Фактический результат: Штрих-код введен в текстовое поле, но изображение не обновлено. Я не могу понять, почему мое изображение не обновляется. Я делаю что-то не так?

Примечания: Идентификатор «ValueToEncode» принадлежит текстовому полю. Идентификатор «Label13» принадлежит текстовой метке с текстом «Данные для кодирования:». Сайт, который я использовал: http://www.abarcode.net/online.aspx?barcode=EAN13


person ichernob    schedule 06.04.2016    source источник


Ответы (1)


Предполагая, что вам разрешено очищать содержимое этого веб-сайта, вам лучше, если вам не нужно полагаться на использование элемента управления WebBrowser, поскольку он имеет много особенностей.

В вашем конкретном случае два простых HttpWebRequest — это все, что вам нужно для получения сгенерированного изображения штрих-кода:

CookieContainer cookies = new CookieContainer();

private void button1_Click(object sender, EventArgs e)
{
    // do a get to have the session cookie
    var wr = (HttpWebRequest) WebRequest.Create("http://www.abarcode.net/online.aspx");
    wr.CookieContainer = cookies;
    wr.Method = "GET";
    var stream =  wr.GetResponse().GetResponseStream();
    using(var sr = new StreamReader(stream))
    {
        // debug
        Debug.WriteLine(sr.ReadToEnd());
    }
    // get the image
    var imageReq = (HttpWebRequest)WebRequest.Create(
        String.Format(
            "http://www.abarcode.net/barcode.aspx?value={0}&type=EAN13", 
            textBox1.Text));
    // this makes if you get their watermark in the barcode or not
    imageReq.Referer = "http://www.abarcode.net/online.aspx?barcode=EAN13";
    imageReq.CookieContainer = cookies;
    imageReq.Method = "GET";
    // get the image stream
    using(stream = imageReq.GetResponse().GetResponseStream())
    {
        // create the bitmap.
        pictureBox1.Image =  Bitmap.FromStream(stream);
    }
}

У меня есть CookieContainer для захвата и повторного использования файлов cookie в вызовах WebRequest. Единственное, что мне нужно было добавить, это заголовок реферера, чтобы предотвратить появление водяного знака.

Ваш результат будет выглядеть так:

штрих-код

person rene    schedule 06.04.2016
comment
Спасибо, Рене. Ваш ответ очень полезен. Могу ли я использовать это решение для получения более 100 изображений штрих-кода одно за другим? Я имею в виду, есть ли капта или что-то в этом роде? - person ichernob; 06.04.2016
comment
Я не знаю, вы должны уточнить у владельца этого сайта, разрешено ли это. Если вам нужно так много, я бы предпочел искать генератор штрих-кода в качестве библиотеки. Возможно, на github есть что-то с открытым исходным кодом, которое вы можете использовать. EAN13 не слишком сложен, поэтому я ожидаю, что кто-то уже придумал что-то полезное. - person rene; 06.04.2016