Вопрос по xmlworker, c#, itext, html-parsing, html-agility-pack – ItextSharp Ошибка при попытке анализа HTML для преобразования PDF

12

Я использовал модуль ItextSharp, чтобы преобразовать приведенный ниже HTML в PDF-страницу.

        <div style="font-size: 18pt; font-weight: bold;">
    mma<br>mmar</div><br> <br>
    <div style="font-size: 14pt;">Click to View Pricing
    </div>
    <br>
    <div>
    <table>
    <tr><td> <a href="http://www.mma.com/fci" style="color: Blue; font-size: 10pt; text-decoration: underline;"> FCI</a>:</td> 
<td><a href="http://www.mma.com/access/?pn=78211-014" style="color: Blue; font-size: 10pt; text-decoration: underline;"> 78211-014</a></td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-009" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-009</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-006" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-006</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-007" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-007</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-003" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-003</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-005" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-005</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-008"
 style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-008</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-004" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-004</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-012" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-012</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-007LF" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-007LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-015LF" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-015LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-003LF"
 style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-003LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-009LF" 
style="color: Blue; font-size: 10pt; text-decoration:
underline;">78211-009LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-005LF" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-005LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-010LF" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-010LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-006LF"
 style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-006LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-014LF"
 style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-014LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-004LF" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-004LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-012LF"
 style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-012LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-008LF"
 style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-008LF</td></tr><tr><td></td> <td>
<a href="http://www.mma.com/access/?pn=78211-011LF" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-011LF</td></tr><tr><td></td> <td><a href="http://www.mma.com/access/?pn=78211-013LF" 
style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-013LF</td></tr><tr><td></td> <td><a href="http://www.mma.com/access/?pn=78211-010" style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-010</td></tr><tr><td></td>
<td><a href="http://www.mma.com/access/?pn=78211-015"
 style="color: Blue; font-size: 10pt; text-decoration: underline;">78211-015</td></tr><tr><td> 
<a href="http://www.mma.com/souriau" 
style="color: Blue; font-size: 10pt; text-decoration: underline;"> Souriau</a>:</td>
 <td><a href="http://www.mma.com/access/?pn=24JR124-3" style="color: Blue; font-size: 10pt; text-decoration: underline;"> 24JR124-3</a></td></tr></table></div>

Код C # для генерации HTML выше:

 var html = new StringBuilder(@"<div style=""font-size: 18pt; font-weight: bold;"">Authorized Distributor</div><br> <br><div style=""font-size: 14pt;"">Click to View Pricing, Inventory, Delivery & Lifecycle Information:</div><br>");
            List<MfrBrandView> mfrBrands = MfrBrandView.Load(fileId);
            var uniquesuppliers = mfrBrands.GroupBy(t => new {t.Manufacturer,t.SupplierVirtualDirectory}).Select(g => g.First());
            html.Append("<div><table>");
            foreach (var uniquesupplier in uniquesuppliers)
            {
                var mfrPartNums =
                    mfrBrands.Where(t => t.ManufacturerId == uniquesupplier.ManufacturerId).Select(
                        t => t.ManufacturerPartNumber).ToList();
                html.AppendFormat(@"<tr><td> <a href=""http://www.mma.com/{0}"" style=""color: Blue; font-size: 10pt; text-decoration: underline;""> {1}</a>:</td> <td><a href=""http://www.mma.com/access/?pn={2}"" style=""color: Blue; font-size: 10pt; text-decoration: underline;""> {2}</a></td></tr>", uniquesupplier.SupplierVirtualDirectory, uniquesupplier.MouserizationLabel, mfrPartNums[0]);

                for (int i = 1; i < mfrPartNums.Count(); i++)
                {
                    html.AppendFormat(
                        @"<tr><td></td> <td><a href=""http://www.mma.com/access/?pn={0}"" style=""color: Blue; font-size: 10pt; text-decoration: underline;"">{0}</td></tr>",
                        mfrPartNums[i]);
                }
            }
            html.Append("</table></div>");
            return html.ToString();

Код для генерации страницы после формирования html:

PdfWriter writer = null;
            PdfDocument doc = null;
            //PdfReader reader = new PdfReader(content);
           // reader.Info["Title"]

            try
            {
                doc = new PdfDocument();
                doc.SetPageSize(PageSize.LETTER);
                writer = PdfWriter.GetInstance(doc, content);
                writer.CloseStream = false;
                doc.Open();
                doc.NewPage();

                foreach (IElement element in iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(new StringReader(html), null))
                {
                    doc.Add(element);
                }
            }

ниже, где я получаю исключение, сказав"Unable to cast object of type 'iTextSharp.text.html.simpleparser.CellWrapper' to type 'iTextSharp.text.Paragraph'. & Quot; iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(new StringReader(html), null)

Что-то не так с html, который я пытаюсь проанализировать? Есть ли лучший способ сделать это? Большое спасибо заранее за вашу помощь. Это очень ценится.

да .... но не так, как я себе это представлял. Мне пришлось поставить все & lt; a & gt; тег в теге & lt; div & gt ;. И мне пришлось пойти на некоторые компромиссы с точки зрения того, как мне нужно мое форматирование на странице, потому что я не смог организовать все & lt; a & gt; теги в таблице по мере необходимости. karry
Можете ли вы показать нам код C #? Вы пытаетесь сделать ячейку абзацем. Только один уровень слишком высок. The Internet
это работает сейчас? The Internet
Ну, я думаю, это парсер ItextSharp, который пытается это сделать. Я не знаю, если некоторые элементы HTML не допускаются при попытке конвертировать HTML в PDF, используя Itextsharp karry
Itextsharp не нравится, что я поставил свой & lt; a & gt; теги внутри тега & lt; td & gt; теги. Похоже, это проблема. karry

Ваш Ответ

3   ответа
0

Попробуйте следующий код

    &lt;a href="http://www.abcd.com"&gt;&lt;/a&gt;

Здесь мы заменяем & lt; с&lt; и & gt; с&gt; так мой становится&lt;a&gt; и становится&lt;/a&gt;.

0

Вот шаг, что вам нужно сделать

1- Установите itext sharp и XMLWorker из Itextsharp из nuget

2-Затем поместите ваш дизайн в HTML (здесь Invoice.html) с помощью встроенного CSS

3-Убедитесь, что все теги правильно завершены, как точка останова или тд (здесь я получил ошибку ранее)

Изображение 4-здесь не будет отображаться локально, поэтому, не теряя времени, я загрузил изображение на сервер и дал серверу путь доступа к Image.U, чтобы узнать больше о его локальном запуске.

Document doc = new Document();

PdfPTable tableLayout = new PdfPTable(4);

PdfWriter writer= PdfWriter.GetInstance(doc, new FileStream(Server.MapPath("~/Admin/T13.pdf"), FileMode.Create));                 

doc.Open();

string contents = File.ReadAllText(Server.MapPath("~/Admin/invoice.html"));

StringReader sr = new StringReader(contents);


XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, sr);  

doc.Close();
23

`HTMLWorker & APOS;устарел в пользуXMLWorker, Вот рабочий пример, протестированный с фрагментом HTML, как вы использовали выше:

StringReader html = new StringReader(@"
<div style='font-size: 18pt; font-weight: bold;'>
Mouser Electronics <br />Authorized Distributor</div><br /> <br />
<div style='font-size: 14pt;'>Click to View Pricing, Inventory, Delivery & Lifecycle Information:
</div>
<br />
<div>
<table>
<tr><td></td><td>
<a href='http://www.mouser.com/access/?pn=78211-009' 
style='color: Blue; font-size: 10pt; text-decoration: underline;'>78211-009</a></td></tr>
</table></div>    
");      
using (Document document = new Document()) {
  PdfWriter writer = PdfWriter.GetInstance(document, STREAM);
  document.Open();
  XMLWorkerHelper.GetInstance().ParseXHtml(
    writer, document, html
  );
}

Когда используешьXMLWorker вам нужно использовать правильно сформированный HTML - это, в конце концов, синтаксический анализатор XML. ПримерHTML от вашего вопроса выше нет закрытия<a> или же<br> теги.HTML парсер какHtmlAgilityPack исправит эти проблемы и включит это:

<div><img src='a.gif'><br><hr></div>

в это:

<div><img src='a.gif' /><br /><hr /></div>

всего несколько строк кода:

var hDocument = new HtmlDocument()
{
    OptionWriteEmptyNodes = true,
    OptionAutoCloseOnEnd = true
};
hDocument.LoadHtml("<div><img src='a.gif'><br><hr></div>");
var closedTags  = hDocument.DocumentNode.WriteTo();

XMLWorker являетсядоступный как пакет nuget, или жекак отдельная загрузка на sourceforge.

See здесь для более продвинутого использования изXMLWorker.

Этот код успешно работал, но турецкие символы не отображаются в документе PDF. Как установить кодировку для этого кода?
XMLWorker это отдельная загрузка, но этоIS используется с iTextSharp. Таким образом, вы можете использовать свое оригинальное форматирование (<table> теги) вместо обертывания гиперссылок в<div> теги, как в приведенном выше примере кода. Я не уверен, что вы имеете в виду, используя эффективный обходной путь - если вы посмотрите на первую ссылку, которую я цитировал выше, из списка рассылки iText, он упоминает, что где-то в конце ветки 4.xx или в ветке 5.xx гиперссылки в ячейках таблицы перестали работать, и что команда разработчиков iText не планирует заниматься дальнейшим развитиемHTMLWorker.
Извините, я вас неправильно понял! Я думал, что вы говорите о совершенно другом инструменте. Я понимаю, что вы говорите. karry
Спасибо ... Это был хороший ответ! Мы не хотим отказываться от использования ITextsharp прямо сейчас. Слишком далеко в проект, чтобы сделать это. karry
Есть ли эффективный обходной путь для этого? Я делал строки и строки html для этого ... в основном помещал все 'ссылки' apos; в тегах div. Это изменяет первоначально запланированное форматирование файлов. karry

Похожие вопросы