【问题标题】:document has no pages with itext文档没有包含 itext 的页面
【发布时间】:2014-01-03 07:00:03
【问题描述】:
<%
OutputStream output=response.getOutputStream();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=details.pdf");
try{
    Document document = new Document();
PdfWriter writer=PdfWriter.getInstance(document, output);
document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/a", "root", "root");
Statement st=con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
List arrlist = new ArrayList();
ResultSet rs=st.executeQuery("Select * from user_start1");
 while(rs.next()){
 arrlist.add(rs.getString("data"));
 }  
for(int i=0;i<12;i++){
  String str =(String) arrlist.get(i);
  System.out.println(str); 
  worker.parseXHtml(writer, document, new StringReader("helloworld"));
}
document.close();
writer.flush();
writer.close();
output.close();
}catch(IOException e){e.printStackTrace();} 
%>

抛出错误

SEVERE: Servlet.service() for servlet [jsp] in context with path [/chieflegis] threw exception [ExceptionConverter: java.io.IOException: The document has no pages.] with root cause
java.io.IOException: The document has no pages.
    at com.itextpdf.text.pdf.PdfPages.writePageTree(PdfPages.java:113)
    at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1217)
    at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:807)
    at com.itextpdf.text.Document.close(Document.java:416)
    at org.apache.jsp.print_jsp._jspService(print_jsp.java:112)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

我以前使用过相同的 xmlworker,但从未出现任何错误。甚至没有显示 helloworld。请帮助

【问题讨论】:

  • 没用。不知道为什么 hello world 也不显示
  • 如果将worker.parseXhtml 线拉到循环之外会起作用吗?也许一次有效,但重复失败?
  • 您要求它解析“helloworld”的 XHTML 不是真正的 XHTML 文本。尝试将其包装在 XHTML 标记中。失败的是关闭。
  • 实际上进一步认为堆栈跟踪是在它尝试关闭 PDFWriter 时。此时您已经关闭了文档,因此它没有页面。在 PDFWrite 关闭后移动文档关闭。

标签: java itext


【解决方案1】:

其他答案都很好。这是一个替代方案。

一般来说,为了防止当文档不包含有意义的内容数据时经常发生的此错误,即使已调用 document.open()document.newPage(),即使在将其他页面标记到该文档之后,您也可以添加一个打开文档时为空块,以确保库永远不会认为它是空的。例如

document.open(); 
document.add(new Chunk("")); // << this will do the trick. 

【讨论】:

    【解决方案2】:

    在编写文档之前尝试像document.newPage() 一样新建一个页面,希望对您有所帮助。

    【讨论】:

    • 令人惊讶的是 hello world 也不显示
    • 尝试在 document.open() 之后立即调用 writer.setPageEmpty(true),会发生什么?
    • 什么也没发生,它给出了同样的错误。文档没有页面。
    【解决方案3】:

    XMLWorkerHelper.parseXHtml() 需要 (X)HTML 或 (X)HTML sn-ps。试试这个:

    worker.parseXHtml(writer, document, new StringReader("<p>helloworld</p>"));
    

    【讨论】:

      【解决方案4】:

      我知道这个答案有点晚了,但就我而言,我刚刚将 iTextSharp 从 5.0 升级到 v. 5.5 并开始正常工作。

      【讨论】:

        【解决方案5】:

        当报告文本中没有数据时,document.add(new Chunk(""));document.open(); 之后为我工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-03
          • 1970-01-01
          相关资源
          最近更新 更多