2012-12-31 66 views
0

我试图达到的目标是将PDF保存到Oracle数据库到BLOB中。 目前,我使用的servlet只能通过HttpServletResponse发回一个pdf。OutputStream to byte []

Printers.getPDFPrinter(0).printToResponse(myTemplate, response, 0, TemplateA.PDF);

我没有获得printToResponse剧本,所以我不知道它做什么。 我只知道响应有一个HttpServletResponse类型,我可以从中获取OutputStream,而myTemplate实现了一个我还没有访问的IDocument接口。

如果我可以得到myTemplate或响应到一个字节数组(为了将它保存为一个blob),这将是确定的。 但是,在我所有的搜索中,我只找到代码来从输入流创建一个字节数组,而不是输出流。

任何人都可以帮忙吗?

+0

你应该实现一个'IDocument'的后代,该后代打印到一个内存流(这是一个输入/输出流),将其作为模板传递,然后再读取它。 – Alex

回答

0

我不知道该库中的Servlet使用访问Printers.getPDFPrinter(0)但:

  • 库可以提供其他方法比printToResponseprintToStreamprintToFile,...?)
  • 你可以通过你自己的HttpServletResponse返回getOutputStream()上的虚拟ServletOutputStream。这个虚拟子类必须通过委托给Blob.setBinaryStream(1)的结果来实现write(int b)

如果你想编写自己的HttpServletResponse,我宁愿从HttpServletResponseWrapper继承如果servlet也应该返回PDF您ServletOutputStream需要委派原和一滴流。

如果您将servlet仅仅用于返回一个id以稍后从数据库中检索PDF,则需要实现您自己的HttpServletResponse。在这种情况下,我会使用ProxyInvocationHandler处理getOutputStream()

+0

实际上有一个printToStream方法。 谢谢! – Mathiouss

1

该代码可能需要完整的HttpResponse,因为它也需要设置内容类型和其他一些位。尽可能听起来很糟糕,您可以创建一个“模拟”响应对象并覆盖相关方法,以拦截其对输出流的写入。您可以为PDFWriter提供一个ByteArrayOutputStream,以便您可以获取字节[]并将其写入数据库。