#c# #asp.net #itextsharp
#c# #asp.net #itext
Вопрос:
Я получаю следующую ошибку при нажатии кнопки,
При нажатии кнопки я вызываю следующий метод:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
/// <summary>
/// Summary description for pdfgeneration
/// </summary>
public class pdfgeneration
{
public pdfgeneration()
{
//
// TODO: Add constructor logic here
//
}
public void pdfgenerator(String name1, AjaxControlToolkit.HTMLEditor.Editor Editor1)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/pdf";
// Create PDF document
Document pdfDocument = new Document(PageSize.A4, 70, 55, 40, 25);
PdfWriter wri = PdfWriter.GetInstance(pdfDocument, new FileStream("e://" name1 ".pdf", FileMode.Create));
PdfWriter.GetInstance(pdfDocument, HttpContext.Current.Response.OutputStream);
pdfDocument.Open();
string htmlText = Editor1.Content;
System.Collections.Generic.List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null);
for (int k = 0; k < htmlarraylist.Count; k )
{
pdfDocument.Add((IElement)htmlarraylist[k]);
}
pdfDocument.Close();
HttpContext.Current.Response.End();
}
}
трассировка стека:
[FormatException: Input string was not in a correct format.]
System.Number.StringToNumber(String str, NumberStyles options, NumberBufferamp; number, NumberFormatInfo info, Boolean parseDecimal) 7471335
System.Number.ParseSingle(String value, NumberStyles options, NumberFormatInfo numfmt) 115
System.Single.Parse(String s, NumberStyles style, NumberFormatInfo info) 192
iTextSharp.text.html.simpleparser.CellWrapper..ctor(String tag, ChainedProperties chain) 148
iTextSharp.text.html.simpleparser.HTMLTagProcessor_TD.StartElement(HTMLWorker worker, String tag, IDictionary`2 attrs) 84
iTextSharp.text.html.simpleparser.HTMLWorker.StartElement(String tag, Dictionary`2 attrs) 79
iTextSharp.text.xml.simpleparser.SimpleXMLParser.ProcessTag(Boolean start) 30
iTextSharp.text.xml.simpleparser.SimpleXMLParser.Go(TextReader reader) 1008
iTextSharp.text.xml.simpleparser.SimpleXMLParser.Parse(ISimpleXMLDocHandler doc, ISimpleXMLDocHandlerComment comment, TextReader r, Boolean html) 48
iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(TextReader reader, StyleSheet style, IDictionary`2 tags, Dictionary`2 providers) 94
iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(TextReader reader, StyleSheet style) 9
pdfgeneration.pdfgenerator(String name1, Editor Editor1) in C:inetpubwwwrootdcisApp_Codepdfgeneration.cs:37
EntryForm.Button4_Click(Object sender, EventArgs e) in C:inetpubwwwrootdcisEntryForm.aspx.cs:224
System.Web.UI.WebControls.Button.OnClick(EventArgs e) 111
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 110
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 1565
Как я могу устранить эту ошибку?
@ geek за ошибку в коде, который он опубликовал
Комментарии:
1. В вашей части кода нет проблем, проблема в том, что во время вызова функции может показаться, что вы не приводите правильные аргументы при вызове функции.
2. Если я вас правильно понял, вы хотите преобразовать веб-страницу в pdf. Я прав?
3. @geek Ya я хочу преобразовать содержимое в редакторе (Ajax Control) в pdf, оно содержит HTML-текст.
4. @Ishan: Вы пробовали мое решение?
5. @geek ShowPdf() не существует в текущем контексте, возникает ошибка.
Ответ №1:
Я столкнулся с той же ошибкой, «Входная строка была не в правильном формате». Я проверяю свою html-строку и обнаружил, что, если я пишу ширину таблицы вне тега style, я получаю эту ошибку, например,:- Выдать ошибку в HTMLWorker.Метод Parse().
когда я помещаю тег width в тег style, я устраняю эту ошибку, например,
Я надеюсь, это вам немного поможет.
For eg, <table width="610px"> </table> :- Give error at htmlWorker.Parse() method.
когда я помещаю тег width в тег style, я устраняю эту ошибку,
For eg, <table style="width:610px"> </table>
Я надеюсь, это вам немного поможет.
Ответ №2:
Вы могли бы начать с сужения его в pdfgenerator
пределах… Включение символов сборки для этой библиотеки dll было бы началом, но даже некоторая простая трассировка, чтобы вы могли определить, куда она попала, когда взорвалась, помогла бы.
В конечном счете, PdfWriter
это не core .NET, поэтому вам придется помочь нам сузить поиск.
Или еще проще: нажмите «Начать отладку» и поставьте точку останова для этого метода; теперь выполните шаг и посмотрите a: где он взрывается, и b: каковы значения ключа в этой точке.
Ответ №3:
Похоже, что вы получили значение нечислового стиля, где iTextSharp ожидает число. «размер шрифта: обычный» или что-то в этом роде.
CellWrapper(String, ChainedProperties)
просматривает HtmlTags.WIDTH
. Вот источник из iTextSharp 5.0.6:
public CellWrapper(String tag, ChainedProperties chain) {
this.cell = CreatePdfPCell(tag, chain);
String value = chain[HtmlTags.WIDTH];
if (value != null) {
value = value.Trim();
if (value.EndsWith("%")) {
percentage = true;
value = value.Substring(0, value.Length - 1);
}
width = float.Parse(value, CultureInfo.InvariantCulture);
}
}
Это ужасно похоже на то, что проблема в float.Вызов Parse(). Похоже, что этот код не может обрабатывать ничего, кроме ‘%’ или нулевого числа. Если ваша ширина определена в ‘cm’, ‘px’ или что-то еще, это вполне может быть проблемой.
Используйте исходный код!
PS: Какую версию вы используете? IIRC, iText уже довольно давно поставляется с отладочной информацией. Если все остальное не удается, просто создайте отладочную версию самостоятельно.
Ответ №4:
У меня была та же проблема, что и у вас, и я нашел другое решение.
Эта ошибка возникает при попытке проанализировать размер с частью «px». Чтобы решить эту проблему, просто замените вхождения HTML-строки «px» на «». Он все еще знает, что это пиксели.
Надеюсь, это сработает в вашем случае!
Ответ №5:
попробуйте это
public void CreatePDFDocument(string strHtml)
{
string strFileName = HttpContext.Current.Server.MapPath("test.pdf");
// step 1: creation of a document-object
Document document = new Document();
// step 2:
// we create a writer that listens to the document
PdfWriter.GetInstance(document, new FileStream(strFileName, FileMode.Create));
StringReader se = new StringReader(strHtml);
HTMLWorker obj = new HTMLWorker(document);
document.Open();
obj.Parse(se);
document.Close();
ShowPdf(strFileName);
}
public void ShowPdf(string strFileName)
{
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "inline;filename=" strFileName);
Response.ContentType = "application/pdf";
Response.WriteFile(strFileName);
Response.Flush();
Response.Clear();
}
Комментарии:
1. Пожалуйста, проверьте мой первоначальный вопрос на наличие ошибки в приведенном выше коде.