如何从浏览器 Selenium C# 中读取 pdf 内容

Posted

技术标签:

【中文标题】如何从浏览器 Selenium C# 中读取 pdf 内容【英文标题】:how to read the pdf contents from browser Selenium C# 【发布时间】:2020-06-25 08:22:23 【问题描述】:

我正在自动化以下场景:

点击一个按钮, 在新窗口中打开一个 pdf 文件 阅读在新窗口中打开的pdf文件的内容。

需要帮助:切换到打开 pdf 的窗口后,我不知道如何继续。

注意:此文件无法下载。

尝试了以下方法

public void verifypdf()

    var browerTabs = driver.WindowHandles;
    Assert.True(browerTabs.Count > 0, "Form not open in new Window");
    driver.SwitchTo().Window(browerTabs[1]);
    string PdfUrl = driver.Url;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    string test = readPDFContent(PdfUrl);
    driver.Close();
    driver.SwitchTo().Window(browerTabs[0]);


public String readPDFContent(String pdfUrl)

    Uri uri = new Uri(pdfUrl);

    //how to proceed from here??

【问题讨论】:

请澄清-“阅读pdf文件的内容”是什么意思?提取文本,获取屏幕截图?如果您需要解析某些内容,那么您必须下载文件。 我正在阅读正文。而且我不认为必须像在 JAVA 中那样下载文件,无需下载文件即可读取此内容,因此在 C# 中也应该可以,如果我错了,请纠正我 可能您在 Java 中使用了一些隐式下载 PDF 内容的 PDF 库。无论如何您都需要下载文件内容,编程语言在这里无关紧要。例如,它在 Java 中的外观:***.com/questions/40738373/… 我已将 C# 代码示例提交给答案。 【参考方案1】:

您需要获取完整的 PDF 内容,然后使用一些 PDF 库来提取文本。

这是使用标准 .NET WebClient 类和Docotic.Pdf library 的示例代码:

using (var client = new WebClient())

    byte[] data = client.DownloadData(pdfUrl);
    using (var pdf = new PdfDocument(data))
    
        string text = pdf.GetText();
        ... // do something with extracted text
    

【讨论】:

【参考方案2】:
//download file to local machine:
//default downliad path in win: Environment.GetEnvironmentVariable("USERPROFILE") + @"\Downloads\";

    using System.Net;
    using System.IO;
    public static class FileDownloader
        
            public static string Download(this string downloadFrom,string fileName = "newFile.pdf", string downloadTo = "")
            
                if (downloadTo.Length == 0)  downloadTo = BrowserConfig.DownloadsPath; 
                using var client = new WebClient();
                // Download data.
                var arr = client.DownloadData(downloadFrom);
                File.WriteAllBytes(downloadTo+ "\\" + fileName, arr);
                return downloadTo+fileName;
            
        

//read

    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using iTextSharp.text.pdf;
    using iTextSharp.text.pdf.parser;
    
            public static string ReadPdfFile(this string fileName)
            
                StringBuilder text = new StringBuilder();
                Byte[] bytes;
    
                var wc = WebRequest.Create(fileName);
                using (var response = wc.GetResponse())
                
                    using (var responseStream = response.GetResponseStream())
                    
                        bytes = iTextSharp.text.io.StreamUtil.InputStreamToArray(responseStream);
                        PdfReader pdfReader = new PdfReader(bytes);
                        for (int page = 1; page <= pdfReader.NumberOfPages; page++)
                        
                            ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
    
                            string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
    
                            currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8,
                                Encoding.Default.GetBytes(currentText)));
                            text.Append(currentText);
                            //Console.WriteLine(text);
                        
                        pdfReader.Close();
                    
                
                return text.ToString();
            

【讨论】:

请解释你的代码是做什么的以及它是怎么做的。

以上是关于如何从浏览器 Selenium C# 中读取 pdf 内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 selenium 从 html 5 本地存储中读取

如何在 selenium 中更快地从动态网站读取数据

如何在 Selenium 中使用 Chrome 查看 Flash cookie

如何使用 Selenium WebDriver C# 从下拉列表中选择一个选项?

如何使用 Selenium WebDriver C# 从下拉列表中选择一个选项?

Selenium WebDriver - 如何使用 C# 设置页面加载超时