我已经创建了一个Web应用程序,它将PDF文件发送到SQL数据库表,以便稍后加载并通过邮箱发送.目前,我的代码工作,PDF文件是通过邮箱发送的,然而,一旦打开PDF,所有显示如预期,除了背景图像,这不再出现在PDF上.现在我不明白的是,如果我在发送到数据库之前使用‘IFormFile’,PDF文件在通过邮箱发送时会正确显示,并包含其背景图像.使我认为我一定是错误地将PDF文件转换为二进制格式或从二进制格式转换为PDF文件?

请查看我当前的代码:

到控制器的JavaScript AJAX: ajax

if(email) {
   var file = doc.output('blob');
   var fd = new FormData();
   fd.append('pdfFile',file);
   fd.append('jobNo',$('#jobNoInput').val());
   $.ajax({
       url: "/Jobs/SendInvoiceEmailToQueue",
       data: fd,
       dataType: 'text',
       processData: false,
       contentType: false,
       type: 'POST',
       success: function(data) {
           var data2 = JSON.parse(data);
           if(data2 == "SUCCESS")
           {
               quickToast('Invoice added to Email Queue for Job 
No: ' + $('#jobNoInput').val(), 'success', 'Added to Email Queue');
           }
       }
   });
} else {
   doc.save('Invoice.pdf');
}

将PDF上传到数据库: upload pdf to database

public IActionResult SendInvoiceEmailToQueue(string jobNo)
{
var stream = Request.BodyReader.AsStream();
IFormFile pdfFile = Request.Form.Files[0];

string fileName = pdfFile.FileName;

var result = new StringBuilder();
using (var reader = new StreamReader(pdfFile.OpenReadStream()))
{
    result.Append(reader.ReadToEnd());
}

string base64 = result.ToString();
Byte[] bitmapData = new Byte[base64.Length];

var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(base64);

connectionString();
con.Open();
com.Connection = con;

var query = "INSERT INTO dbo.email_queue([JOBNO],[PDF],[EMAILADDRESS],[DATE],[TIME]) VALUES(@jobNo, @pdf, 'address', GETDATE(), CURRENT_TIMESTAMP)";
SqlParameter picparameter = new SqlParameter();
picparameter.SqlDbType = SqlDbType.Image;
picparameter.ParameterName = "pdf";
picparameter.Value = plainTextBytes;
SqlParameter jobNoparameter = new SqlParameter();
jobNoparameter.SqlDbType = SqlDbType.Int;
jobNoparameter.ParameterName = "jobNo";
jobNoparameter.Value = Int32.Parse(jobNo);
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.Add(picparameter);
cmd.Parameters.Add(jobNoparameter);
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Close();
con.Dispose();

return new JsonResult("SUCCESS");
}

通过邮箱检索和发送PDF: enter image description here

public IActionResult SendInvoiceEmail(string queueNo)
{
    connectionString();
    con.Open();
    com.Connection = con;
    com.CommandText = "SELECT * FROM dbo.recovery_email_queue WHERE EmailQueueRecNo = '" + queueNo + "'";
    dr = com.ExecuteReader();

    while (dr.Read())
    {
        var imageSource = System.Text.Encoding.UTF8.GetString(((byte[])dr["PDF"]));
        var pdffile = (byte[])dr["PDF"];
        
        var pdfBytes = Encoding.UTF8.GetBytes(imageSource);
        var stream = new MemoryStream(pdfBytes);

        IFormFile file = new FormFile(stream, 0, pdfBytes.Length, "invoice", "invoice.pdf");

        //attach pdf
        var attachment = new Attachment(file.OpenReadStream(), "invoice.pdf");

        using (MailMessage mail = new MailMessage())
        {
            mail.From = new MailAddress("fromAdd");
            mail.To.Add("add");
            mail.Subject = "Test Sending Invoice";
            mail.Body = "<h1>This is body</h1>";
            mail.IsBodyHtml = true;

            mail.Attachments.Add(attachment);
            using (SmtpClient smtp = new SmtpClient("smtp-mail.outlook.com", 587))
            {
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtp.UseDefaultCredentials = false;
                smtp.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["emailUser"].ToString(), ConfigurationManager.AppSettings["emailPass"].ToString());
                smtp.EnableSsl = true;
                smtp.Send(mail);
            }
        }
    }

    return new JsonResult("SUCCESS");
}

数据库列‘PDF’的类型为varbinary(MAX) 使用jsPDF生成的PDF文件

推荐答案

好的,我已经设法找到了一个解决方案,问题出在我对PDF文件到二进制格式转换的理解上.我们不能在这里使用流阅读器,因为这是文本!,一旦我更改代码,直接从返回的流读取字节,一切都像预期的那样工作,图像是从数据库加载的文件中包括的.

对服务器端方法的代码更改:

public async Task<IActionResult> SendInvoiceEmailToQueue(string jobNo)
    {
        IFormFile pdfFile = Request.Form.Files[0];

        var stream = pdfFile.OpenReadStream();
        var length = (int)stream.Length;
        byte[] data = new byte[length];
        await stream.ReadAsync(buffer: data, offset: 0, count: length);....

正在从数据库读取:

while (dr.Read())
        {
            var pdffile = (byte[])dr["PDF"];
            
            var stream = new MemoryStream(pdffile);

            IFormFile file = new FormFile(stream, 0, pdffile.Length, "invoice", "invoice.pdf");

            //Attach pdf
            var attachment = new Attachment(file.OpenReadStream(), "invoice.pdf");....

Javascript相关问答推荐

使用jsPDF添加Image JPEG将p5.js草图画布下载为PDF

如何在不指定宽度和高度的情况下显示来自网址的下一张图像

用户单击仅在JavaScript中传递一次以及其他行为

如何修复内容安全策略指令脚本-SRC自身错误?

如何修复循环HTML元素附加函数中的问题?

微软Edge编辑和重新发送未显示""

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

单击ImageListItemBar的IconButton后,在Material—UI对话框中显示图像

无法检测卡片重叠状态的问题

在react JS中映射数组对象的嵌套数据

在运行时使用Next JS App Router在服务器组件中运行自定义函数

覆盖TypeScrip中的Lit-Element子类的属性类型

禁用.js文件扩展名并从目录导入隐式根index.js时,找不到NodeJS导入模块

Web Crypto API解密失败,RSA-OAEP

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

JavaScript不重定向配置的PATH

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

将基元传递给THEN处理程序

如何为仅有数据可用的点显示X轴标签?

如何组合Multer上传?