我想在iframe中显示pdf文档。我已经将iframe的源设置为servlet并将一些参数传递给servlet。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String docName = request.getParameter("docName");
String id = request.getParameter("id");
if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(docName)) {
DocumentService service = DamServiceProvider.PROVIDER.getDocumentService();
FileInBean fileInBean = new FileInBean();
fileInBean.setDocName(docName);
fileInBean.setId(Integer.valueOf(id));
FileDataBean fileDataBean = service.getFileDataBean(fileInBean);
if (fileDataBean.getStatusCode() == 0) {
Map<String, String> headerFieldMap = fileDataBean.getHeaderFieldMap();
String contentType = headerFieldMap.get("Content-type");
String contentLength = headerFieldMap.get("Content-Length");
String contentDisposition = headerFieldMap.get("Content-Disposition");
byte[] stream = fileDataBean.getStream();
ByteArrayInputStream inputStream = new ByteArrayInputStream(stream);
OutputStream outputStream = response.getOutputStream();
response.reset();
response.setBufferSize(4096);
response.setContentLength(Integer.valueOf(contentLength));
response.setContentType(contentType);
response.setHeader("Content-Disposition", contentDisposition);
System.out.println(contentDisposition);
IOUtils.copy(inputStream, outputStream);
outputStream.close();
inputStream.close();
}
}
} catch (Exception ex) {
Log.error(this, ex.getMessage());
}
}
现在,在我的页面中,我有一个主从细节界面。主要部分包含一系列pdf文件项的轮播。点击该项目后,我将刷新包含iframe的详细信息视图。
我可以看到servlet被调用。大多数情况下,iframe显示pdf文档。但有时它会显示奇怪的xml结构,其中包含xml标签和一些不可读的输出。请参阅附件图片:
特定文件不会发生这种情况。如果文件显示此输出,稍后如果单击该项,则显示有效的pdf,如果某个项目显示有效的pdf,则稍后如果单击它则显示此类输出。当iframe显示此类型的输出时,我的浏览器会显示该pdf文档可能已损坏的信息。
我已经检查了文件所在的存储库,我发现没有问题。所有这些都是有效的pdf,我可以通过pdf阅读器下载和打开它们。
我无法找到此问题的原因。任何指针都会非常有用。
我检查了输出。它以%% EOF结尾,并在开头有%PDF。
我已经在Chrome的网络控制台中检查过,GET主要返回三种类型的内容类型:application / pdf,text / plain,application / octet-stream。
我在servlet中放置了一个日志,以查看从服务返回的内容类型。对于所有情况,它是 application / pdf 。
答案 0 :(得分:1)
我认为这可能是内容类型的问题,您可以使用开发人员工具(在Chrome的网络控制台中)确认浏览器中是否存在此问题。
答案 1 :(得分:0)
尝试这样的事情。
File pdfFile = new File(this.pdfStoreLocation + pdfFileName);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=" + pdfFileName);
response.setContentLength((int) pdfFile.length());
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pdfFile));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
// byte array declared
byte[] buf = new byte[2048];
boolean eof = false;
while (!eof) {
int length = bis.read(buf);
if (length == -1) {
eof = true;
}else {
bos.write(buf, 0, length);
}
}
try {
bis.close();
}catch (IOException ex) {
LOGGER.error("Exception in closing buffered input stream on pdf file->" + this.pdfStoreLocation + pdfFileName);
}
try {
bos.flush();
}catch (IOException ex) {
LOGGER.error("Exception in fliushing buffered output stream on pdf file->"
+ this.pdfStoreLocation + pdfFileName);
}
bos.close();