2012-03-15 2 views
2

Фрагмент кода находится в нижней части вопросалетно-блюдце/IText PDF в сервлет не найти файл CSS

Я нахожусь успешно в состоянии вынести 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(); 
    } 
} 

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

Чтение содержимого файла CSS на стороне сервера код в строку работает для меня в качестве альтернативы (метод readFile базируется на пост Джона Скита в How do I create a Java string from the contents of a file?):

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

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

Edit II

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

ответ

1

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

Метод readFile базируется на пост Джона Скита в How do I create a Java string from the contents of a file?):

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

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

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

Пример:

  • Ваш документ <link href="my.css" ..
  • устанавливаемых сотовый расположен в http://example.com/something/my.css
  • Вы должны позвонить renderer.setDocument(doc, "http://example.com/something/page.html");

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

+0

«второй параметр - это URL вашего документа» - мой документ отображается в OutputStream, поэтому я не уверен, что это будет. Прямо сейчас, у меня есть OutputStream, возвращаемый из сервлета в iframe. –

+0

Он не будет (и не может) быть проверен, вы говорите Flying Saucer, что использовать в качестве базового URL-адреса для поиска относительных URL-адресов. (Я обновил свой ответ с этой информацией) – Adam

Смежные вопросы