从GAE应用程序内部写入PDF

时间:2013-02-21 00:27:26

标签: java google-app-engine pdf file-io google-cloud-datastore

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

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

这可能是一个巨大的延伸,但我唯一的另一个选择是将此任务转移到非GAE服务器,我想不惜一切代价避免,即使我需要进行大量额外的开发。提前谢谢。

3 个答案:

答案 0 :(得分:3)

使用GAE本身绝对可以实现您的使用案例。以下是您应该在高级别遵循的步骤:

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

  2. 由于无法直接写入文件,因此需要以字节为单位生成PDF内容,然后编写一个Servlet作为下载Servlet。 Servlet将使用Response对象打开流,操纵Mime Headers(文件名,文件类型)并将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和其他类生成数据,并将其写入您在第二个参数中传递的输出流。

答案 1 :(得分:2)

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

我认为PDF的生成时间将超过30秒,因此您必须考虑使用Task Queue Java API进行此过程。

将文件保存在内存中后,您可以简单地write it to the Blobstore,然后将其作为常规blob提供。在overview中,您将找到有关如何在Google App Engine上上传,编写和提供二进制数据(blob)的完整功能示例。

答案 2 :(得分:0)

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