【问题标题】:How can save pdf genrated file to project folder using asp.net C#?如何使用 asp.net C# 将 pdf 生成的文件保存到项目文件夹?
【发布时间】:2021-02-04 16:13:10
【问题描述】:

我已经从 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(), 0, 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, 0, memStream.Length);
                    file.Write(bytes, 0, bytes.Length);
                }

【问题讨论】:

    标签: c# pdf writetofile


    【解决方案1】:

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

    Copy MemoryStream to FileStream and save the file?

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

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

    【讨论】:

    • 代码的顶部是使用内存字符串将html转换为pdf的整个方法。第二部分是我尝试过但失败的部分。此解决方案给我“打开此文档时出错。文件已损坏,无法修复。”类似于这是给的
    • @robbins,我真的无法帮助诊断 PDF 生成本身的问题,但如果您在内存流中有一个有效的 PDF,上面的示例代码会将其写入磁盘。
    • response.OutStream.Write 正在本地创建一个 pdf。但是 copyTo 没有在我的项目中创建一个。
    • @robbins,如果你能发布一个完整的例子会有所帮助,上面的代码是分开的,所以我们看不到它是如何连接的。您能否创建或共享一个存储库链接或至少一个 Gist 以及您的方法的完整示例?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2013-05-15
      • 2017-02-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多