0

基本上,我有一个必须生成大型 * .pdf报告的 Web 应用程序。它托管在 Google App Engine 上,我正在使用 Google Web Toolkit 来部署它。客户端调用服务器上的getReport()方法,读取所需的数据并生成报告。由于我无法在 Google App Engine 上写入文件,因此我将其写入内存并获取其字节,作为服务器方法的返回响应。

一旦文档可能导致大文件,我会在我的应用程序的较早时间从服务器获取报告字节,并且当客户端请求时,我需要将这些字节转换为 * .pdf文件并使其可用作下载。所以我需要另一个 servlet 来做到这一点。

我的远程方法实现如下。

@Override
    public byte[] getReport(String arg0, String arg1) {
        try {
            Document document = new Document();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfWriter.getInstance(document, baos);
            document.open();
            /* Report generation */
            document.close();
            return baos.toByteArray();
        } catch (DocumentException e) {
            /* Exception handling */
            return null;
        }
    }

我使用 GET 实现了一个 servlet,只是为了生成一个 * .pdf文件,如下所示,仅用于测试目的。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "attachment; filename=report.pdf");
            try {
                Document document = new Document();
                PdfWriter.getInstance(document, response.getOutputStream());
                document.open();
                /* Test report generation */
                document.close();
            } catch (DocumentException e) {
                /* Exception handling */
            }
    }

我已将它们分别配置为 /project/retrieve_report 和 /project/get_report,它们在浏览器中工作。当我执行该方法时,我有来自远程服务器的字节可用。

AsyncCallback<byte[]> callback = new AsyncCallback<byte[]>(){
                    @Override
                    public void onFailure(Throwable caught) {
                    }
                    @Override
                    public void onSuccess(byte[] result) {
                    }};
                reportService.getReport(arg0, arg1, callback);

所以我现在真正需要并且找不到任何可靠的帮助是将客户端从onSucess()条件重定向到 servlet,将字节数组结果作为参数发送,将报告作为文件下载在浏览器中获取。我必须用doPost()替换doGet( ) ,检索字节数组参数并使用它来构建文件,但我有点迷失在这里。

我对网络应用程序真的很陌生,所以任何帮助都将不胜感激。我一直在寻找这个,但我被困住了,我有一个关于这个毕业项目的简短日历。

提前致谢。

4

1 回答 1

0

您也可以在 servlet 中编写或调用该getReport方法。从客户端,您只需要window.open直接使用方法调用该 servlet 即可进行 pdf 下载。

您必须调用初始 rpc,它在服务器端的会话变量中设置字节。

HttpServletRequest request = this.getThreadLocalRequest();      
HttpSession session = request.getSession(); 
session.setAttribute("PdfFileInByte", getReport())

然后每个 pdf 下载调用,您必须从会话中读取该文件并下载 pdf 文件。

PdfWriter.getInstance(document, session.getAttribute("PdfFileInByte"));

然后,如果您想不再使用它,请将其从会话属性中删除。

于 2013-03-15T14:04:08.250 回答