Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отправка сформированного на JS PDF-файла на почту клиенту. (https://javascript.ru/forum/misc/73559-otpravka-sformirovannogo-na-js-pdf-fajjla-na-pochtu-klientu.html)

the_little 25.04.2018 11:47

Отправка сформированного на JS PDF-файла на почту клиенту.
 
Всем привет.

Есть страница, на которой размещен калькулятор.
Я формирую при помощи pdfmake
https://github.com/bpampuch/pdfmake
pdf файл, который можно скачать или распечатать.

При этом в форме есть галочка, отправить расчеты мне на почту.
Соответсвенно если она отмечена, то этот файл должен уходить на почту клиенту.

В мануале есть открыть, печатать, скачать...
pdfMake.createPdf(docInfo).download('name.pdf');
pdfMake.createPdf(docInfo).open('name.pdf');
pdfMake.createPdf(docInfo).print('name.pdf');


Как этот файл во вложение засунуть?

laimas 25.04.2018 12:20

Цитата:

Сообщение от the_little
Как этот файл во вложение засунуть?

При этом в форме есть галочка, отправить расчеты мне на почту ?

the_little 25.04.2018 15:19

Цитата:

Сообщение от laimas (Сообщение 484017)
При этом в форме есть галочка, отправить расчеты мне на почту ?

Да, в форме есть галочка, отправить мне на почту.

Но файл в любом случае куда-то отправляется.
Если есть галочка, то и клиенту и администратору.
Если галочки нет, то только администратору.

Я не понимаю как этот файл "выцепить".

Форму в которую подгружается файл, и который нужно отправить по почте я понимаю. Делал.
А как этот сформированный где-то файл запихнуть в письмо я не понимаю...

laimas 25.04.2018 15:29

Цитата:

Сообщение от the_little
Я не понимаю как этот файл "выцепить".

Читать о методах используемого, если есть метод возвращающий данные этого файла, то не проблема его отправить на сервер.

Как примечание: чем большие возможностей предоставляется, тем больше приключений на свою задницу ищет разработчик :) Почему именно PDF, это калькулятор с плюшками в виде картинок, дизайн которого определяется исключительно пользователем? А проще, обычной html-таблицей результат расчета представить невозможно?

PDF, это же не брелок, который можно прицепить к связке ключей и носить с собой.

the_little 25.04.2018 16:19

Цитата:

Сообщение от laimas (Сообщение 484027)
Читать о методах используемого, если есть метод возвращающий данные этого файла, то не проблема его отправить на сервер.

Как примечание: чем большие возможностей предоставляется, тем больше приключений на свою задницу ищет разработчик :) Почему именно PDF, это калькулятор с плюшками в виде картинок, дизайн которого определяется исключительно пользователем? А проще, обычной html-таблицей результат расчета представить невозможно?

PDF, это же не брелок, который можно прицепить к связке ключей и носить с собой.

Такое задание... При этом в PDF выводится просто текстовая часть...

the_little 25.04.2018 16:20

Цитата:

Сообщение от laimas (Сообщение 484027)
Читать о методах используемого

Имеется ввиду читать в документации pdfmaker?

Нет там такого... Посмотрел, там много всего по выводу контента и настройкам самого файла. С этим всем я разобрался.
А про то что этот файл можно отправить - ни слова. И в интернете я не нашел как его отправить...

laimas 25.04.2018 16:42

Цитата:

Сообщение от the_little
Имеется ввиду читать в документации pdfmaker?

Нет там такого... Посмотрел, там много всего по выводу контента и настройкам самого файла.

Тогда нужно давать ссылку на то, что используете. Если говорить о pdfmaker, то единственное, что мне известно, это библиотека Эдоба - https://helpx.adobe.com/ru/acrobat/u...r-windows.html. Если же говорить о pdfmake, то есть такая js - https://github.com/bpampuch/pdfmake, в которой есть метод получения файла как, к примеру, данные base64, и которые можно отправить скрытым полем, в простейшем случае.

А вы о чем?

the_little 25.04.2018 16:47

Цитата:

Сообщение от laimas (Сообщение 484034)
Тогда нужно давать ссылку на то, что используете. Если говорить о pdfmaker, то единственное, что мне известно, это библиотека Эдоба - https://helpx.adobe.com/ru/acrobat/u...r-windows.html. Если же говорить о pdfmake, то есть такая js - https://github.com/bpampuch/pdfmake, в которой есть метод получения файла как, к примеру, данные base64, и которые можно отправить скрытым полем, в простейшем случае.

А вы о чем?

Вот она
такая js - https://github.com/bpampuch/pdfmake

laimas 25.04.2018 16:49

Ну и какие проблемы? Знаний хватит на простейшее - отправить текстом base64 (если файл не велик) и все необходимое сделать на сервере? Метод то в примере даже описан.

the_little 25.04.2018 16:55

Я в документации ничего не нашел про это...
ТАм кроме стилей и 3-х функций ничего и нет...

Я сделал по инструкции. Файл формируется. Выводится на печать.
// Вывод на печать файла
			var docInfo = {

				info: {
					title:'Тестовый документ PDF',
					author:'Viktor',
					subject:'Theme',
					keywords:'Ключевые слова'
				},

				pageSize:'A4',
				pageOrientation:'portrait',//'portrait'
				pageMargins:[50,50,50,50],

				header:[
					{
						text: 'Общая сумма ремонта = ' + full_summ,
						alignment:'center',//left  right
					}
				],

				footer:function(currentPage,pageCount) {
					return {
						text: currentPage.toString() + 'из' + pageCount,
						alignment:'right',
						margin:[0,30,10,50]
					}
				},

				content: [

					{
						text:'Расчет стоимости ремонта квартиры',
						margin:[0,30,0,30],
						style:'header'
						//pageBreak:'after'
					},

					{
						text:'Параметры квартиры',
						margin:[0,0,0,15],
						style:'headertwo'
						//pageBreak:'before'
					},

					{
						text: 'Количество комнат - ' + print_rooms,
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

					{
						text: 'Площадь квартиры = ' + square + 'кв.м.',
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

					{
						text: 'Количество санузлов = ' + sanuzel,
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

					{
						text:'Капитальные работы',
						margin:[0,0,0,15],
						style:'headertwo'
						//pageBreak:'before'
					},

					{
						text: 'Мокрая стяжка пола - ' + print_styajka,
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

					{
						text: 'Возведение межкомнатных стен - ' + print_walls,
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

					{
						text: 'Демонтаж - ' + print_demontaj,
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

					{
						text: 'Разводка электрики - ' + print_electrik,
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

					{
						text: 'В моем доме деревянные перекрытия - ' + print_woods,
						margin:[20,0,0,10],
						style:'maintext'
						//pageBreak:'before'
					},

				],

				styles: {
					header: {
						fontSize:20,
						bold:true,
						alignment:'center'
					},
					headertwo: {
						fontSize:16,
						bold:true,
						alignment:'left'
					},
					maintext: {
						fontSize:14,
						bold:false,
						alignment:'left'
					}
				}
			}

			pdfMake.createPdf(docInfo).print('name.pdf');

laimas 25.04.2018 16:59

Цитата:

Сообщение от the_little
Я в документации ничего не нашел про это...

На первой же странице:

const pdfDocGenerator = pdfMake.createPdf(docDefinition);
pdfDocGenerator.getBase64((data) => {
    //тут помещайте data в скрытое поле формы, и отправляйте на сервер
    //выполнив этот метод, если выбрана отправка 
});


Как вы читаете доки то? А можно и BLOB отправить как файл, и такой метод есть.

the_little 25.04.2018 18:41

Цитата:

Сообщение от laimas (Сообщение 484043)
На первой же странице:

const pdfDocGenerator = pdfMake.createPdf(docDefinition);
pdfDocGenerator.getBase64((data) => {
    //тут помещайте data в скрытое поле формы, и отправляйте на сервер
    //выполнив этот метод, если выбрана отправка 
});


Как вы читаете доки то? А можно и BLOB отправить как файл, и такой метод есть.

Спасибо! А этот метод, он в каком виде передает это?
Я имею ввиду помещаю я дату в поле.

Например так:
<input type="hidden" id="pdfdoc" name="pdfdoc" />

const pdfDocGenerator = pdfMake.createPdf(docDefinition);
pdfDocGenerator.getBase64((data) => {
    $('#pdfdoc').val(data); 
});

И потом это поле передаю на сервер. Потом на сервере нужно будет что-то делать, чтобы из этого собрать файл? Или это будет просто текстовая информация?

laimas 25.04.2018 18:55

Цитата:

Сообщение от the_little
А этот метод, он в каком виде передает это?

В base64. На сервере декодировать и получится файл (исходные бинарные данные его).

laimas 25.04.2018 19:14

Чего вы собираетесь делать с файлом этим на сервере, да и вообще нафига он нужен, но почтой файл передается как раз в base64 (Content-Transfer-Encoding:base64), то есть переданный таким образом файл и декодировать не нужно будет, если он только для отправления почты. Его нужно будет только разбить на строки, в РНР это функция chunk_split.

the_little 25.04.2018 20:11

Думаю сейчас разберусь. Другой вопрос вылез.

Сейчас написано так.

function changeFunc() {
//Тут идет функция, в которой происходят все расчеты.
// Поскольку при формировании pdf используются данные расчетов, то формирование переменной для дальнейшего формирования pdf происходит в этой же функции.
var docInfo = { // Тут контент и настройки файла };
};
$('#printfile').click(function() {
			pdfMake.createPdf(docInfo).print('name.pdf');
		});

Дальше есть кнопка "Распечатать". По идее при клике на кнопку нужно сделать
pdfMake.createPdf(docInfo).print('name.pdf');

Но переменная docInfo получается не определена...

МОжно конечно сделать еще одну функцию 2 в одном (расчеты + печать файла) и повесить ее на клик по кнопке "Распечатать".

Но по сути должна быть еще одна функция, которая должна висеть на событии submit, формировать файл pdf и передавать в инпут содержимое файла.

Это получается третий дубль одной и тоже функции с расчетами.
Что-то не правильно...

Как можно задать
pdfMake.createPdf(docInfo).print('name.pdf');
Вне функции, в которой формируется var docInfo?

laimas 25.04.2018 20:34

Не знаю, у меня эта приблуда только в закладках браузера, реально же не использовал ни разу, ибо то, что действительно нужно когда-то готовить как PDF (презентации и прочие доки), все это готовится на сервере. Мне надо потратить немного времени, чтобы "пощупать" эту приблуду.

Ваш калькулятор, судя по данным, прост как валенок :) , неужели нельзя было результат расчета организовать как таблицу, которую распечатать то ведь не так и сложно, более того, можно даже в отдельном окне, запросив сервер, который вернет все в каком-то "шикарном шаблоне" для печати, или использовать meda print? Неужели рационально отсылать почтой какой-то файл, вместо того, чтобы отправить обычное почтовое html сообщение?

Я ничего не имею против, охота пуще неволи, но когда вместо пользы геморрой, я этого не понимаю. ;)

the_little 25.04.2018 22:20

Цитата:

Сообщение от laimas (Сообщение 484078)
Не знаю, у меня эта приблуда только в закладках браузера, реально же не использовал ни разу, ибо то, что действительно нужно когда-то готовить как PDF (презентации и прочие доки), все это готовится на сервере. Мне надо потратить немного времени, чтобы "пощупать" эту приблуду.

Ваш калькулятор, судя по данным, прост как валенок :) , неужели нельзя было результат расчета организовать как таблицу, которую распечатать то ведь не так и сложно, более того, можно даже в отдельном окне, запросив сервер, который вернет все в каком-то "шикарном шаблоне" для печати, или использовать meda print? Неужели рационально отсылать почтой какой-то файл, вместо того, чтобы отправить обычное почтовое html сообщение?

Я ничего не имею против, охота пуще неволи, но когда вместо пользы геморрой, я этого не понимаю. ;)

к сожалению, задача есть задача. Даже если она неадекватная, приходится решать. Я тоже не вижу никакого смысла передавать файл. Администратору в любом случае достаточно текстовой инфы, а клиенту нафиг этот файл не нужен, поскольку есть кнопка печать, или можно просто этот файл скачать...

Мне просто интересно, можно ли получить данные переменной, которая задана внутри функции, извне этой самой функции. Вот в чем вопрос) Простым способом она получается НЕОПРЕДЕЛЕНА

the_little 25.04.2018 22:37

Разобрался...
Оказывается это делается очень просто)) Я про передачу переменной из одной функции в другую...

function changeFunc(){
    var docInfo = хххххххх;
    return docInfo;
 }
$('#printfile').click(function() {
	var docInfo = changeFunc();
	pdfMake.createPdf(docInfo).print('name.pdf');
});


Теперь расчеты в одном экземпляре, все остальное отдельными функциями.


Часовой пояс GMT +3, время: 10:29.