如何使用 asp.net c# 将使用 jsPDF 生成的 PDF 附加到邮件中
How to attach a PDF generated using jsPDF to the mail using asp.net c#
我想知道是否有任何方法可以附加使用 jsPDF 生成的 PDF 文件并在 asp.net C# 中邮寄?
我在 c# 中有以下代码
MailMessage message = new MailMessage(fromAddress, toAddress);
message.Subject = subject;
message.IsBodyHtml = true;
message.Body = StrContent.ToString();
//message.Attachments.Add(new Attachment("getDPF()"));
smtp.Send(message);
我正在使用 JsPDF 库,如下所示:
<script type="text/javascript" src="jsPdf/jspdf.min.js"></script>
<script type="text/javascript">
function getPDF()
{
var doc = new jsPDF();
doc.text(20, 20, 'TEST Message');
doc.addPage();
//doc.save('volt.pdf');
}
</script>
有没有办法在发送前附在邮件中?
提前致谢。
您不能从服务器代码 (c#) 调用客户端代码(Javascript 函数)。
您只能通过 (HTTP/HTTPs) 协议进行通信。
我认为您需要从客户端生成 PDF,然后将该 PDF 发送到服务器,以便您可以将 PDF 附加到电子邮件中。
在这种情况下,您需要先生成 PDF 并将其作为 base64 字符串发送到服务器。
然后您可以在 C# 中将 base64 字符串转换为 PDF 并将其作为附件发送。
客户端:
function generatePdf() {
var doc = new jsPdf();
doc.text("jsPDF to Mail", 40, 30);
var binary = doc.output();
return binary ? btoa(binary) : "";
}
正在将 base64 pdf 内容发布到服务器:
var reqData = generatePdf();
$.ajax({
url:url,
data: JSON.stringify({data:reqData}),
dataType: "json",
type: "POST",
contentType: "application/json; charset=utf-8",
success:function(){}
});
在服务器上(MVC 控制器):
public ActionResult YourMethod(string data)
{
//create pdf
var pdfBinary = Convert.FromBase64String(data);
var dir = Server.MapPath("~/DataDump");
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
var fileName = dir + "\PDFnMail-" + DateTime.Now.ToString("yyyyMMdd-HHMMss") + ".pdf";
// write content to the pdf
using (var fs = new FileStream(fileName, FileMode.Create))
using (var writer = new BinaryWriter(fs))
{
writer.Write(pdfBinary, 0, pdfBinary.Length);
writer.Close();
}
//Mail the pdf and delete it
// .... call mail method here
return null;
}
您的代码示例使用 pdf.text()
,但在大多数情况下,您希望导出包含 table(s) 或图像的 html 页面。最新版本的jsPDF html PlugIn 而不是addHtml()
。下面是使用 jsPDF html()
和 Web API.
的代码示例
客户端:
function emailHtml() {
let pdf = new jsPDF('p', 'pt', 'a3'); // a4: part of the page is cut off?
pdf.html(document.body, {
callback: function (pdf) {
let obj = {};
obj.pdfContent = pdf.output('datauristring');
var jsonData = JSON.stringify(obj);
$.ajax({
url: '/api/jspdf/html2pdf',
type: 'POST',
contentType: 'application/json',
data: jsonData
});
}
});
}
请注意,从 pdf.html
返回的 datauristring
在字符串 filename=generated.pdf;
中添加了一个文件名。此外,SmtpClient 是 obsolete, consider to use MailKit。
[Route("[action]")]
[HttpPost]
public void Html2Pdf([FromBody] JObject jObject)
{
dynamic obj = jObject;
try
{
string strJson = obj.pdfContent;
var match = Regex.Match(strJson, @"data:application/pdf;filename=generated.pdf;base64,(?<data>.+)");
var base64Data = match.Groups["data"].Value;
var binData = Convert.FromBase64String(base64Data);
using (var memoryStream = new MemoryStream())
{
var mail = new MailMessage
{
From = new MailAddress("[FromEmail]")
};
mail.To.Add("");
mail.Subject = "";
mail.Body = "attached";
mail.IsBodyHtml = true;
mail.Attachments.Add(new Attachment(new MemoryStream(binData), "htmlToPdf.pdf"));
var SmtpServer = new SmtpClient("[smtp]")
{
Port = 25,
Credentials = new NetworkCredential("[FromEmail]", "password"),
EnableSsl = true
};
SmtpServer.Send(mail);
}
}
catch (Exception ex)
{
throw;
}
}
我想知道是否有任何方法可以附加使用 jsPDF 生成的 PDF 文件并在 asp.net C# 中邮寄?
我在 c# 中有以下代码
MailMessage message = new MailMessage(fromAddress, toAddress);
message.Subject = subject;
message.IsBodyHtml = true;
message.Body = StrContent.ToString();
//message.Attachments.Add(new Attachment("getDPF()"));
smtp.Send(message);
我正在使用 JsPDF 库,如下所示:
<script type="text/javascript" src="jsPdf/jspdf.min.js"></script>
<script type="text/javascript">
function getPDF()
{
var doc = new jsPDF();
doc.text(20, 20, 'TEST Message');
doc.addPage();
//doc.save('volt.pdf');
}
</script>
有没有办法在发送前附在邮件中? 提前致谢。
您不能从服务器代码 (c#) 调用客户端代码(Javascript 函数)。 您只能通过 (HTTP/HTTPs) 协议进行通信。
我认为您需要从客户端生成 PDF,然后将该 PDF 发送到服务器,以便您可以将 PDF 附加到电子邮件中。
在这种情况下,您需要先生成 PDF 并将其作为 base64 字符串发送到服务器。
然后您可以在 C# 中将 base64 字符串转换为 PDF 并将其作为附件发送。
客户端:
function generatePdf() {
var doc = new jsPdf();
doc.text("jsPDF to Mail", 40, 30);
var binary = doc.output();
return binary ? btoa(binary) : "";
}
正在将 base64 pdf 内容发布到服务器:
var reqData = generatePdf();
$.ajax({
url:url,
data: JSON.stringify({data:reqData}),
dataType: "json",
type: "POST",
contentType: "application/json; charset=utf-8",
success:function(){}
});
在服务器上(MVC 控制器):
public ActionResult YourMethod(string data)
{
//create pdf
var pdfBinary = Convert.FromBase64String(data);
var dir = Server.MapPath("~/DataDump");
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
var fileName = dir + "\PDFnMail-" + DateTime.Now.ToString("yyyyMMdd-HHMMss") + ".pdf";
// write content to the pdf
using (var fs = new FileStream(fileName, FileMode.Create))
using (var writer = new BinaryWriter(fs))
{
writer.Write(pdfBinary, 0, pdfBinary.Length);
writer.Close();
}
//Mail the pdf and delete it
// .... call mail method here
return null;
}
您的代码示例使用 pdf.text()
,但在大多数情况下,您希望导出包含 table(s) 或图像的 html 页面。最新版本的jsPDF html PlugIn 而不是addHtml()
。下面是使用 jsPDF html()
和 Web API.
客户端:
function emailHtml() {
let pdf = new jsPDF('p', 'pt', 'a3'); // a4: part of the page is cut off?
pdf.html(document.body, {
callback: function (pdf) {
let obj = {};
obj.pdfContent = pdf.output('datauristring');
var jsonData = JSON.stringify(obj);
$.ajax({
url: '/api/jspdf/html2pdf',
type: 'POST',
contentType: 'application/json',
data: jsonData
});
}
});
}
请注意,从 pdf.html
返回的 datauristring
在字符串 filename=generated.pdf;
中添加了一个文件名。此外,SmtpClient 是 obsolete, consider to use MailKit。
[Route("[action]")]
[HttpPost]
public void Html2Pdf([FromBody] JObject jObject)
{
dynamic obj = jObject;
try
{
string strJson = obj.pdfContent;
var match = Regex.Match(strJson, @"data:application/pdf;filename=generated.pdf;base64,(?<data>.+)");
var base64Data = match.Groups["data"].Value;
var binData = Convert.FromBase64String(base64Data);
using (var memoryStream = new MemoryStream())
{
var mail = new MailMessage
{
From = new MailAddress("[FromEmail]")
};
mail.To.Add("");
mail.Subject = "";
mail.Body = "attached";
mail.IsBodyHtml = true;
mail.Attachments.Add(new Attachment(new MemoryStream(binData), "htmlToPdf.pdf"));
var SmtpServer = new SmtpClient("[smtp]")
{
Port = 25,
Credentials = new NetworkCredential("[FromEmail]", "password"),
EnableSsl = true
};
SmtpServer.Send(mail);
}
}
catch (Exception ex)
{
throw;
}
}