我想在浏览器中显示PDF文件。我有JS的pdf路径,我正在调用从java获取PDF作为servlet。这是我到目前为止所做的:
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));
爪哇:
@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();
}
}
我的问题是,这是在我的浏览器中以文本形式显示二进制输出。
我不确定我做错了什么。我已经尝试将标题更改为附件而不是内联,但这显示了同样的事情。我相信我想要内联,因为我希望在浏览器中显示它而不是下载它。
答案 0 :(得分:5)
你的JavaScript部分毫无意义。您将获取PDF文件作为ajax响应,然后尝试将其设置为data
元素的<object>
属性。 data
属性必须指向真实的URL,而不是文件内容。相应地修复你的JS:
$("#" + this.divId).append('<object id="' + this.pdfObjectId + '" data="' + Config.server + "getPDF.json?pdfPath=" + this.pathToPdfFile + '" type="application/pdf" width="600" height="800"></object>');
webbrowser将负责在给定的URL上发送适当的HTTP请求并使用Adobe Acrobat Reader插件初始化/呈现<object>
元素 - 如果有的话,我宁愿附上{{1}在<a href="pdfURL">PDF</a>
内部,以便下载链接至少有一个优雅的降级。
无关具体问题,Java代码根本不是servlet的一部分,而是Spring MVC动作。我建议您直接理解您的用语,并在our Servlets wiki page中阅读,了解它们的真实含义。
答案 1 :(得分:0)
response.setHeader("Content-Disposition", "attachment;filename=" + pdfName);
答案 2 :(得分:-1)
response.setHeader("Content-Disposition", "inline; filename='" + pdfName + "'");
您无法在线显示PDF。它需要独自在自己的页面(或Iframe)上。