отправить PDF заявление без сохранения на сервере приложений - PullRequest
2 голосов
/ 19 января 2012

Требование: Сформировать счет-фактуру в формате pdf по шаблону компании и отправить его по электронной почте.

Подход, который я использовал :

  1. Поместить шаблон компании по пути: ~ Content / InvoiceTemplate /
  2. Используя iTextsharp Pdf stamper, сгенерировал pdf, сохранил его по пути: ~ / Content / reports /
  3. В модуле электронной почты выберите файл, сгенерированный выше, и прикрепите его к электронному письму для отправки

Проблема: Каждый сгенерированный счет хранится на сервере приложений, что делает приложение день ото дня тяжелее.

Вопрос: Какой другой способ отправить сгенерированное голосом по электронной почте, не сохраняя его на сервере приложений?

Код:

    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 ]

2 голосов
/ 19 января 2012

Если PDF-файлы не слишком велики, и вы не используете ферму серверов, и у вас нет миллионов людей, генерирующих счета одновременно ..

Тогда вы всегда можете использовать MemoryStream и передавать поток памяти в службу электронной почты.

2 голосов
/ 19 января 2012

Вы можете попытаться прикрепить файл из потока памяти.Вы можете найти в Google «C # Attach file from memory stream».

Вот пример кода:

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

Или:

вложение электронной почты изMemoryStream поставляется пустым

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

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

0 голосов
/ 19 января 2012

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

это класс временного файла, который я использовал с 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..

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...