#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.