2012-11-02 2 views
0

pdf로 현재 jsf 페이지를 내보내려고했습니다. 코드는 다음과 같이JSF2.0은 명령 단추를 사용하여 XHTML보기의 PDF 파일을 엽니 다.

public void writePDF() { 
    String PDF_FILE_NAME = "converted.pdf"; 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext =facesContext.getExternalContext(); 
    HttpServletRequest request = (HttpServletRequest)externalContext.getRequest(); 
    HttpSession session = (HttpSession) externalContext.getSession(true); 
    String url = request.getRequestURL().append(";jsessionid=").append(session.getId().toString()).toString(); 
    try 
    { 
     ITextRenderer renderer = new ITextRenderer(); 
     renderer.setDocument(new URL(url).toString()); 
     renderer.layout(); 
     HttpServletResponse response = (HttpServletResponse)externalContext.getResponse(); 
     response.reset(); 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-Disposition", "inline;filename=\"" + PDF_FILE_NAME + "\""); 
     ServletOutputStream browserStream = response.getOutputStream(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     renderer.createPDF(browserStream); 
     renderer.finishPDF(); 
     facesContext.responseComplete(); 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
        } 
    facesContext.responseComplete(); 
} 

명령 버튼을 클릭에서만 빈 PDF 페이지가 더으로 생성되지 않습니다 다음과 같이 명령 단추와

페이지 index.html

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html"> 
    <h:head> 
    <title>Facelet Title</title> 
    </h:head> 
    <h:body> 
    <h:form> 
     <h:inputText value="#{bean.name}" id="name" ></h:inputText> 
     <h:commandButton value="click" id="btn" actionListener="#{bean.writePDF}"></h:commandButton> 
    </h:form> 
</h:body></html> 

writePDF() 동작 버튼에 대한 기능입니다 컨트롤과 가치. 내가 잘못하고있는 것을 친절하게 제안합니다.

미리 감사드립니다.

+0

JSF 쪽이 멋지게 보입니다. iText/Flyingsaucer 쪽이 잘못 될 것입니다. 양식에 몇 개의 텍스트/이미지를 넣으려고 했습니까? 아마도 iText/Flyingsaucer는 입력 요소 및 버튼과 같은 양식 구성 요소를 먹지 않습니다. 그런 다음 JSF 렌더링을 변경하여 양식 구성 요소 대신 일반 텍스트로 관련 정보를 표시해야합니다. – BalusC

답변

1

나는 정확히 주어진 코드로 테스트를 수행했다. 참으로 아무 것도 보여주지 않습니다. Flyingsaucer는 질문에 대한 첫 번째 의견에서 이미 추측 한대로 HTML 양식 요소를 먹지 않습니다.

가장 좋은 방법은 실제로 입력 텍스트 대신 출력 텍스트로 데이터를 표시하는 것입니다. 이 작업을 동적으로 수행하려면 입력/출력의 조건부 렌더링을 트리거하는 요청 매개 변수를 추가하는 것이 좋습니다.

예.

<h:inputText value="#{bean.name}" id="name" rendered="#{not param.pdf}"/> 
<h:outputText value="#{bean.name}" rendered="#{param.pdf}"/> 

그런 다음 pdf=true을 쿼리 문자열에 추가하십시오.

String url = request.getRequestURL().append(";jsessionid=").append(session.getId()).append("?pdf=true").toString(); 

또는 동일한 bean을 사용하는 다른 페이지를 만든 다음 대신 URL을 전달하십시오.

+0

안녕 BalusC, 당신에 의해 제공되는 솔루션에 따라, 그것은 출력 텍스트를 위해 일하고있다하지만 내 요구 사항에 따라 PDF로 생성되어야 완전한 xhtml 페이지보기로 그냥 샘플 페이지했습니다. 그것을 할 다른 방법이 있습니까? –

+0

안녕 BalusC, 나는 renderer.setDocument (content)에서 내용이 html string 인 경우 또는 xhtml을 구문 분석하고 모든 입력 컨트롤에 대한 렌더러를 만들어야 할 경우 수행 할 수 있습니까? –

관련 문제