2012-01-25 3 views
0

私は、Java Spring Framework mvcでitextを使ってpdfをレンダリングしようとしました。 ここに私のフィルタークラスがあります。iTextを使ってPDFを生成する際に例外を取り除く方法

public class PdfFilter implements Filter, ApplicationContextAware { 

@SuppressWarnings({ "UnusedDeclaration" }) 
private static final Logger log = Logger.getLogger(PdfFilter.class); 
protected ApplicationContext applicationContext; 

public void init(FilterConfig config) { 
    /* do nothing */ 
} 

public void destroy() { 
    /* do nothing */ 
} 

public void doFilter(ServletRequest req, ServletResponse resp, 
     FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) resp; 

    // Check to see if this filter should apply. 
    if (!"pdf".equals(request.getParameter("reportViewType"))) { 
     filterChain.doFilter(request, response); 
     return; 
    } 

    // Capture the content for this request 
    ContentCaptureServletResponse capContent = new ContentCaptureServletResponse(
      response); 
    filterChain.doFilter(request, capContent); 

    response.setContentType("application/pdf; charset=UTF-8"); 
    response.setHeader("Content-disposition", 
      "attachment; filename=\"report.pdf\""); 
    response.addHeader("Cache-Control", "-1"); 

    try { 
     // Get the html content 
     String htmlContent = capContent.getHtlmContent(); 

     PdfGenerator pdfGenerator = new PdfGenerator(
       response.getOutputStream()); 

     pdfGenerator.renderPdf(htmlContent, request, response); 

    } catch (Exception e) { 
     throw new ServletException(e); 
    } 
} 

public void setApplicationContext(ApplicationContext applicationContext) { 
    this.applicationContext = applicationContext; 
} 
} 

、ここでは私のpdfGeneratorクラスは パブリッククラスPdfGenerator { プライベート静的最終ロガーログ= Logger.getLogger(PdfGenerator.class)です。 private OutputStream outputStream;

public PdfGenerator(OutputStream os) { 
    this.outputStream = os; 
} 

public void renderPdf(String htmlContent, HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 
    log.debug("renderPdf"); 

    htmlContent = cleanUpHtml(htmlContent); 
    htmlContent = addHeadBodyTag(htmlContent); 

    htmlContent = addCss(htmlContent); 

    log.debug("convertToXhtml-e:"); 
    OutputStream xhtmlOs = new ByteArrayOutputStream(); 

    Tidy tidy = new Tidy(); 
    tidy.setXHTML(true); 
    tidy.setCharEncoding(Configuration.UTF8); 
    tidy.parse(new ByteArrayInputStream(htmlContent.getBytes()), xhtmlOs); 

    xhtmlOs.flush(); 
    xhtmlOs.close(); 
    log.debug(xhtmlOs.toString()); 
    StringReader contentReader = new StringReader(xhtmlOs.toString()); 

    InputSource source = new InputSource(contentReader); 

    DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance() 
      .newDocumentBuilder(); 
    // documentBuilder.setEntityResolver(new MyResolver(request)); 
    documentBuilder.setEntityResolver(new NoOpEntityResolver()); 

    Document xhtmlContent = documentBuilder.parse(source); 

    ITextRenderer renderer = new ITextRenderer(); 
    renderer.setDocument(xhtmlContent, null); 
    renderer.layout(); 

    renderer.createPDF(outputStream); 

    outputStream.close(); 

} 

private String cleanUpHtml(String data) { 
    log.debug("cleanUpHtml-e:"); 

    data = HtmlUtils.removeAllTags(data, "<script", "</script>", null); 
    data = HtmlUtils.replaceAll(data, "<a .*?>|</a>", ""); 
    // data = HtmlUtils.replaceAll(data, "<img .*?>|</img>", ""); 
    data = HtmlUtils.replaceAll(data, "<link .*?>", ""); 
    // remove hidden field 
    data = HtmlUtils.replaceAll(data, "<input.*?type=['\"]hidden['\"].*?>", 
      ""); 
    // remove pagination from lister 
    data = HtmlUtils 
      .replaceAll(
        data, 
        "(<div style=\"top: .*?px; position: absolute;\" id=\"pager\" class=\"pager\".*?</div>)", 
        ""); 

    return data; 
} 

private String addHeadBodyTag(String data) { 
    // data = "<html><head></head><body>" + data + "</body></html>"; 
    return data; 
} 

private String addCss(String data) { 
    log.debug("addCss-e:"); 

    return data; 
} 

private String addHead(String data, HttpServletRequest request) { 
    log.debug("addHeader-e:"); 
    StringBuilder sb = new StringBuilder(500); 
    String header = sb.toString(); 
    data = HtmlUtils.replaceAll(data, "(<body.*?>)", "$1" + header); 

    return data; 

} 

private String addFooter(String data) { 
    log.debug("addFooter-e:"); 

    String footer = "iit lone gunmen 2.0"; 

    data = HtmlUtils.replaceAll(data, "(<body.*?>)", "$1" + footer); 
    return data; 
} 

}

何とかイムは、いくつかの例外を取得:

Jan 26, 2012 5:43:08 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/govForms]  threw exception [Filter execution threw an exception] with root cause 
    java.lang.NoSuchMethodError: com.lowagie.text.Rectangle.getHeight()F 
at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:339) 
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:315) 
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:246) 
at bd.gov.forms.web.pdf.PdfGenerator.renderPdf(PdfGenerator.java:64) 
at bd.gov.forms.web.pdf.PdfFilter.doFilter(PdfFilter.java:54) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119) 
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

ヘルプの任意の種類が認識されます。おかげさまで

答えて

0

NoSuchMethodエラーは、使用しているライブラリのバージョンが一致していないことを示しています。私はライブラリの依存関係をチェックし、いくつかのライブラリがiTextの異なるバージョンを期待していないかどうかを調べることから始めます。もしそうなら、1つの依存関係を除外したり、適切なバージョンのiTextをサポートするライブラリバージョンを選んだりしようと考えています。 MVNの依存関係を::

あなたはMavenを使用している場合は、試すツリーと複数のiTextのの出現

+1

イムは、Mavenを使用していない:(iTextの-パウロ・155.jarとTidy.jarを追加 – rokonoid

+0

あなたはiTextのの適切なバージョンを使用しているよろしいです私は、最新バージョンは5.1.3であることがわかります。。? - http://sourceforge.net/projects/itext/files/iText/iText5.1.3/。 古いAPIを使用していることはほとんど確信しています。チュートリアルに従っている場合は、それが最新のものかどうかを確認してくださいiTextが拡張され、時間の経過とともに成長したのかもしれません。パッケージ(5.1.3 libの内容に基づいています)が変更されたと思います。最新バージョンにアップグレードする必要があります。 –

+0

hmm thanks @ŁukaszBachman、Let私は試して.. – rokonoid

-1

PDF生成のプロセスが理由の多種多様のために失敗することを確認してください。 pdf生成をtry/catchブロックで囲み、catchブロックで何らかのエラー処理を行う必要があります。私はこの問題を処理するための2つの基本的な方法を参照してください。

  1. は、デフォルトのPDF文書を使用してアプリケーションをデプロイします。catched世代の例外でデフォルトのPDFのコンテンツを提供する、失敗した世代
  2. の一般的な警告フレーズが含まれていることになります
  3. pdfジェネレータは結果をバイトストリームで返します(応答出力ストリームに直接は入りません)。正しく返された場合のみ、生成されたpdfを提供するように応答ヘッダを設定し、応答出力ストリームに返されたバイトをコピーします。キャッチされた世代の例外では、エラーを説明するHTMLページを提供するようにレスポンスを設定するか、標準エラーページにリダイレクトすることができます。
関連する問題