сохранить как PDF: порекомендовать серверное решение для получения необработанных данных от клиента и отправки обратно PDF клиенту? - PullRequest
1 голос
/ 02 октября 2011

Мой проект требует, чтобы я добавил функцию «Сохранить как PDF». Я искал чистое решение JavaScript, которое делает это только на стороне клиента, однако мне сказали, что оно нереализуемо, по крайней мере, на данный момент.

jsPDF в настоящее время все еще является ограниченной версией, не поддерживает граф и другие. Поэтому сейчас я ищу стабильное бесплатное решение с открытым исходным кодом для настройки веб-службы сервера, которая получает данные со стороны клиента и отправляет обратно полученный файл PDF или ссылку для сохранения пользователем на свой диск.

Данные от клиента определяются пользователем клиента, то есть не всей страницей. Пользователь может выбрать сохранение карты, таблицы или всех их в файл PDF.

Любые рекомендации?

PS: в среде Windows

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Вы можете воспользоваться ReportLab Toolkit - он включает библиотеку Python с открытым исходным кодом для создания PDF-файлов. (Вы не указали, какой язык на стороне сервера вы хотели, но Python довольно широко поддерживается.)

Если вам нужно что-то, что может быть закодировано в Javascript, один из вариантов может быть PhantomJS . Этот инструмент позволяет вам запускать браузер без автономной работы из командной строки, а также, помимо прочего, он может отображать и сохранять веб-страницы в формате PDF. Slippy использует этот подход, так что вы можете получить пример кода из этого проекта. Сценарии создания PDF, вероятно, будут намного быстрее в PhantomJS, чем в Python, но, вероятно, будут намного медленнее (он должен запускать экземпляр Webkit), и установка сервера может быть сложной.

1 голос
/ 03 октября 2011

Я создал эту функцию в 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.

...