Tuesday, June 4, 2024
 Popular · Latest · Hot · Upcoming
123
rated 0 times [  130] [ 7]  / answers: 1 / hits: 18541  / 12 Years ago, mon, january 7, 2013, 12:00:00

I want to display a PDF file in browser. I have the path to the pdf in JS and I am making a call to grab the PDF as a servlet from java. Here's what I have so far:



JavaScript:



RequestManager.getJSON(Config.server + getPDF.json?pdfPath= + this.pathToPdfFile, (function(data){
$(# + this.divId).append('<object id=' + this.pdfObjectId + ' data=' + data + ' type=application/pdf width=600 height=800></object>');
ResizeManager.addResizeHandler(this.pdfObjectId, this.divId, -10, -10);
}).bind(this));


Java:



@RequestMapping(/getPDF)
public void pdfPathToServlet(Model model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String pdfPath = request.getParameter(pdfPath);
if (pdfPath == null || pdfPath.equals())
throw new ServletException(Invalid or non-existent file parameter in UrlServlet servlet.);

if (pdfPath.indexOf(.pdf) == -1)
pdfPath += .pdf;

File pdf = new File(pdfPath);
String pdfName = pdfPath.substring(pdfPath.lastIndexOf(/) + 1, pdfPath.length());
logger.debug(pdfName);
ServletOutputStream stream = null;
BufferedInputStream buf = null;
try
{
stream = response.getOutputStream();
response.setContentType(application/pdf);
response.setHeader(Content-Disposition, inline; filename=' + pdfName + ');
FileInputStream input = new FileInputStream(pdf);
response.setContentLength((int) pdf.length());
buf = new BufferedInputStream(input);
int readBytes = 0;
while ((readBytes = buf.read()) != -1)
stream.write(readBytes);
}
catch (IOException ioe)
{
throw new ServletException(ioe.getMessage());
}
finally
{
if (stream != null)
stream.close();
if (buf != null)
buf.close();
}
}


My problem is that this is showing the binary output in my browser as text.



I'm not sure what I am doing incorrectly. I have tried changing the header to be attachment instead of inline, but that showed the same thing. I believe I want inline though, as I wish to show it in browser and not download it.


More From » java

 Answers
1

Your JavaScript part makes no sense. You're obtaining a PDF file as ajax response and then attempting to set it as data attribute of the <object> element. The data attribute must point to a real URL, not to the file content. Fix your JS accordingly:



$(# + this.divId).append('<object id=' + this.pdfObjectId + ' data=' + Config.server + getPDF.json?pdfPath= + this.pathToPdfFile + ' type=application/pdf width=600 height=800></object>');


The webbrowser will take care about sending the appropriate HTTP request on the given URL and initializing/rendering the <object> element using the Adobe Acrobat Reader plugin — if any available, I'd rather enclose a <a href=pdfURL>PDF</a> inside the <object> so that there's at least a graceful degradation to a download link.






Unrelated to the concrete question, that Java code is not part of a servlet at all, but a Spring MVC action. I recommend to get your terms straight and read in our Servlets wiki page to learn what they really are.


[#81025] Sunday, January 6, 2013, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
anabellejaynav

Total Points: 176
Total Questions: 105
Total Answers: 105

Location: Croatia
Member since Fri, Sep 11, 2020
4 Years ago
anabellejaynav questions
;