如何使用Selenium Webdriver和Java从PDF阅读

时间:2018-07-04 10:19:38

标签: java selenium-webdriver pdfbox bufferedinputstream pdfparser

我正在尝试使用Java-Selenium读取PDF文件的内容。下面是我的代码。 getWebDriver是框架中的自定义方法。它返回webdriver。

URL urlOfPdf = new URL(this.getWebDriver().getCurrentUrl());

BufferedInputStream fileToParse = new BufferedInputStream(urlOfPdf.openStream());

PDFParser parser = new PDFParser((RandomAccessRead) fileToParse);
parser.parse();

String output = new PDFTextStripper().getText(parser.getPDDocument());

如果我不将其解析为RandomAccessRead类型,则代码的第二行会给出编译时错误。

compilation error

当我解析它时,出现此运行时错误:

  

java.lang.ClassCastException:java.io.BufferedInputStream无法转换为org.apache.pdfbox.io.RandomAccessRead

runtime error

我需要摆脱这些错误的帮助。

1 个答案:

答案 0 :(得分:1)

首先,除非您希望干扰PDF的加载过程,否则无需显式使用PdfParser类。您可以改用静态PDDocument.load方法:

URL urlOfPdf = new URL(this.getWebDriver().getCurrentUrl());

BufferedInputStream fileToParse = new BufferedInputStream(urlOfPdf.openStream());

PDDocument document = PDDocument.load(fileToParse);

String output = new PDFTextStripper().getText(document);

否则,如果您想要干扰加载过程,则必须为RandomAccessRead 创建一个BufferedInputStream实例,您不能简单地 cast 它,因为这些类不相关。

您可以这样做

URL urlOfPdf = new URL(this.getWebDriver().getCurrentUrl());

BufferedInputStream fileToParse = new BufferedInputStream(urlOfPdf.openStream());

MemoryUsageSetting memUsageSetting = MemoryUsageSetting.setupMainMemoryOnly();
ScratchFile scratchFile = new ScratchFile(memUsageSetting);
PDFParser parser;
try
{
    RandomAccessRead source = scratchFile.createBuffer(fileToParse);
    parser = new PDFParser(source);
    parser.parse();
}
catch (IOException ioe)
{
    IOUtils.closeQuietly(scratchFile);
    throw ioe;
}

String output = new PDFTextStripper().getText(parser.getPDDocument());

(这实际上是从PDDocument.load的源复制并粘贴的。)