【问题标题】:Convert HTML to a string将 HTML 转换为字符串
【发布时间】:2011-04-05 20:30:17
【问题描述】:

我有一个字符串编写器函数,它捕获 HTMl 并作为字符串返回。例如

"\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\" >\r\n<head>\r\n <link rel=\"Stylesheet\" href=\"../../Content/style.css\" type=\"text/css\" />\r\n <title>Cover Page</title>\r\n <style type=\"text/css\">\r\n html, body\r\n {\r\n\t font-family: Arial, Helvetica, sans-serif;\r\n\t font-size: 13pt;\r\n\t padding: 0px;\r\n\t margin: 0px;\r\n\t background-color: #FFFFFF;\r\n\t color: black;\r\n\t width: 680px;\r\n }\r\n </style>\r\n</head>\r\n<body>\r\n <div>\r\n Ssotest Ssotest, \r\n </div> \r\n</body>\r\n</html>\r\n"

当我将它传递给 PDF 生成工具时,它会引发错误。但是当我从 VS2010 的 Locals 窗口复制字符串编写器的输出(上面相同的 HTML 字符串“)并像硬编码一样

 string test ="\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\" >\r\n<head>\r\n    <link rel=\"Stylesheet\" href=\"../../Content/style.css\" type=\"text/css\" />\r\n    <title>Cover Page</title>\r\n    <style type=\"text/css\">\r\n        html, body\r\n        {\r\n\t        font-family: Arial, Helvetica, sans-serif;\r\n\t        font-size: 13pt;\r\n\t        padding: 0px;\r\n\t        margin: 0px;\r\n\t        background-color: #FFFFFF;\r\n\t        color: black;\r\n\t        width: 680px;\r\n        }\r\n    </style>\r\n</head>\r\n<body>\r\n    <div>\r\n        Ssotest Ssotest, \r\n    </div> \r\n</body>\r\n</html>\r\n"

并传递给它工作正常的工具。在这两种情况下,字符串是相同的。我想知道有什么区别?当我复制文本和硬编码时,有什么东西被转换了吗?有什么建议吗??

只是更新.. 我用这段代码格式化

 public class ReplaceString
        {
            static readonly IDictionary<string, string> m_replaceDict
                = new Dictionary<string, string>();

            const string ms_regexEscapes = @"[\a\b\f\n\r\t\v\\""]";

            public static string StringLiteral(string i_string)
            {
                return Regex.Replace(i_string, ms_regexEscapes, match);
            }

            public static string CharLiteral(char c)
            {
                return c == '\'' ? @"'\''" : string.Format("'{0}'", c);
            }

            private static string match(Match m)
            {
                string match = m.ToString();
                if (m_replaceDict.ContainsKey(match))
                {
                    return m_replaceDict[match];
                }

                throw new NotSupportedException();
            }

            static ReplaceString()
            {
                m_replaceDict.Add("\a", @"\a");
                m_replaceDict.Add("\b", @"\b");
                m_replaceDict.Add("\f", @"\f");
                m_replaceDict.Add("\n", @"\n");
                m_replaceDict.Add("\r", @"\r");
                m_replaceDict.Add("\t", @"\t");
                m_replaceDict.Add("\v", @"\v");

                m_replaceDict.Add("\\", @"\\");
                m_replaceDict.Add("\0", @"\0");

                //The SO parser gets fooled by the verbatim version 
                //of the string to replace - @"\"""
                //so use the 'regular' version
                m_replaceDict.Add("\"", "\\\"");
            }

            static void Main(string[] args)
            {

                string s = "here's a \"\n\tstring\" to test";
                Console.WriteLine(ReplaceString.StringLiteral(s));
                Console.WriteLine(ReplaceString.CharLiteral('c'));
                Console.WriteLine(ReplaceString.CharLiteral('\''));

            }
        }

但是字符串会像这样返回

\\r\\n\\r\\n<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\" \\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\\r\\n\\r\\n<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\" >\\r\\n<head>\\r\\n    <link rel=\\\"Stylesheet\\\...."

这很有意义.. 我正在使用的 PDF 生成器的代码

string test="\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\" >\r\n<head>\r\n <link rel=\"Stylesheet\" href=\"../../Content/style.css\" type=\"text/css\" />\r\n <title>Cover Page</title>\r\n <style type=\"text/css\">\r\n html, body\r\n {\r\n\t font-family: Arial, Helvetica, sans-serif;\r\n\t font-size: 13pt;\r\n\t padding: 0px;\r\n\t margin: 0px;\r\n\t background-color: #FFFFFF;\r\n\t color: black;\r\n\t width: 680px;\r\n }\r\n </style>\r\n</head>\r\n<body>\r\n <div>\r\n Ssotest Ssotest, \r\n </div> \r\n</body>\r\n</html>\r\n"

           FileStreamResponseContext response = new FileStreamResponseContext();
 Document doc = new Document();
            doc.DocumentInformation.CreationDate = DateTime.Now;
            doc.DocumentInformation.Title = "Test Plan";
            doc.DocumentInformation.Subject = "Test Plan";
            doc.CompressionLevel = CompressionLevel.NormalCompression;
            doc.Margins = new Margins(0, 0, 0, 0);
            doc.Security.CanPrint = true;
            doc.ViewerPreferences.HideToolbar = false;
            doc.ViewerPreferences.FitWindow = false;

string baseUrl = String.Format("http://localhost{0}/", Request.Url.Port == 80?"":":" + Request.Url.Port.ToString());

PdfPage docTestPlan = doc.AddPage(PageSize.Letter, new Margins(0, 0, 0, 0), PageOrientation.Portrait);
// passing the string test returned from the string writer

   HtmlToPdfElement htmlToPdf = new HtmlToPdfElement(test, baseUrl);
            htmlToPdf.FitWidth = false;
            docTestPlan.AddElement(htmlToPdf);



            /******************************************
             * put doc in a memory stream for return */
            response.FileDataStream = new MemoryStream();
            doc.Save(response.FileDataStream);
            doc.Close();
            response.FileDataStream.Position = 0;

            return new FileStreamResult(response.FileDataStream, "application/pdf");

【问题讨论】:

  • 发布您的字符串编写器使用的一些代码...
  • 字符串中的实际内容是什么?真正的换行符和制表符,还是转义字符?
  • 错误提示 PDF 不以 %PDF 开头-
  • 在字符串中是真正的换行符和制表符。当我在 VS2010 上使用 HTML 可视化工具时,我可以通过将鼠标放在从字符串编写器获得的字符串上来查看完整的 HTML 内容。

标签: html asp.net-mvc c#-4.0


【解决方案1】:

不确定您正在使用的软件,但在我看来,您将字符串放入引号中的某些编程上下文中的东西正在被转义。

因此,当该工具获取您的原始复制输入时,它会看到:\"

但是当它从编程上下文中获取它时,它只会看到:"

【讨论】:

  • 我正在使用 winnovative pdf 生成器.. 你的回复很有道理.. 有没有办法添加转义序列!!?比如将所有“转换为\”。
  • 当我尝试按照您所说的进行操作时,文本 \" 变为 "\"\,这表示我从编程上下文中获得的字符串本身具有 \"。
【解决方案2】:

经过长时间的挣扎,我找到了原因。导致该错误的原因是当从编程上下文传递字符串时,它会不断添加到System.Web.HttpResponseBase Response 对象。当我通过硬编码直接传递字符串时,它不会再弄乱了 System.Web.HttpResponseBase Response 对象。所以最终的解决方案是添加一段代码Response.clear();,它会清除之前所有的 Response 对象。现在它工作正常。谢谢大家的建议。干杯!!

【讨论】:

    【解决方案3】:

    我不确定您是否将值正确传递给 PDF API。您也可以使用该代码进行更新吗?

    编辑:您不应该返回文档本身吗?那会有标题信息而不是流不会吗?

    HTML 字符串示例:

    StringWriter sw = new StringWriter();
            Server.Execute("PageToConvert.aspx", sw);
            string htmlCodeToConvert = sw.GetStringBuilder().ToString();
    

    【讨论】:

    • 我认为您没有正确使用 PDF 方法。没有设置PDF标题的电话吗?你用的是什么PDF生成工具?
    • 我正在使用 winnovative PDF 生成工具。我猜该工具工作正常。我这么说的原因是当我对 HTML 字符串进行硬编码时,它可以正常工作,但当我从编程上下文传递时,它就无法正常工作。
    • 在您将字符串传递给 PDF api 时发布代码
    • 如果您刚刚发布的代码的输出在您手动分配时有效,则它必须是您实际构建 PDF 对象的方式。那个代码在哪里?
    • 不,实际上我是在 MVC 2.0 中捕获控制器动作。如果您关注我的这篇文章stackoverflow.com/questions/5553674/…,您会有所了解
    【解决方案4】:

    protected void btnExport_Click(object sender, EventArgs e) { HtmlForm 表单 = 新 HtmlForm(); // form.Controls.Add(GridView1); StringWriter sw = new StringWriter(); HtmlTextWriter hTextWriter = new HtmlTextWriter(sw); //form.Controls[0].RenderControl(hTextWriter); 字符串 htmlDisplayText = @"




    亲爱的 bishnu2

    您的地址 pdp 是

    模式的早期版本在 PLoP 上进行了研讨会 经过多次内部研讨会和更新,之后的版本是

    在 PLoP 进行过培训 模式现在已经足够成熟,我可以根据 AG Communication 的模式教授一门课程

    系统。
                        版权所有 © 1999 AG Communication Systems Corporation

    "; // 字符串 htmlDisplayText = sw.ToString(); 文档文档 = 新文档();
        //PdfWriter.GetInstance
        //(Doc, new FileStream(Request.PhysicalApplicationPath 
        //+ "\\AmitJain.pdf", FileMode.Create));
    
        PdfWriter.GetInstance(Doc, new FileStream(Environment.GetFolderPath
        (Environment.SpecialFolder.Desktop)+ "\\AmitJain.pdf", FileMode.Create));
        Doc.Open();
    
    
    
        System.Xml.XmlTextReader xmlReader = 
        new System.Xml.XmlTextReader(new StringReader(htmlDisplayText));
        HtmlParser.Parse(Doc, xmlReader);
    
        Doc.Close();
        string Path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+ "\\AmitJain.pdf";
    
    
    
        ShowPdf(Path);
    
    
    }
    
    private void ShowPdf(string strS)
    {
        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition","attachment; filename=" + strS);
        Response.TransmitFile(strS);
        Response.End();
        //Response.WriteFile(strS);
        Response.Flush();
        Response.Clear();
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 2011-03-09
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多