RDR RDR - 1 month ago 9
Java Question

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

I am writing a simple selenium test in which I need to take a screenshot of webpage and save it as PDF. I am using TestNG and PDFbox library with Selenium

Below is my test method:

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();
}
}
}


Here when I run this test with TestNG, I get the following errors in Console:

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


I did so much of googling but did not find the solution. Please help me with this error. At least what can be the reason of this error. Thank you in advance.

Answer

You need to close the content stream before saving:

    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();
Comments