2010-12-10 1 views
1

내가 JSF 2.0 (이클립스 IDE)을 사용하고 직접 PDF 파일을 생성하고 난 아파치 FOP 1.0을 사용하여 일부 PDF 파일을 생성 내 콩의 하나의 방법이있다. 내 JSF 페이지에서 "makePDF"버튼을 클릭하면 생성 된 PDF가 내 페이지가있는 동일한 윈도우에서 열립니다 (PDF보기/저장/인쇄 후 '뒤로'버튼을 사용해야합니다).는 AdobeReader

나는 "makePDF"버튼을 누르면, 표준 팝 아웃 대화 상자가 나타납니다 그리고 난 파일을 저장하거나 AdobeReader 그것을 열고 싶은 경우에 저를 요청하는 방식으로 변경할 수 있습니다.

, 난 내 "makePDF"버튼을 클릭 방법이 있나요은, PDF 직접 AdobeReader에서 열 생성 (그리고 난 여전히 내 JSF 페이지가 아무것도 확인해야 그나마) ??? 또한 (실제로 필요하지는 않지만 알아두면 좋음) 새로운 창에서 열거 나 프린터로 직접 보낼 수있는 방법이 있습니까?

여기 내 코드의 주요 부분이다 (나는 어떤 관련이없는 물건을 삭제) : 내가 response.setHeader("Content-disposition", "attachment");를 제거하면이 같은 창에서 열립니다

public void makePDF(long contractId, int documentType) { 

    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    String basePath = externalContext.getRealPath("/"); 

    try { 
     fopFactory.setUserConfig(new File(basePath + "/pdf_transform/config/userconfig.xml")); 
     fopFactory.setBaseURL(basePath); 
     fopFactory.getFontManager().setFontBaseURL(basePath); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
    foUserAgent.setBaseURL(fopFactory.getBaseURL()); 

    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 
    response.reset(); 
    response.setHeader("Content-Type", "application/pdf"); 
    response.setHeader("Content-disposition", "attachment"); 
    BufferedOutputStream output = null; 

    try { 
     output = new BufferedOutputStream(response.getOutputStream(), 10240); 
     Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output); 

     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltfile)); 

     Source src = new DOMSource(makeXML(contract)); // my method 
     Result res = new SAXResult(fop.getDefaultHandler()); 

     transformer.transform(src, res); 

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

    facesContext.responseComplete(); 
}` 

, 그렇지 않으면 저를 저장하거나 공개하도록 요청합니다.

미리 감사드립니다.

답변

2

요청을 새 창에서 여는 것은 JSF 관심사가 아닙니다. HTML에 대한 관심이 높아졌습니다.

양식

<h:form target="_blank"> 

target="_blank"을 추가하고 새 탭/창에 요청을 제출합니다. 클라이언트의 프린터로 전송

직접 애플릿처럼 중간에 사람과 같은 클라이언트 측에서 실행되는 코드의 일부 조각을 도입하지 않고 수 없습니다. 당신이 직접 PDF를 열려면

+0

감사합니다. 자바 코드에만 집중했기 때문에 PDF 처리 기사에서 빠졌습니다 :) 여전히 내 기본 질문에 대답하지 않습니다. 즉, AdobeReader에서 직접 열 수 있습니까 (예 : 창에 없음). 내 접근 방식을 바꾸려면? – Nikola

+0

제어 할 수없는 브라우저 설정입니다. 예를 들어 Firefox에서 * 도구> 옵션> 응용 프로그램 *을 선택하십시오. – BalusC

+0

고마워. 고마워. 그것이 실제로 jsf/fop 관련이 아니라는 것이 밝혀졌지만, 그것은 내 문제를 해결했습니다. – Nikola

2

, pls는

response.setHeader("Content-Disposition", "inline"); 
2

을 사용 나는 비슷한 문제를 가지고 있었고, 다행히도 그것을 해결하는 우아한 방법을 발견했다. 누군가에게 더 나은 해결책이 있다면 알려주세요.

사용 사례 : 사용자 (PDF 서블릿에서 생성) PDF 생성에 필요한 JSF 생성 된 형태로 데이터를 입력합니다. 유효성 검사가 실패 할 경우, 오류 메시지가 렌더링되지만 모든 것이 간다면 좋은 pdf 파일은 :-) 새 창에서 열립니다

내 솔루션 :. template.xhtml에서

  1. (또는 Facelets의 정의 사이트)를 입력 :

    <ui:define name="head"> 
         <h:outputScript rendered="#{myBean.pdfDownloadable}"> 
          window.open('#{myBean.pdfUrl}',"pdfWindow","width=800,height=900,left=50,top=10") 
         </h:outputScript> 
    </ui:define> 
    
  2. 뿐만 아니라에서 myBean의 액션 메소드에 JSF 형태의 점에서 당신의 명령 링크 (예 : myBean.showPdf())

  3. 을 폼 데이터가 유효하고 showP 경우 df()가 호출되면 pdfDownloadable 필드를 true로 설정하고 동일한 결과가 window.open()을 사용하여 다시 렌더링되지만 이번에는 렌더링됩니다.

은 누군가가 도움이되기를 바랍니다 ..