Конвертировать HTML в строку - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть функция записи строки, которая захватывает 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, он выдает ошибку. Но когда я копирую вывод средства записи String (та же строка HTML выше")из окна Locals в VS2010 и жестко закодируйте его как

 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");

Ответы [ 4 ]

0 голосов
/ 17 мая 2011

защищенный void btnExport_Click (отправитель объекта, EventArgs e) {HtmlForm form = new HtmlForm ();// form.Controls.Add (GridView1);StringWriter sw = new StringWriter ();HtmlTextWriter hTextWriter = new HtmlTextWriter (sw);//form.Controls[0].RenderControl(hTextWriter);строка htmlDisplayText = @ "

Уважаемый bishnu2

Ваш адрес pdp равен

Ранняя версия шаблонов была обработана в PLoP. После нескольких внутренних семинаров и обновлений более поздняя версия была

* 1010.* Workshop в PLoP. Шаблоны теперь достаточно развиты, поэтому я преподаю класс, основанный на шаблонах в AG Communication

Systems.Copyright © 1999 AG Communication Systems Corporation

"; // string htmlDisplayText = sw.ToString (); Документ Doc = новый документ ();
    //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();

}
0 голосов
/ 06 апреля 2011

Я не уверен, что вы правильно передали значение в PDF API. Вы можете обновить с этим кодом тоже.

РЕДАКТИРОВАТЬ: Разве вы не должны возвращать сам документ? Это будет иметь информацию заголовка, а не поток, не так ли?

ПРИМЕР HTML STRING:

StringWriter sw = new StringWriter();
        Server.Execute("PageToConvert.aspx", sw);
        string htmlCodeToConvert = sw.GetStringBuilder().ToString();
0 голосов
/ 06 апреля 2011

После долгой борьбы я нашел причину. Ошибка вызвана тем, что когда строка передается из контекста программирования, она продолжает добавлять объект System.Web.HttpResponseBase Response. когда я передаю строку напрямую с помощью жесткого кодирования, она больше не связывается с System.Web.HttpResponseBase Response объект. Таким образом, окончательное решение заключается в добавлении куска кода Response.clear();, который очищает все предыдущие объекты Response. Теперь работает нормально. Спасибо всем за ваши предложения. ура !!

0 голосов
/ 06 апреля 2011

Не уверен насчет программного обеспечения, которое вы используете, но мне кажется, что вы помещаете строку в кавычки в каком-то программном контексте, где экранируются вещи.

Так что, когда инструмент получает исходный скопированный ввод, он видит: \"

Но когда он получает его из контекста программирования, он просто видит: "

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