2013-07-29 6 views
1

현재 페이지를 캡처하여 pdf로 변환하는 응용 프로그램으로 보내고 싶습니다.자바 웹의 현재 페이지 내용을 캡처하십시오.

FacesContext facesContext=FacesContext.getCurrentInstance(); 


     HttpServletResponse response = (HttpServletResponse) 
facesContext.getExternalContext().getResponse(); 
     HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest(); 
//  RequestPrinter.debugString(); 
     response.reset(); 
    // download a pdf file 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-Disposition","attachment;filename="+new Date().toString()+".pdf"); 
     prince.setVerbose(true); 
     prince.setLog(logFile); 

      try{ 


       //getPath() to the page the user is currently on 
       URL pagePath=new URL(this.getPath()); 
       URLConnection urlConnection = pagePath.openConnection(); 

       urlConnection.setDoOutput(true); 

       int length = urlConnection.getContentLength(); 

       //Lets use inputStream 
       BufferedInputStream bis=new BufferedInputStream(urlConnection.getInputStream()); 
       response.setContentLength(length); 
       //this.getPageUsingJSoup().data().getBytes(); 
       //call prince and pass params for inputstream outputStream 

       prince.convert(bis,response.getOutputStream()); 
       urlConnection.getInputStream().close(); 

      }catch(MalformedURLException mu){ 

       mu.printStackTrace(); 
      } 
      catch(IOException ioe){ 
      ioe.printStackTrace(); 
      } 

    facesContext.responseComplete(); 

웹 사이트가 인증을 필요로하기 때문에이 생성 된 PDF 파일은 loging 오류 페이지입니다 :

이것은 내가 사용하고있는 것입니다.

현재 사용자의 세션을 사용하는 페이지 콘텐츠를 캡처하는 방법이 있습니까?

미리 감사드립니다.

답변

3

현재 요청과 동일한 HTTP 세션에서 페이지를 요청하십시오.

String sessionId = ((HttpSession) externalContext.getSession()).getId(); 
InputStream input = new URL("http://localhost:8080/context/page.jsf;jsessionid=" + sessionId).openStream(); 
// ... 

을 또는 당신의 웹 애플리케이션은 URL 재 작성에 동의하지 않을 경우,하지만 쿠키는, 다음으로 설정 허용 : 당신의 웹 애플리케이션은 URL (기본적으로) 재 작성을 지원하는 경우, 그럼 그냥 jsessionid 경로 조각으로 세션 ID를 추가 당신은 POST 요청을 수행에 관심이있을 것 같지 않기 때문에 내가 setDoOutput()을 제거

URLConnection connection = new URL("http://localhost:8080/context/page.jsf").openConnection(); 
connection.setRequestProperty("Cookie", "JSESSIONID=" + sessionId); 
InputStream input = connection.getInputStream(); 
// ... 

참고 : 쿠키를 일반적인 방법을 요청합니다.

+0

안녕하세요 @BalusC, 우리 webapp은 URL 재 작성을 지원합니다. 먼저 제안을 시도했지만 여전히 오류 로그인 페이지가 표시됩니다. webapp은 Seam 인증을 사용하고 prince (pdf를 인쇄 할 때 사용하는 응용 프로그램)는 Windows 컴퓨터에 설치합니다. 로그인을 통과하거나 새 URL 연결을 인증 된 세션에 바인딩하는 방법이 있습니까? 감사합니다. –

+1

Seam 인증에 익숙하지 않아 자세한 내용을 알 수 없지만 이론적으로는 추가 요청 쿠키가 필요합니다. 일반 웹 브라우저 (Chrome/IE10/Firebug의 F12 키를 누르고 "인터넷"/ "네트워크"섹션을 확인)와 웹 서버간에 HTTP 트래픽을 모니터링하여 요청 헤더에 추가 쿠키가 없는지 확인합니다. 그렇다면 프로그래밍 방식의 요청에서 매우 동일한 쿠키를 시뮬레이션해야합니다. – BalusC

+0

브라우저에서 (캐시를 지우고 다시 로그인 한 후) jsessionid 쿠키 만 있고 세션 저장 공간이 비어 있습니다. tomcat 관리자의 활성 HttpSessions 정보 아래에서 활성 세션에는 세션 이름, 추측 로켈, 추측 사용자 이름, 생성 시간, 마지막 액세스 시간, 사용 시간, 비활성 시간 및 TTL 등의 열 이름이 있습니다. –

0

현재 사용자의 세션을 사용하여 페이지의 콘텐츠를 캡처하는 방법을 모르겠지만 다른 방법을 제안 할 수 있습니다. 셀렌 테스트 케이스에서 PDF 변환 논리를 옮기고 테스트 케이스를 사용하여 인증이 필요한 페이지로 이동하여 로그인하십시오. 자동화 된 TC가 로그인 한 후에는 PDF 변환 논리를 호출 할 수 있습니다 ...?

0

물론 있습니다. 당신은이 콘텐츠를 보내고 있습니다. 컨텐트 개체를 저장해야합니다. 당신이 그것을 가지고 있지 않다면, 당신의 바이트 스트림을 검사하십시오. 콘텐츠가 있어야합니다;)

+0

감사합니다. @Evgheni and Stimpson Cat. 나는 페이지의 내용을 캡처하는 것을 선호한다. Stimpson, content에 액세스 할 수있는 방법을 알려 주실 수 있습니까? printPDF() 메소드는 페이지를 렌더링하는 데 사용되는 관리 빈과 다른 관리 빈에 있습니다. –

+0

죄송합니다. EJB에 대한 많은 경험이 없습니다. 어쩌면 내가 틀렸어, 너가이 진절머리 나는 녀석과 함께 일하는 것을 감독했다. 잘 모르겠다. 관리 된 콩이 컨테이너에 의해 보호 받고 있을지도 모른다. 더 많이 생각할수록, EJB를 결코 사용하지 않았기 때문에 더 운이 좋다;) –

0

전체 페이지를 pdf로 변환하고 .pdf 파일로 저장할 수있는 몇 가지 웹 사이트가 있습니다. 사이트를 사용해보십시오 http://pdfcrowd.com/ 희망이 도움이됩니다.