【问题标题】:Getting a dynamically created PDF from a URL从 URL 获取动态创建的 PDF
【发布时间】:2013-09-27 10:44:10
【问题描述】:

我需要获取一个从 aspx 网站生成的 pdf 文件。

背景故事

我想从网站获取日程安排,我已成功获取到日程安排的 url,其中包含参数。如果您点击 url,您将看到一个由网站使用给定参数创建的 PDF 流。

http://www.novasoftware.se/ImgGen/schedulegenerator.aspx?format=pdf&schoolid=57240/sv-se&type=1&id=%7bD8920398-FA90-4960-BD47-69A8EFF7204D%7d&period=&week=38&mode=0&printer=1&colors=2&head=1&clock=1&foot=1&day=0&width=2480&height=3507&count=1&decrypt=0

站点使用此 URL 来获取适当的日程安排并将其显示为 pdf。 由于理论上它不是 PDF 文件,因此我无法将其作为一个文件下载:

    Dim Downloader As New WebClient
    Downloader.DownloadFile(URL, fileName)

我也不能使用...将内容下载为字符串

    Dim Downloader As New WebClient
    Dim Result As String = Downloader.DownloadString(URL)

...因为它会由于缺少参数而导致 500 服务器错误。

显示文件/流/文档或其真实名称的唯一方法是通过浏览器访问给定的 url。鉴于此,我尝试通过 WebBrowser 控件获取 PDF。但由于它“无法显示 XML 页面”(导航到计划 URL 时显示错误)我也不能使用这种方法。

所以我的问题是,我如何将这些数据下载为 PDF 或如何将这些数据作为我可以使用 StreamReader 读取的流?

旁注:

该页面不再使用客户端连接,因此我无法回溯它。 (我使用 Fiddler2 跟踪所有连接)

使用 Fiddler,我可以看出 URL SomethingSomething.com/Something.aspx 会生成 PDF 并显示它。生成文档的前几行(通过 Fiddler)

%PDF-1.4

%����

%

%wPDF by WPCubed GmbH V3.54x[0]

%

%

1 0 个对象

我可以从 Fiddler 那里获得有关此站点的更多信息,因此,如果您需要,请自行尝试或让我在此处添加信息。

【问题讨论】:

    标签: asp.net .net vb.net pdf


    【解决方案1】:

    使用下面的代码将文件下载到内存流:

    Dim webRes As HttpWebResponse = Nothing
    Dim memStream As New MemoryStream
    
    Try
        Dim webReq As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
        webReq.Credentials = CredentialCache.DefaultCredentials
        webRes = webReq.GetResponse
    
        Dim resStream As Stream = webRes.GetResponseStream
    
        Dim bytesRead As Integer
    
        Do
            Dim buffer(1023) As Byte
            bytesRead = resStream.Read(buffer, 0, buffer.Length)
            memStream.Write(buffer, 0, bytesRead)
        Loop Until bytesRead = 0
    
    Catch ex As Exception
    
    Finally
        If webRes IsNot Nothing Then
            webRes.Close()
            webRes = Nothing
        End If
    
        memStream.Seek(0, SeekOrigin.Begin)
    
    End Try
    
    ' optionally save the stream into a file
    memStream.WriteTo(New FileStream("d:\filename.pdf", FileMode.Create))
    

    【讨论】:

    • 这似乎正是我所需要的,但它不起作用。按原样运行代码后,它会在 0 字节上输出一个文件。在检查 ex.Message 的错误后,它显示“500 服务器错误”如果我将 url 粘贴到浏览器中它可以工作(如果需要,请测试上面的内容),但当我使用代码抓取它时不会。
    • 我用你上面的链接测试了代码,效果很好。
    • 其实我试过上面Downloader.DownloadFile(URL, fileName)的代码,还是成功下载并保存了文件。
    • 奇怪!也许当我尝试时他们实际上有一个 500 错误,这与方法无关。文件中的内容是否功能齐全?可以打开看吗?
    • 是的...不是英文的。看起来像上课时间表。
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 2023-03-22
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多