0

我正在使用 pdfbox api 在我的项目中生成 pdf 文件,最初我只是将动态生成的 pdf 文件存储在我的服务器中,现在我正在尝试使用以下代码在浏览器中流式传输 pdf 文件

 Ok.stream(Enumerator.outputStream { os => 
          doc.writeToStream(os)//doc holds content of pdf file
          os.close()
        }).withHeaders(
          CONTENT_TYPE -> "application/pdf",
          CONTENT_DISPOSITION -> "attachment; filename=report.pdf"
        )

我有一些回应开始于

%PDF-1.4
%����
1 0 obj
<<
/Type /Catalog
/Version /1.4
/Pages 2 0 R
>>
endobj
2 0 obj

希望它看起来像 pdf 文件已经生成,但没有在浏览器中加载..我不知道我错过了什么,我只想加载 pdf 文件新标签

4

4 回答 4

0

尝试将您的 CONTENT_DISPOSITION 设置为“内联”:

Ok.stream(Enumerator.outputStream { os => 
      doc.writeToStream(os)//doc holds content of pdf file
      os.close()
    }).withHeaders(
      CONTENT_TYPE -> "application/pdf",
      CONTENT_DISPOSITION -> "inline; filename=report.pdf"
    )

看看它是否有所作为。

它应该,即使特定行为取决于浏览器。

您可以在此处找到有关 Content-Disposition 标头的更多详细信息。

于 2013-09-26T15:36:45.067 回答
0

也许枚举器没有正确关闭。

尝试这个 :

Ok.stream(Enumerator.outputStream { os => 
      doc.writeToStream(os)//doc holds content of pdf file
      os.close()
    } >>> Enumerator.eof).withHeaders(
      CONTENT_TYPE -> "application/pdf",
      CONTENT_DISPOSITION -> "attachment; filename=report.pdf"
    )
于 2013-09-26T11:10:14.157 回答
0

就像是:

val enumerator = Enumerator.outputStream { os =>
  doc.writeToStream(os)
  os.close
}

Ok.stream(enumerator >>> Enumerator.eof).as("application/pdf")

在我的情况下也很好用,所以我想 writeToStream 有问题。您可以通过流式传输静态图像来进行测试,在播放框架中配置没有什么特别的

于 2013-09-26T13:02:20.500 回答
0

标头中的内容长度属性丢失。

https://www.playframework.com/documentation/2.5.x/ScalaStream

于 2016-05-04T16:25:20.587 回答