gpt4 book ai didi

java - 使用 java servlet 在浏览器中显示 Pdf

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:05 24 4
gpt4 key购买 nike

我的应用程序中有 pdf 文件。我需要在浏览器中显示 pdf。我正在将文件作为 fileInputStream 读取,我需要在我的应用程序中的浏览器中显示 pdf。但是我没有pdf路径,我有文件流。

请给我一些建议和例子


我使用 ajax 来显示 pdf,我正在使用 call_method() javascript ajax 请求方法来调用 showPdf 操作,在 showpdf 操作中只是将 pdf 文件转换为 ByteArrayOutputStream 并将结果写入输出流。但它显示了下面提到的结果。

JSP 中的结果:

%PDF-1.4 %���� 1 endstream endobj 4 0 obj <>>>/MediaBox[0 0 595 842]>> endobj 1 0 obj <> endobj 3 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj xref 0 7 0000000000 65535 F 0000000389 00000 N 0000000015 00000 N 0000000477 00000 N 0000000232 00000 N 00000000000000 N 0000000540 00000 N 000000000585 00000 n N 0000000 N337255542542.14254PAR> abrim

请给点建议。

Javascript ajax:

call_method(); <br/>
function call_method(){

Ext.Ajax.request({
waitMsg: 'Saving changes...',
url:'test.action?method=showPdf',
params : { },
failure:function(response,options){

},
success:function(response,options){
$("#pdf_content").show();
$("#pdf_content").html(response.responseText);
$("#pdf_content").show('slow');
}
});
}

Java 方法:

public String showPdf() throws IOException {

getResponse().setContentType("application/pdf");

getResponse().setHeader("Content-disposition","inline; filename=automatic_start.pdf" );


ByteArrayOutputStream baos = getByteArrayOutputStream();

getResponse().setContentLength(baos.size());

ServletOutputStream sos;

sos = getResponse().getOutputStream();

baos.writeTo(sos);

sos.flush();

return null;
}


private ByteArrayOutputStream getByteArrayOutputStream() throws IOException {

String filePath = "/homefolder/";

String folderPath=filePath+"1122/automatic_start.pdf";

File file = new File(folderPath);

FileInputStream fis = new FileInputStream(file);



ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[256];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum); //no doubt here is 0
//Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
System.out.println("read " + readNum + " bytes,");
}

} catch (IOException ex) {
ex.printStackTrace();
}


return bos;
}

最佳答案

您必须将您的 InputStream 写入您的响应 OutputStream,如下所示:

  • 您的Content-Disposition 必须是内联
  • 您的Content-Type 必须是application/pdf
  • 您的 Content-Length 将是 InputStream 中总数据的长度(以字节为单位)。

设置后,将输入流数据写入响应的输出流。

这种效果的东西:

/* (non-Javadoc)
* @see org.bfs.bayweb.util.renderer.ServletViewRenderer#render(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void render(ServletRequest request, ServletResponse response) throws IOException {
// TODO Auto-generated method stub
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int inputStreamLength = 0;
int length = 0;
while ((length = getInputStream().read(buffer)) > 0) {
inputStreamLength += length;
baos.write(buffer, 0, length);
}

if (inputStreamLength > getContentLength()) {
setContentLength(inputStreamLength);
}

if (response instanceof HttpServletResponse) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.reset();
httpResponse.setHeader("Content-Type", getContentType());
httpResponse.setHeader("Content-Length", String.valueOf(getContentLength()));
httpResponse.setHeader("Content-Disposition", "\"" + getContentDisposition() + "\"" + ((getFileName() != null && !getFileName().isEmpty()) ? "; filename=\"" + getFileName() + "\"": ""));
}

response.getOutputStream().write(baos.toByteArray(), 0, (int)getContentLength());

//finally
response.getOutputStream().flush();

//clear
baos = null;
} finally {
// TODO Auto-generated catch block
close(response.getOutputStream());
close(getInputStream());
}
}

private void close(Closeable resource) throws IOException {
if (resource != null) {
resource.close();
}
}

关于java - 使用 java servlet 在浏览器中显示 Pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7386233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com