在浏览器中加载pdf文件的问题Play Framework(Scala)

时间:2013-09-26 09:23:57

标签: scala pdf-generation playframework-2.1 pdfbox

我正在使用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 个答案:

答案 0 :(得分: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"
    )

答案 1 :(得分:0)

类似的东西:

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

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

在我的情况下也很好用,所以我认为writeToStream有问题。你可以通过流式传输静态图像进行测试,在play框架中配置没有什么特别的东西

答案 2 :(得分: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标头here的更多详细信息。

答案 3 :(得分:0)

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

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