java.lang.IllegalStateException : Cannot read while there is an open stream writer 错误

标签 java pdfbox

我正在编写一个简单的 selenium 测试,我需要截取网页的屏幕截图并将其另存为 PDF。我正在使用带有 Selenium 的 TestNG 和 PDFbox 库

下面是我的测试方法:

package com.helper;

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.testng.annotations.Test;



public class ScreenshotPDF {

    @Test
    public void screenshotPDF(){

    WebDriver driver= DriverManager.getWebdriver("chrome");

    driver.get("https://www.google.co.in");

    try {
        File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

        PDDocument document = new PDDocument();
        PDPage page = new PDPage();
        document.addPage(page);
        PDImageXObject pdi = PDImageXObject.createFromFileByContent(screenshot ,document);
        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.drawImage(pdi,100,100);

        document.save("C:/Users/123456/Documents/sample.pdf");
        contentStream.close();
        document.close();
    } catch (WebDriverException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }
}
}

这里,当我使用 TestNG 运行此测试时,我在控制台中收到以下错误:

FAILED: screenshotPDF
java.lang.IllegalStateException: Cannot read while there is an open stream writer
    at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:129)
    at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1177)
    at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:372)
    at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:561)
    at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:490)
    at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:474)
    at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1073)
    at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:419)
    at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1331)
    at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1229)
    at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1095)
    at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1067)
    at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1055)
    at com.helper.ScreenshotPDF.screenshotPDF(ScreenshotPDF.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
    at org.testng.TestRunner.privateRun(TestRunner.java:774)
    at org.testng.TestRunner.run(TestRunner.java:624)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
    at org.testng.SuiteRunner.run(SuiteRunner.java:261)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
    at org.testng.TestNG.run(TestNG.java:1048)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:57)


===============================================
    Default test
    Tests run: 1, Failures: 1, Skips: 0

我做了很多谷歌搜索,但没有找到解决方案。请帮我解决这个错误。至少这个错误的原因是什么。提前谢谢你。

最佳答案

您需要在保存前关闭内容流:

    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);
    PDImageXObject pdi = PDImageXObject.createFromFileByContent(screenshot ,document);
    PDPageContentStream contentStream = new PDPageContentStream(document, page);
    contentStream.drawImage(pdi,100,100);
    contentStream.close(); // do this before saving!

    document.save("C:/Users/123456/Documents/sample.pdf");
    document.close();

关于java.lang.IllegalStateException : Cannot read while there is an open stream writer 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39347301/

相关文章:

java - 2D 游戏中跳跃的数学运算

java - Java 中的泛型和反射

Java PDFBox 为 PDF 表单中的几个字段设置自定义字体

android - pdfbox android studio 中的 NoClassDefFoundError

java - Flying Saucer - HTML 到 PDF 和许可 (iText)

java - 将 pdf 内容放在 Apache PDFBox 中 Canvas 的中心

java - 使用 HttpSession 时,变量无法从一个 JSP 转移到另一个 JSP

java - "Serialization"的概念

java - 如何使用多线程并行化 Java 中的 for 循环?

java - 使用 getResource 在 java 中无法读取输入图像