1

我的项目要求我添加“另存为 PDF”功能。我一直在寻找一个纯 JavaScript 解决方案,它只在客户端执行此操作,但是被告知它至少目前无法实现。

jsPDF 目前还是一个限定版本,不支持graph等。因此,现在我正在寻找一种稳定的开源免费解决方案来设置服务器 Web 服务,该服务从客户端接收数据并将生成的 PDF 文件或链接发送回供用户保存到他们的磁盘。

来自客户端的数据由客户端用户确定,这意味着,不是整个页面。用户可以选择将地图、表格或全部保存为 PDF 文件。

有什么建议吗?

PS:在Windows环境下

4

2 回答 2

2

您可以查看ReportLab 工具包——它包含一个用于创建 PDF 的开源 Python 库。(您没有指定所需的服务器端语言,但 Python 得到了相当广泛的支持。)

如果您需要可以用 Javascript 编码的东西,一种选择可能是PhantomJS。此工具允许您从命令行运行无头 Webkit 浏览器,除此之外,它还可以将网页呈现和保存为 PDF。Slippy使用这种方法,因此您可以从该项目中获取示例代码。在 PhantomJS 中编写 PDF 创建脚本可能比在 Python 中快得多,但它可能要慢得多(它必须启动 Webkit 实例)并且服务器安装可能很复杂。

于 2011-10-02T19:49:38.683 回答
1

我在 javascript 中创建了这个函数,它在 iframe 上发送到服务器:

function download(url, datas){
    if(url && datas){ 
        var inputs = '', value,
            iframe = '<iframe name="iframeDownload" id="iframeDownload" width=0 height=0></iframe>';

        $(iframe).appendTo('body');

        datas.forEach(function(data){ 
            name = encodeURI(data.get('name'));
            value = encodeURI(data.get('value'));

            inputs+='<input name="'+name+'" value="'+value+'"/>'; 
        });

        $('<form action="'+url+'" method="post" target="iframeDownload">'+inputs+'</form>').appendTo('body').submit().remove(); // .appendTo and remove() are needed for firefox

        $(iframe).remove();
    };
};

我正在对输入名称和值进行编码以便能够发送数据。在我的服务器上,我使用的是 php,因此要对其进行解码,您需要: rawurldecode。如果将输入的名称定义为“fileName”和“file”,则可以这样写:

$fileName = rawurldecode($_POST['fileName']);
$file = rawurldecode($_POST['file']);

之后,要强制下载,您需要发送正确的标头。我正在使用这个功能:

function download($filename, $file) {
    header('Content-disposition: attachment; filename="'.$filename.'"');
    header('Content-Type: application/force-download');
    header('Content-Length: '. filesize($file));
    readfile($file);
}

如果您不需要从 javascript 发送文件,因为它是在服务器端创建的,只需将文件的路径添加到下载功能。


如果您使用的是 PHP,您可以使用 fpdf 生成 pdf。

于 2011-10-02T20:09:05.900 回答