Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

java

pdfbox

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.

like image 568
R Dhaval Avatar asked Sep 06 '16 10:09

R Dhaval


1 Answers

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();
like image 156
Tilman Hausherr Avatar answered Sep 18 '22 18:09

Tilman Hausherr