Преобразование jsp в PDF с помощью летающей тарелки

У меня есть файл jsp, который мне нравится конвертировать в PDF с помощью летающей тарелки. Вот jsp-файл:

<%@page contentType="text/html" pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="display" uri="http://displaytag.sf.net/el" %>
<!DOCTYPE html>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>
    <form name="testDBForm" action="<%=basePath%>/TestDatabase" method="post" onsubmit="return true">
        <input type="submit" id="btnInsert" value="btnInsert" name="btnInsert" text="INSERT"/>
        <input type="submit" id="btnSelect" value="btnSelect" name="btnSelect" text="SELECT"/>
        <input type="submit" id="btnDelete" value="btnDelete" name="btnDelete" text="DELETE"/>
        <input type="submit" id="btnUpdate" value="btnUpdate" name="btnUpdate" text="UPDATE"/>
  </form>
  <c:if test="${not empty message}">
      <h1>${message}</h1>
  </c:if>
  <c:if test="${not empty insert}">
      <h1>Insert: ${message}</h1>
  </c:if>
  <c:if test="${not empty select}">
      <h1>Select: ${message}</h1>
  </c:if>
  <c:if test="${not empty update}">
      <h1>Update: ${message}</h1>
  </c:if>
  <c:if test="${not empty delete}">
      <h1>Delete: ${message}</h1>
  </c:if>

</body>
  </html>

Вот код сервлета, который я использую для разбора html в pdf:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
    response.setContentType("application/pdf");
    String inputFile = "D:\\03072014\\src\\main\\webapp\\includes\\testDatabase.jsp";
    String url="";
    try {
        url = new File(inputFile).toURI().toURL().toString();
    } catch (MalformedURLException ex) {
        Logger.getLogger(HtmlToPdfTaxCardConvertor.class.getName()).log(Level.SEVERE, null, ex);
    }
    OutputStream os=null;
    try {
        os = response.getOutputStream();
    } catch (IOException ex) {
        Logger.getLogger(HtmlToPdfTaxCardConvertor.class.getName()).log(Level.SEVERE, null, ex);
    }

    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(url);
    renderer.layout();
    try {
        renderer.createPDF(os);
        os.close();
    } catch (DocumentException ex) {
        Logger.getLogger(HtmlToPdfTaxCardConvertor.class.getName()).log(Level.SEVERE, null, ex);
    }
     catch (IOException  ex) {
        Logger.getLogger(HtmlToPdfTaxCardConvertor.class.getName()).log(Level.SEVERE, null, ex);
    }     

} }

Я получил исключение, что

javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: The markup in    the document preceding the root element must be well-formed.

Может ли кто-нибудь помочь мне, и возможно ли создать PDF-файл из такой HTML-страницы?


person vikifor    schedule 22.07.2014    source источник


Ответы (1)


FS использует XHTML, это означает, что он очень требователен к вводу HTML-файла.

Вот 2 вещи, которые стоит попробовать:

  1. Поместите <!DOCTYPE html> в самый верх страницы.
  2. поставьте конец / в свой метатег.
  3. используйте <c:out value="${message}" /> вместо ${message}, чтобы убедиться, что в ваш HTML не помещаются недопустимые символы, вызывающие поломку синтаксического анализатора.

Если это не поможет, вот стандартный шаблон, который я использую для своих FS jsp-страниц, объявление типа документа является необязательным, и вы можете использовать стандартное <!DOCTYPE html>, но я считаю, что пользовательское объявление значительно увеличивает скорость. Однако это означает, что вы должны использовать десятичную кодировку escape-символов.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE doctypeName [
   <!ENTITY nbsp "&#160;">
   <!ENTITY amp "&#38;">
]> 
<%-- other jsp stuff here --%>
<%@include file="/WEB-INF/jsp/taglib.inc"%>
<html>
....
</html>


Следует также упомянуть, что если вы не хотите возиться со всем этим мусором, вы можете использовать JSoup или другой очиститель HTML, чтобы очистить ваш HTML и убедиться, что он на 100% подходит для FS. Существует хорошая форк проекта FS, который разрабатывается danfickle на github, который помогает с этой интеграцией. Он также добавил гораздо больше поддержки CSS3.

person ug_    schedule 22.07.2014