如何使用asp.net C#将pdf生成的文件保存到项目文件夹?

问题描述

我已经从 html 生成一个 pdf 文件,现在我需要将它保存到我的项目中的一个文件夹中。

我可以将生成的 pdf 下载到本地,但是当我将其发送到文件夹时,它会损坏并且无法打开。

    public void CreateHTML(ComplaintIntakeData cd)
{
  string formHtml = "<table class=\"Msonormal\">";
  string complaintTypeHtml = PCSUtilities.GetComplaintTypeHTML(cd);
  string providerHtml = "";
  if (cd.Providers != null && cd.Providers.Count > 0)
  {
      providerHtml = PCSUtilities.GetProviderHTML(cd);
  }
        string facilityHtml = PCSUtilities.GetFacilityHTML(cd);
        string anonymousHtml = PCSUtilities.GetAnonymousHTML(cd);
        string contactHtml = PCSUtilities.GetContactHTML(cd);
        string patientHtml = PCSUtilities.GetPatientHTML(cd);
        string detailsHtml = PCSUtilities.GetComplaintDetailsHTML(cd);
        formHtml = formHtml + complaintTypeHtml + providerHtml + facilityHtml + anonymousHtml + contactHtml + patientHtml + detailsHtml + "</table>";
        formHtml = formHtml.Replace("''","\"");
        // Load HTML template for letter and replace template fields with provider data
        string htmlContent = File.ReadAllText(Server.MapPath("~/ComplaintIntakeForm.html"));
        htmlContent = htmlContent.Replace("&lt;%Complaintinformation%&gt;",formHtml);
        string fileName = "ComplaintIntakeFile_" + cd.ComplaintGuid.ToString() +".pdf";
        using (MemoryStream memStream = new MemoryStream())
        {
            try
            {
                // Load up a new PDF doc.
                iTextSharp.text.Document pdfDoc = new iTextSharp.text.Document(PageSize.LETTER);

                PdfWriter writer = PdfWriter.GetInstance(pdfDoc,memStream);

                // writer.CompressionLevel = PdfStream.NO_COMPRESSION;

                // Make document tagged PDFVERSION_1_7 
                writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_7);
                writer.SetTagged();

                // Set document Metadata
                writer.ViewerPreferences = PdfWriter.displayDocTitle;
                pdfDoc.AddLanguage("en-US");
                pdfDoc.AddTitle("Complaint Intake Form");
                writer.CreateXmpMetadata();

                pdfDoc.open();

                var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
                //tagProcessors.RemoveProcessor(HTML.Tag.IMG);
                //tagProcessors.AddProcessor(HTML.Tag.IMG,new CustomImageTagProcessor());

                var cssFiles = new CssFilesImpl();
                cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
                var cssResolver = new StyleAttrCSSResolver(cssFiles);
                var charset = Encoding.UTF8;
                var context = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
                context.SetAcceptUnkNown(true).AutoBookmark(true).SetTagFactory(tagProcessors);
                var htmlPipeline = new HtmlPipeline(context,new PdfWriterPipeline(pdfDoc,writer));
                var csspipeline = new CssResolverPipeline(cssResolver,htmlPipeline);
                var worker = new XMLWorker(csspipeline,true);
                var xmlParser = new XMLParser(true,worker,charset);

                try
                {
                    using (var sr = new StringReader(htmlContent))
                    {
                        xmlParser.Parse(sr);
                       // xmlParser.Flush();

                    }
                }
                catch (Exception e)
                {
                    Response.Write(e.Message);
                }
                
                pdfDoc.Close();

                //writer.Close();
                ///this creates a pdf download.
                Response.ContentType = "application/pdf";
                response.addheader("content-disposition","attachment; filename=" + fileName);
                Response.OutputStream.Write(memStream.GetBuffer(),memStream.GetBuffer().Length);
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("The following error occurred:\n" + ex.ToString());
            }

        }
}

当我添加以下内容创建文件时。文件已创建,但已损坏,无法以 pdf 格式打开

using (FileStream file = new FileStream(Server.MapPath("~/tempFiles/") + fileName,FileMode.CreateNew))
                {
                    byte[] bytes = new byte[memStream.Length];
                    memStream.Read(bytes,memStream.Length);
                    file.Write(bytes,bytes.Length);
                }

解决方法

我认为这个答案是相关的:

Copy MemoryStream to FileStream and save the file?

你的两个代码片段同时使用了 memStream 和 memString 并且没有看到上下文中的所有代码,我猜。假设 memStream 是一个包含 PDF 内容的 Stream,您可以将其写入这样的文件:

using (FileStream file = new FileStream(Server.MapPath("~/tempFiles/") + fileName,FileMode.CreateNew))
{
    memStream.Position = 0;
    memStream.CopyTo(file);
}
,

我最终将新的 FileStream 调用移动到 PdfWriter.GetInstance 方法中,以代替 memStream 变量。并且能够一起摆脱使用文件流代码。

PdfWriter writer = PdfWriter.GetInstance(pdfDoc,new FileStream(Server.MapPath(path)+"/" + fileName,FileMode.CreateNew));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...