летающая тарелка / iText PDF в сервлете не находит файл css - PullRequest
3 голосов
/ 15 марта 2012

Фрагмент кода находится внизу вопроса

Я успешно могу отрисовать PDF в браузере клиента, используя сервлет и летающую тарелку / iText.Тем не менее, я не могу понять, как получить таблицу стилей, включенную в рендеринг PDF.

Я пробовал следующее, и ни одна из них не работала до сих пор:

  • getServletContext () .getRealPath ("/ PDFservlet.css") и размещение "PDFservlet.css" в корневом веб-каталоге
  • buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>") и помещение "PDFservlet.css" в корневой веб-каталог, каталог, где находится сервлетфайл класса находится прямо в каталоге "classes"
  • То же, что и выше, за исключением href='\PDFservlet.css' и размещения "PDFservlet.css" в разных местах в моем корневом веб-каталоге

Неконечно, что еще можно попробовать здесь и как распознать этот лист CSS, когда PDF отображается в браузере клиента.

Кто-нибудь из вас может сказать мне, что я делаю здесь неправильно?

Кроме того, я получаю java.io.IOException: Stream closed после рендеринга PDF-файла и не уверен, откуда он берется.

Я тестирую это локально и запускаю WebLogic Server 10.3.3.

public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws javax.servlet.ServletException, java.io.IOException
{
    resp.setContentType("application/pdf");

    StringBuffer buf = new StringBuffer();
    buf.append("<html>");

    // put in some style
    buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>");

    // generate the rest of the HTML...
    buf.append("<body>");
    buf.append("    <div id='container'>");
    buf.append("        <div id='check_num'>1000</div>");
    buf.append("        <div id='address'><b>Estate Of JAMES SMITH</b><br />35 Addison Avenue<br />New York, NY 00000<br />(123)456-7890</div>");
    buf.append("        <div id='date'><i>Date</i>&#160;<u>02/08/2012</u></div>");
    buf.append("        <div id='void_message'><b>VOID 180 DAYS FROM CHECK DATE</b></div>");
    buf.append("        <div id='pay_line_container'>");
    buf.append("            <div id='pay_line_message'><i>Pay To The Order Of:</i></div>");
    buf.append("            <div id='pay_line'></div>");
    buf.append("            <div id='pay_line_pay_to'>Richard Richards XXIII</div>");
    buf.append("            <div id='pay_line_amount'>$&#160;5.00</div>");
    buf.append("        </div>");
    buf.append("        <div id='pay_line2_container'>");
    buf.append("            <div id='pay_line2'></div>");
    buf.append("            <div id='pay_line2_amount_description'>Five and 00/100</div>");
    buf.append("            <div id='pay_line2_dollars'>DOLLARS</div>");
    buf.append("        </div>");
    buf.append("        <div id='void_stamp'><b>VOID</b></div>");
    buf.append("        <div id='for_line'><i>For:</i>&#160;<u>test</u></div>");
    buf.append("        <div id='bank_info'><b>TD BANKNORTH</b><br />MAINE</div>");
    buf.append("        <div id='signature_line'></div>");
    buf.append("        <div id='bank_numbers'><b>c1000c a123456789a 987654321c</b></div>");
    buf.append("    </div>");
    buf.append("</body>");
    buf.append("</html>");

    System.out.println(buf.toString());

    // parse our markup into an xml Document
    try {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(new StringBufferInputStream(buf.toString()));
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(doc, null);
        renderer.layout();
        OutputStream os = resp.getOutputStream();
        renderer.createPDF(os);
        os.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

Редактировать I

ReadiВ качестве альтернативы у меня работает содержимое CSS-файла из кода на стороне сервера в String (метод readFile основан на посте Джона Скита в Как создать строку Java из содержимогофайл? ):

buf.append("<head><style>");
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
buf.append("</style></head>");

Похоже ли это, что в качестве альтернативы подход OK?

Редактировать II

Я создал чат для iText, который, я надеюсь, некоторые из вас могут заглядывать каждый раз через некоторое время.У меня было несколько проблем с iText / летающей тарелкой, которые, я думаю, могут быть легко решены с помощью некоторых из вас, экспертов.Пожалуйста, посмотрите, если у вас есть шанс, и опубликуйте все полезные материалы, которые вы можете использовать для проблем iText: http://chat.stackoverflow.com/rooms/8945/itext

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Есть несколько способов решить эту проблему, один ваш, другие:

1: установите URL для вашего документа. Вы вызываете renderer.setDocument(doc, null);, второй параметр - это базовый URL, ресурсы будут расположены относительно этого.

Пример:

2: реализовать интерфейс UserAgentCallback и установить для него renderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);

1 голос
/ 16 марта 2012

Я решил просто прочитать мой CSS-файл на стороне сервера в строку.

Метод readFile основан на посте Джона Скита в Как создать строку Java изсодержимое файла? ):

buf.append("<head><style>");
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
buf.append("</style></head>");
...