java - 自定义代理复制 PDF

标签 java jakarta-ee pdf servlets

我正在编写一个自定义代理作为我们的主应用程序的 Web 服务客户端,该应用程序使用 REST Web 服务。出于安全原因,我尝试使用客户端上的 servlet 作为代理从服务器端检索 PDF,然后通过客户端应用程序将其显示在应用程序 Web 浏览器中。

作为其核心,我有这段代码:

  protected void copy(HttpResponse fromResponse, HttpServletResponse toResponse)
      throws IOException{
    HttpEntity entity = fromResponse.getEntity();
    for(Header header:fromResponse.getAllHeaders()){
      toResponse.setHeader(header.getName(), header.getValue());
    }

    BufferedInputStream inputStream = new BufferedInputStream(entity.getContent());
    BufferedOutputStream outputStream = new BufferedOutputStream(toResponse.getOutputStream());

int oneByte;
int byteCount = 0;
while((oneByte = inputStream.read()) >= 0){
  outputStream.write(oneByte);
  ++byteCount;
}

log.debug("Bytes copied:" + byteCount);

它应该将 PDF 从返回的输出流复制到当前输出流,然后返回它。

但是,当我运行它时,我从 Adob​​e Reader 收到一条错误消息,指出文件已损坏且无法修复。当我直接运行 URL 时,文件没问题,因此它必须是交接中的内容。 byteCount 等于 PDF 文件大小。

有人知道问题出在哪里吗?

最佳答案

通过做

while((inputStream.read(buffer)) >= 0){
  outputStream.write(buffer);
}

您将始终写入缓冲区的完整长度,无论其有效内容长度如何,因为写入只能查看缓冲区的大小来确定要写入的内容。

int count;
while(((count = inputStream.read(buffer))) >= 0){
  outputStream.write(buffer,0,count);
}

应该解决这个问题。

关于java - 自定义代理复制 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029571/

相关文章:

java - Java中的边框与间距?

java - 准备好的语句更新 - 性能改进

c# - 如何使用 C# 从 PDF 读取自定义字段(不是 XMP 元数据)?

pdf - "font type"14种标准的PDF字体是什么?

java - 当我在jsp端使用jSTL时如何分离 map 键

java - 用于围绕错误进程包装超时的标准 Java 模式

java - 使用 JAVA 和 JPA 1.0 对 DB2 进行大量更新或插入

java - 在不指定队列管理器名称的情况下连接到队列

c++ - 如何让 cmake 的 PKG_CHECK_MODULES 在 Windows 中找到我的 cairo 库

java - RCPTT Maven 插件程序