сохранить как PDF: рекомендовать серверное решение для получения необработанных данных от клиента и отправки обратно PDF клиенту?

#javascript #pdf #printing #save-as

#javascript #PDF #печать #сохранить как

Вопрос:

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

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

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

Какие-либо рекомендации?

PS: в среде Windows

Ответ №1:

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

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

Ответ №2:

Я создал эту функцию в javascript, которая отправляет iframe на сервер:

 function download(url, datas){
    if(url amp;amp; 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']);
  

После этого, чтобы принудительно загрузить, вам нужно отправить заголовок corrects. Я использую эту функцию:

 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.