API 有一个 2 向响应,基于请求的 URI:
注意:这是一个二进制文件,不能使用StreamReader读取二进制数据。
这里有两种方法可以将您的 PDF 文件下载为字节数组。
GetPDFResourceAsync() 以查询的形式获取 Uri,获取响应,然后调用第二种方法,GetPDFResourceDirectAsync() ,传递从服务器接收到的WebResponse.ResourceUri。
如果你想使用查询URI,调用GetPDFResourceAsync(),如果你想使用直接资源Uri,调用GetPDFResourceDirectAsync()。
InitializeWebRequest() 方法是一个初始化 HttpWebRequest 的实用方法。没有它,GetPDFResourceAsync() 将无法工作,因为服务器需要一个 User-Agent 标头集和一个压缩方法(否则你会得到垃圾)。
现在,这些方法返回一个字节数组(PDF 文件数据)。
您可以使用File.WriteAllBytes() 方法将其存储到光盘。例如:
' Indirect method, using a URI query
Dim pdfBytes = Await GetPDFResourceAsync(New Uri("https://eprel.ec.europa.eu/api/products/tyres/381324/labels?format=PDF"))
' Direct method, using a resource URI
Dim pdfBytes = Await GetPDFResourceDirectAsync(New Uri("https://eprel.ec.europa.eu/label/Label_381324.pdf"))
Dim pdfFilePath = Path.Combine("[Some Directory]", "Label381324.pdf")
File.WriteAllBytes(pdfFilePath, pdfBytes)
工作方法:
如果您不想/不能使用async 方法,只需从所有位置(包括方法名称)删除async 和await,您将拥有同步代码。
Public Async Function GetPDFResourceAsync(resourceUri As Uri) As Task(Of Byte())
Dim request = WebRequest.CreateHttp(resourceUri)
InitializeWebRequest(request)
Using locResponse As HttpWebResponse = DirectCast(Await request.GetResponseAsync(), HttpWebResponse)
If locResponse.StatusCode = HttpStatusCode.OK Then
Return Await GetPDFResourceDirect(locResponse.ResponseUri)
Else
Return Nothing
End If
End Using
End Function
Public Async Function GetPDFResourceDirectAsync(resourceUri As Uri) As Task(Of Byte())
Dim request = WebRequest.CreateHttp(resourceUri)
InitializeWebRequest(request)
Dim buffersize As Integer = 132072
Dim buffer As Byte() = New Byte(buffersize - 1) {}
Dim dataResponse = DirectCast(Await request.GetResponseAsync(), HttpWebResponse)
If dataResponse.StatusCode = HttpStatusCode.OK Then
Using responseStream As Stream = dataResponse.GetResponseStream(),
mStream As MemoryStream = New MemoryStream()
Dim read As Integer = 0
Do
read = Await responseStream.ReadAsync(buffer, 0, buffer.Length)
Await mStream.WriteAsync(buffer, 0, read)
Loop While read > 0
Return mStream.ToArray()
End Using
End If
Return Nothing
End Function
Private Sub InitializeWebRequest(request As HttpWebRequest)
request.UserAgent = "Mozilla/5.0 (Windows NT 10; WOW64; Trident/7.0; rv:11.0) like Gecko"
request.AutomaticDecompression = DecompressionMethods.GZip Or DecompressionMethods.Deflate
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate;q=0.8")
request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")
End Sub