public class RendererFilter implements Filter { private FilterConfig config; private DocumentBuilder documentBuilder; /** * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ public void init(FilterConfig configToSet) throws ServletException { try { this.config = configToSet; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); documentBuilder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { throw new ServletException(e); } } /** * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, * javax.servlet.FilterChain) */ 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. String renderType = request.getParameter("RenderOutputType"); if (renderType != null) { // Capture the content for this request ContentCaptureServletResponse capContent = new ContentCaptureServletResponse(response); filterChain.doFilter(request, capContent); try { // Parse the XHTML content to a document that is readable by the XHTML renderer. StringReader contentReader = new StringReader(capContent.getContent()); InputSource source = new InputSource(contentReader); Document xhtmlContent = documentBuilder.parse(source); if (renderType.equals("pdf")) { ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(xhtmlContent, ""); renderer.layout(); response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "inline; filename=print.pdf"); OutputStream browserStream = response.getOutputStream(); renderer.createPDF(browserStream); return; } } catch (SAXException e) { throw new ServletException(e); } catch (DocumentException e) { throw new ServletException(e); } } else { // Normal processing filterChain.doFilter(request, response); } } }
The content of the xhtml file is obtained from the response using a wrapper that captures the response writer and produces a ByteArrayOutputStream that is converted to a string in the getContent method:
public class ContentCaptureServletResponse extends HttpServletResponseWrapper { private ByteArrayOutputStream contentBuffer; private PrintWriter writer; public ContentCaptureServletResponse(HttpServletResponse resp) { super(resp); } @Override public PrintWriter getWriter() throws IOException { if(writer == null){ contentBuffer = new ByteArrayOutputStream(); writer = new PrintWriter(contentBuffer); } return writer; } public String getContent(){ writer.flush(); String xhtmlContent = new String(contentBuffer.toByteArray()); return xhtmlContent; } }
Source code obtained from here.
renderer.setDocument(xhtmlContent, "");
renderer.setDocument(xhtmlContent, request.getRequestURL().toString());
This works fine except in the case that the xhtml has images in it. In that case, the renderer library must kwow the url that the xhtml came from, in order to calculate relative image paths. To achieve that you can change the line 45 of the RendererFilter:
renderer.setDocument(xhtmlContent, "");
by:
renderer.setDocument(xhtmlContent, request.getRequestURL().toString());
Before you can use the renderer, you must configure the filter and mapping in the web.xml of the application.
Finally, to automatically generate the PDF on the fly you must call or link to the url in the following way:
../path/to/file.xhtml?RenderOutputType=pdf
Thanks ... after long search i found your simple solution!!! works great for me!
ReplyDeleteHTTP Status 500 - org.xml.sax.SAXParseException; lineNumber: 193; columnNumber: 1202; The entity "nbsp" was referenced, but not declared.
ReplyDeletewhy???
van
ReplyDeletekastamonu
elazığ
tokat
sakarya
5QR
ağrı
ReplyDeletevan
elazığ
adıyaman
bingöl
SL67M
https://titandijital.com.tr/
ReplyDeletesakarya parça eşya taşıma
aksaray parça eşya taşıma
urfa parça eşya taşıma
kocaeli parça eşya taşıma
LCH
Tokat Lojistik
ReplyDeleteKonya Lojistik
Mersin Lojistik
Karabük Lojistik
Samsun Lojistik
4TL1
EEA82
ReplyDeleteKırıkkale Evden Eve Nakliyat
Silivri Fayans Ustası
buy parabolan
Ankara Asansör Tamiri
Çerkezköy Çatı Ustası
Btcturk Güvenilir mi
Kütahya Evden Eve Nakliyat
Silivri Boya Ustası
order testosterone enanthate
2CA4F
ReplyDeletebybit
kucoin
4g proxy
telegram kripto
bitcoin ne zaman çıktı
mexc
4g mobil proxy
kucoin
ilk kripto borsası
2533D
ReplyDeletebitget
binance referans kimliği nedir
paribu
sohbet canlı
bitget
bybit
mercatox
4g mobil proxy
bybit
DE4CA
ReplyDeletegate io
poloniex
4g proxy
bitcoin hangi bankalarda var
telegram kripto para
filtre kağıdı
coin nasıl alınır
binance
bibox
13712
ReplyDeletetelegram kripto grupları
bitexen
mexc
binance
kripto telegram
binance
mercatox
en güvenilir kripto borsası
canlı sohbet siteleri
02E37
ReplyDelete----
----
----
----
----
----
matadorbet
----
----
8449D
ReplyDeletewhatsapp görüntülü şov
621361F62B
ReplyDeletewhatsapp ücretli show
whatsapp görüntülü show güvenilir
görüntülü şov
ücretli şov
şov
skype show
görüntülü şov whatsapp numarası
ücretli show
skype şov
5A5819A24A
ReplyDeletelifta
geciktirici
sinegra
sildegra
vega
green temptation
cobra vega
bufalo içecek
kaldırıcı
6E6DA59F03
ReplyDeletemaxman
performans arttırıcı
themra macun
whatsapp ücretli show
telegram görüntülü şov
kamagra hap
sildegra
delay
cialis
4A1B19346D
ReplyDeletetürk takipçi satın al
FA93A308CC
ReplyDeletetiktok takipçi al
F2204E4816
ReplyDeletePara Yatırmadan Para Kazanma Telegram
Telegram Güvenilir Coin Oyunları
Telegram Para Kazanma Botları
Yeni Telegram Coin Kasma Botları
Telegram Coin Kazma Botları