2

我需要从我的 GAE 数据存储中读取几兆字节(原始文本字符串),然后将它们全部写入新的 PDF 文件,然后使 PDF 文件可供用户下载。

我很清楚阻止您写入文件系统的沙盒限制。我想知道是否有一种巧妙的方法可以在内存中创建 PDF(或内存和 blobstore 的组合),然后以某种方式存储它,以便客户端(浏览器)实际上可以将其作为文件拉下来并保存它在本地。

这可能是一个巨大的延伸,但我唯一的其他选择是将这个任务外包给非 GAE 服务器,我想不惜一切代价避免这种情况,即使这需要我进行大量额外的开发。提前致谢。

4

3 回答 3

3

您绝对可以使用 GAE 本身来实现您的用例。以下是您应该在高层次上遵循​​的步骤:

  1. 下载优秀的iText 库,这是一个用于处理 PDF 的 Java 库。首先构建您的 Java 代码以生成 PDF 内容。查看各种示例:http: //itextpdf.com/book/toc.php

  2. 由于您不能直接写入文件,因此您需要以字节为单位生成 PDF 内容,然后编写一个充当下载 Servlet 的 Servlet。Servlet 将使用 Response 对象打开流,操作 Mime 标头(文件名、文件类型)并将 PDF 内容写入流。执行此操作时,浏览器会自动显示下载选项。

  3. 您的下载 Servlet 将具有如下所示的高级代码:

    public class DownloadPDF extends HttpServlet {
    
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
    
            //Extract some request parameters, fetch your data and generate your document
    
            String fileName = "<SomeFileName>.pdf";
            res.setContentType("application/pdf");
            res.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
            writePDF(<SomeObjectData>, res.getOutputStream());
        }
    }
    

    }

  4. 请记住,上面的 writePDF 方法是您自己的方法,您可以在其中使用 iText 库 Document 和其他类来生成数据并将其写入您在第二个参数中传递的输出流中。

于 2013-02-21T05:01:24.070 回答
2

虽然我不知道 Google App Engine 上的 PDF 生成,尤其是 Java 中的 PDF 生成,但是一旦你拥有它,你肯定可以存储它并稍后提供它。

我想 PDF 的生成将花费 30 多秒,因此您将不得不考虑为此过程使用Task Queue Java API 。

将文件放入内存后,您可以简单地将其写入 Blobstore,然后将其作为常规 Blob 提供。在概述中,您将找到一个关于如何在 Google App Engine 上上传、编写和提供二进制数据 (blob) 的功能齐全的示例。

于 2013-02-21T08:57:54.200 回答
0

我通过谷歌搜索找到了几个解决方案。请注意,我实际上并没有尝试过这些库,但希望它们会有所帮助。

于 2013-02-21T01:11:50.383 回答