【问题标题】:How to attach a PDF generated using jsPDF to the mail using asp.net c#如何使用asp.net c#将使用jsPDF生成的PDF附加到邮件中
【发布时间】:2016-02-17 18:32:39
【问题描述】:

我想知道是否有任何方法可以附加使用 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>

有什么方法可以在发送之前将其附加在邮件中吗? 提前致谢。

【问题讨论】:

  • 好吧,您的 JsPDF 在客户端运行,您的电子邮件代码在服务器上运行。因此,您必须获取 JsPDF 生成的 PDF 并将其传递给服务器。
  • 你知道如何将它传递给服务器吗?
  • 所有通常的方式......提交表单......通过AJAX......通过WebSockets......等。或者您可以放弃在客户端生成 PDF 的想法,而是在服务器上生成它。
  • 有没有办法通过服务器端生成它?你有什么参考吗?
  • 我们已经在您的earlier question 中介绍了这一点。不允许要求我们推荐工具或库。您的服务器端逻辑在 C# 中,所以您是否尝试过在网络上搜索“C# create PDF”?

标签: javascript c# asp.net jspdf


【解决方案1】:

您不能从服务器代码 (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; 
}

在这里查看更多信息https://github.com/Purush0th/PDFnMail

【讨论】:

    【解决方案2】:

    您的代码示例使用pdf.text(),但在大多数情况下,您希望导出带有表格或图像的 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,请考虑改用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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2017-09-21
      • 2013-06-24
      • 2015-01-04
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多