【问题标题】:how to get rid of exception while generating PDF using iText如何在使用 iText 生成 PDF 时摆脱异常
【发布时间】:2012-02-19 04:39:28
【问题描述】:

我试图在 java spring 框架 mvc 中使用 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 { private static final Logger log = 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)

感谢任何形式的帮助。 谢谢。

【问题讨论】:

    标签: java spring-mvc pdf-generation itext


    【解决方案1】:

    NoSuchMethod 错误表明您使用的库版本不匹配。我将从检查我的库依赖项开始,并查找是否某些库不期望不同版本的 iText。如果是这样,我会尝试排除一个依赖项或选择支持正确版本的 iText 的库版本。

    如果您使用的是 Maven,请尝试:mvn dependency:tree 并检查是否存在多个 iText

    【讨论】:

    【解决方案2】:

    PDF 生成过程可能因多种原因而失败。 您必须在 try/catch 块中包围 pdf 生成,并在 catch 块中进行某种错误处理。我看到了两种处理问题的基本方法:

    1. 使用默认 pdf 文档部署您的应用:在捕获的生成异常中提供默认 pdf 的内容,该内容将包含生成失败的一般警告短语
    2. pdf 生成器以字节流的形式返回结果(而不是直接在响应输出流中),并且只有在正确返回的情况下,才设置响应标头以提供生成的 pdf 并复制响应输出中返回的字节溪流;在捕获的生成异常中,您将响应设置为提供描述错误的 html 页面,或者您可以重定向到标准错误页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多