【问题标题】:OutputStream to byte[]输出流到字节[]
【发布时间】:2012-12-15 17:11:23
【问题描述】:

我想要达到的目标是将 PDF 保存到 Oracle 数据库中的 BLOB 中。 目前,我使用的 servlet 仅通过 HttpServletResponse 发回一个 pdf。

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

我无权访问 printToResponse 脚本,所以我不知道它的作用。 我只知道响应有一个 HttpServletResponse 类型,我可以从中获取 OutputStream,而 myTemplate 实现了一个我也无法访问的 IDocument 接口。

如果我可以将 myTemplate 或 response 放入字节数组(以便将其保存为 blob),那就没问题了。 然而,在我所有的搜索中,我只找到了从输入流而不是输出流创建字节数组的代码。

有人可以帮忙吗?

【问题讨论】:

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

标签: java pdf byte blob outputstream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不确定 servlet 使用哪个库来访问 Printers.getPDFPrinter(0),但是:

    • 该库可能提供除 printToResponse 以外的其他方法(printToStream、printToFile、...?)
    • 你可以通过你自己的HttpServletResponse 在getOutputStream() 上返回一个虚拟的ServletOutputStream。这个虚拟子类必须通过委托给Blob.setBinaryStream(1) 的结果来实现write(int b)。

    如果您想编写自己的 HttpServletResponse,我更愿意从 HttpServletResponseWrapper 继承,前提是 servlet 还应返回 PDF,您的 ServletOutputStream 需要委托原始和 Blob 流。

    如果您希望 servlet 只是为了返回一个 id 以便稍后从数据库中检索 PDF,您需要实现自己的 HttpServletResponse。在这种情况下,我将使用 Proxy 和 InvocationHandler 处理 getOutputStream()。

    【讨论】:

    • 其实有一个 printToStream 方法。谢谢!
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2017-12-28
    • 2011-05-15
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多