发送pdf语句而不保存在应用程序服务器上

时间:2012-01-19 17:41:32

标签: c# .net asp.net-mvc pdf-generation asp.net-4.0

要求:在公司模板上生成pdf格式的发票并通过电子邮件发送。

使用的方法

  1. 将公司模板放置在路径:~Content / InvoiceTemplate /
  2. 使用iTextsharp Pdf压模,生成pdf,将其保存在路径:〜/ Content / reports /
  3. 在电子邮件模块中,选择上面生成的文件并附加到要发送的电子邮件
  4. 问题:生成的每张发票都存储在应用服务器上,使应用程序日复一日。

    问题:在电子邮件中发送语音生成的另一种方法是什么,而不将其保存在应用服务器上?

    代码:

        public static void WriteInTemplate(List<Models.Statement> statementList)
        {
            try
            {
                string invoiceNumber = statementList.FirstOrDefault().Invoice.ToString().Trim();
    
                using (Document document = new Document())
                {
                    FileStream fileStream = new FileStream(HostingEnvironment.MapPath("~/Content/reports/" + invoiceNumber + ".pdf"), FileMode.Create);
                    using (PdfSmartCopy smartCopy = new PdfSmartCopy(document, fileStream))
                    {
                        document.Open();
    
                        int statementCounter = 0;
                        int numberOfItems = statementList.Count();
                        int remainingItems = numberOfItems;
                        int maxItemsPerPage = 17;
                        if (remainingItems > 0)
                        {
                            do
                            {
                                if (remainingItems < maxItemsPerPage)
                                    maxItemsPerPage = remainingItems;
    
    
                                PdfReader pdfReader = new PdfReader(HostingEnvironment.MapPath("~/Content/InvoiceTemplate/invoiceTemplate.pdf"));
                                using (var memoryStream = new MemoryStream())
                                {
                                    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream))
                                    {
                                        string month = null;
                                        string day = null;
                                        string year = null;
    
                                        AcroFields pdfFields = pdfStamper.AcroFields;
                                        {//billing address
                                            pdfFields.SetField("BillToCompany", statementList.FirstOrDefault().BillToCompany.ToString().Trim().ToUpper());
                                            pdfFields.SetField("BillToContact", statementList.FirstOrDefault().BillToContact.ToString().Trim().ToUpper());
                                       }
               //---------------------snip------------------------------//
               //---------------------snip------------------------------//
    
                                        }
                                        {//invoice sum up
                                            double subTotal = Convert.ToDouble(statementList.FirstOrDefault().Subtotal);
                                            pdfFields.SetField("Subtotal", statementList.FirstOrDefault().Subtotal.ToString("0.00").Trim());
    
                                            double misc = Convert.ToDouble(statementList.FirstOrDefault().Misc);
                                            pdfFields.SetField("Misc", statementList.FirstOrDefault().Misc.ToString("0.00").Trim());
    
                                            double tax = Convert.ToDouble(statementList.FirstOrDefault().Tax);
                                            pdfFields.SetField("Tax", statementList.FirstOrDefault().Tax.ToString("0.00").Trim());
    
                                        }
                                        pdfStamper.FormFlattening = true; // generate a flat PDF 
    
                                    }
                                    pdfReader = new PdfReader(memoryStream.ToArray());
                                    smartCopy.AddPage(smartCopy.GetImportedPage(pdfReader, 1));
    
                                }
                                remainingItems = remainingItems - maxItemsPerPage;
    
                            } while (remainingItems > 0);
                        }
                    }
                }
    
                emailController.CreateMessageWithAttachment(invoiceNumber);
            }
            catch (Exception e)
            {
            }
    
        }
    

3 个答案:

答案 0 :(得分:2)

您可以尝试从内存流中附加文件。您可以在Google上搜索“C#Attach file from memory stream”。

以下是一个示例代码段:

 mail.Attachments.Add(new Attachment(memoryStream, "example.txt", "text/plain"));

或者:

email attachment from the MemoryStream comes empty

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/049420de-7e93-4fcb-9920-0c1cdf4ca420/

http://www.codeproject.com/KB/IP/InMemoryMailAttachment.aspx

答案 1 :(得分:2)

如果pdf文件不是太大,并且您没有使用服务器场,并且您没有数百万人同时生成发票。

然后你总是可以使用MemoryStream并将内存流传递给你的电子邮件服务。

答案 2 :(得分:0)

您应该尝试在临时文件夹中创建文件,而不是在应用程序目录中创建文件。当您完成文件后,您应该删除它们。这样文件就不会占用驱动器上那么多空间。

这是一个临时文件类,我用iTextSharp在填写表单后导出pdf。

  sealed class TempFile : IDisposable
    {
        string path;
        public TempFile() : this(System.IO.Path.GetTempFileName()) { }

        public TempFile(string path)
        {
            if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");
            this.path = path;
        }
        public string Path
        {
            get
            {
                if (path == null) throw new ObjectDisposedException(GetType().Name);
                return path;
            }
        }
        ~TempFile() { Dispose(false); }
        public void Dispose() { Dispose(true); }
        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                GC.SuppressFinalize(this);
            }
            if (path != null)
            {
                try { File.Delete(path); }
                catch { } // best effort
                path = null;
            }
        }
    }

你应该试试

using(TempFile file = new TempFile())
{
.....= new FileStream(file.Path,.....)
//pdf form filling using iTextSharp

var arry = GetBytesArray(file.Path);
//Send Array to response and set content type to pdf..

}