使用C#解析网上在线PDF

2026-06-02 13:57:3542 阅读量
  1. 其实,一开始我觉得应该说实话,我没搞到解析在线pdf,用了迂回战术,先down到本地,再从本地解析的,有盆友知道如何解析在线的请告知哈!

    相关服务:新加坡站群服务器

  2. 我这次做的是抓取银行各类货币兑外币汇率的数据,起先,是使用HtmlAgilityPack爬虫在线网站网页上货币数据,BUT由于业务增多,财务发来增加了几类币种。
    在这里插入图片描述
    其中除了泰铢,并木有比较少用的像印尼卢比,越南盾这种的货币。然后在网站上找了一圈发现有个在线pdf档有数据,就一路解析爬虫pdf档咯。

    网站上的货币汇率数据是这样的:在这里插入图片描述
    本次使用了Spire.Pdf和Spire.License这两个DLL。通过工具–库程序包管理器–管理解决方案的NuGet程序包中联网搜索下载的。就是文件太大了。

在这里插入图片描述

WebConFig的数据为:
 <add key="TOACoinName" value="澳元,AUD;加元,CAD;欧罗,EUR;英镑,GBP;美元,USD;人民币(在岸),CNY;日圆,JPY;新加坡元,SGD;菲律宾比索,PHP;马来西亚币,MYR;泰国泰铢,THB;印尼卢比,IDR;越南盾,VND"/>


	    private void CatchUnDollarRate()
        {
            StringBuilder strSql = new StringBuilder();
            try
            {
                //处理HttpWebRequest访问https有安全证书的问题( 请求被中止: 未能创建 SSL/TLS 安全通道。)
                ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

				//本地路径
                string path = System.Configuration.ConfigurationManager.AppSettings["FILE_ROOT_PATH"].ToString()+ @"\Ratesheet";

                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                string filepath = path + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH.MM.ss") + "Ratesheet.pdf";

				//下载到本地,网址就用了个假的啦
                DownDocumentPdf(filepath, "https://www.baidu.pdf");

                Spire.Pdf.PdfDocument dd = new Spire.Pdf.PdfDocument();
                var thread = new Thread(() =>
                {   
                //读取刚刚存到本地路径的PDF                
                    dd.LoadFromFile(filepath);
                });
                
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();
                thread.Join();

                string data = string.Empty;

                foreach (PdfPageBase page in dd.Pages)
                {
                   //解析出数据
                    data = page.ExtractText();
                }

                #region 解析汇率行
                Dictionary<string, string> rateDic = new Dictionary<string, string>();

                List<string> coinNameList = new List<string>(); 
                string TOACoinName = System.Configuration.ConfigurationManager.AppSettings["TOACoinName"].ToString();
               
                string[] coinname = TOACoinName.Split(';');
                Dictionary<string, string> nameToCoinNo = new Dictionary<string, string>();

                string coinposition = string.Empty;
                string coinpername = string.Empty;
                string coinperno = string.Empty;

                for (int i = 0; i < coinname.Count(); i++)
                {
                    coinpername = coinname[i].Split(',')[0];
                    coinperno = coinname[i].Split(',')[1];

                    coinNameList.Add(coinpername);
                    nameToCoinNo.Add(coinpername, coinperno);
					//如果你要查询马来西亚币,coinperno就为MYR,若当前文档中有次货币返回值则!=-1
                    if (data.IndexOf(coinperno) != -1)
                    {
                        coinposition = data.Substring(data.IndexOf(coinperno), 80);
                        rateDic.Add(coinname[i].Split(',')[0], System.Text.RegularExpressions.Regex.Replace(coinposition, @"[^\d.\d]", ""));
						//汇率数据肯定取得是带小数点的数据嘛,所以用了正则表达式取出来了
                        
                    }
                }

                #endregion            
            }
            catch (Exception ex)
            {
              return ex.message.tostring();
            }
        }

		///下载文件到本地路径
        private void DownDocumentPdf(string filepath, string url)
        {
            // 设置参数
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

            //发送请求并获取相应回应数据
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;

            //直到request.GetResponse()程序才开始向目标网页发送Post请求
            Stream responseStream = response.GetResponseStream();
           
            Stream stream = new FileStream(filepath, FileMode.Create);
            byte[] bArr = new byte[1024];
            int size = responseStream.Read(bArr, 0, (int)bArr.Length);
            while (size > 0)
            {
                stream.Write(bArr, 0, size);
                size = responseStream.Read(bArr, 0, (int)bArr.Length);
            }
            stream.Close();
            responseStream.Close();          
        }

本文地址:https://www.idc504.com/news/9_95799.html