10

フォームにWebBrowserコントロールがありますが、ほとんどの場合、ユーザーには表示されません。一連のログインおよびその他のタスクを処理するためにあります。ログインを処理するJavascriptが大量にあるため、このコントロールを使用する必要があります。(つまり、WebClientオブジェクトに切り替えることはできません。)

少し飛び回った後、PDFファイルをダウンロードしたくなりました。ただし、ダウンロードする代わりに、ファイルはwebBrowserコントロール内に表示され、ユーザーには表示されません。

ブラウザコントロールにPDFをロードする代わりに、PDFをダウンロードするにはどうすればよいですか?

4

3 に答える 3

14

SaveFileDialogコントロールをフォームに追加してから、WebBrowserのNavigatingイベントに次のコードを追加します。

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    if (e.Url.Segments[e.Url.Segments.Length - 1].EndsWith(".pdf"))
    {
        e.Cancel = true;
        string filepath = null;

        saveFileDialog1.FileName = e.Url.Segments[e.Url.Segments.Length - 1];
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            filepath = saveFileDialog1.FileName;
            WebClient client = new WebClient();
            client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
            client.DownloadFileAsync(e.Url, filepath);
        }
    }
}

//コールバック関数

void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    MessageBox.Show("File downloaded");
}

ソース:http ://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/d338a2c8-96df-4cb0-b8be-c5fbdd7c9202

于 2013-03-20T22:20:35.563 に答える
5

私が使用することになった解決策:

必要な場所にURLを取得するために、必要に応じて他のすべてを実行しました。すべてのログイン情報、必要な設定、ビューステートなどがCookieに保存されていることを知って、最終的にWebコントロールのハイブリッドを使用してファイルを取得し、次にWebClientオブジェクトを使用して実際にファイルバイトを取得することができました。

    public byte[] GetPDF(string keyValue)
    {
        DoLogin();

        // Ask the source to generate the PDF. The PDF doesn't 
        // exist on the server until you have visited this page 
        // at least ONCE. The PDF exists for five minutes after 
        // the visit, so you have to snag it pretty quick.
        LoadUrl(string.Format(
            "https://www.theMagicSource.com/getimage.do?&key={0}&imageoutputformat=PDF", 
            keyValue));

        // Now that we're logged in (not shown here), and 
        // (hopefully) at the right location, snag the cookies. 
        // We can use them to download the PDF directly.
        string cookies = GetCookies();

        byte[] fileBytes = null;
        try
        {
            // We are fully logged in, and by now, the PDF should
            // be generated. GO GET IT! 
            WebClient wc = new WebClient();
            wc.Headers.Add("Cookie: " + cookies);

            string tmpFile = Path.GetTempFileName();

            wc.DownloadFile(string.Format(
                "https://www.theMagicSource.com/document?id={0}_final.PDF", 
                keyValue), tmpFile);

            fileBytes = File.ReadAllBytes(tmpFile);
            File.Delete(tmpFile);
        }
        catch (Exception ex)
        {
            // If we can't get the PDF here, then just ignore the error and return null.
            throw new WebScrapePDFException(
                "Could not find the specified file.", ex);
        }

        return fileBytes;
    }

    private void LoadUrl(string url)
    {
        InternalBrowser.Navigate(url);

        // Let the browser control do what it needs to do to start 
        // processing the page.
        Thread.Sleep(100);

        // If EITHER we can't continue OR
        // the web browser has not been idle for 10 consecutive seconds yet, 
        // then wait some more.
        // ...
        // ... Some stuff here to make sure the page is fully loaded and ready. 
        // ... Removed to reduce complexity, but you get the idea.
        // ...
    }

    private string GetCookies()
    {
        if (InternalBrowser.InvokeRequired)
        {
            return (string)InternalBrowser.Invoke(new Func<string>(() => GetCookies()));
        }
        else
        {
            return InternalBrowser.Document.Cookie;
        }
    }  
于 2013-08-06T14:55:21.497 に答える
0
    bool documentCompleted = false;
    string getInnerText(string url)
    {
        documentCompleted = false;
        web.Navigate(url);

        while (!documentCompleted)         
            Application.DoEvents();


        return web.Document.Body.InnerText;
    }
    private void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        documentCompleted = true;
    }
于 2014-06-18T13:37:11.640 に答える