【问题标题】:Itext pdf invalid after downloadItext pdf下载后无效
【发布时间】:2013-12-03 21:15:49
【问题描述】:

当我下载签名的 pdf 文档时,Adobe Reader 将其显示为无效。我可以在本地项目文件夹中的服务器上正常查看此文件,但是当我通过我的 servlet 下载此文件时,此下载过程中的某些内容会使 pdf 无效。 这是我的 servlet 下载代码:

response.setContentType("application/pdf");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-Disposition","inline;filename=CompensationReport" + compensation+".pdf");
response.setHeader("Accept-Ranges", "bytes");

FileInputStream fis = new FileInputStream(thePdf1);
BufferedInputStream bis = new BufferedInputStream(fis);
ServletOutputStream sos = response.getOutputStream();
byte[] buffer = new byte[2048];
while (true) {
    int bytesRead = bis.read(buffer, 0, buffer.length);
    if (bytesRead < 0) {
        break;
    }
    sos.write(buffer, 0, bytesRead);
    sos.flush();
}
sos.flush();
bis.close();  
return;

【问题讨论】:

  • 文件有什么不同,即服务器上磁盘上的文件和客户端接收到的文件?后一个被切断了吗?被问到这个问题,我不太确定在这里接受范围是否是个好主意。
  • 你用的是哪个浏览器?
  • 我在我的计算机上进行本地开发,当我尝试从项目文件夹打开文件时,它打开正常,当我使用我的 servlet 下载选项下载文件夹时 - Adob​​e Reader 说:此文档无效。如果没有签名的签名字段,则文档可以正常打开。
  • 我使用 mozilla ,它也会在预览中打开下载的文档,但通常浏览器不会显示签名字段

标签: java servlets itext


【解决方案1】:

如here 所述,尝试设置 Content-Length

response.setContentLength(filebytesize);

【讨论】:

  • 但我使用 ServletOutputStream sos = response.getOutputStream();
  • 这东西成功了,不知道是不是运气好 FileInputStream fis = new FileInputStream(thePdf1); response.setContentLength(fis.available());
  • 设置Content-Length类似于设置Header和Content-Type。
  • @JovoKrneta fis.available() 适用于 FileInputStream 实例。不过,对于一般的InputStream,available() 确实不一定返回确切的总长度,而是只返回当前手头的数据量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多