0

現在のjsfページを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()アクションボタンの機能は次のとおりです。

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 ページのみが生成され、コントロールと値が含まれません。私は何か間違ったことをしていますか、親切に提案してください。

前もって感謝します。

4

1 に答える 1

1

指定されたコードを正確に使用してテストを行いました。実際には何も表示されません。あなたの質問に対する私の最初のコメントで既に推測したように、Flyingsaucer は単純に HTML フォーム要素を食べないことがわかりました。

あなたの最善の策は、入力テキストではなく出力テキストでデータを提示することです。これを動的に実現するには、入力/出力の条件付きレンダリングをトリガーするリクエスト パラメーターを追加することをお勧めします。

例えば

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

pdf=true次に、クエリ文字列に a を追加します。

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

または、同じ Bean を使用する別のページを作成し、代わりにその URL を渡します。

于 2012-11-02T13:31:32.057 に答える