html-тег не принимается в itextsharp и текст выходит за границы - PullRequest
0 голосов
/ 08 июля 2011

Я создал таблицу с itextsharp и заполнил ее данными из моей базы данных.Все в порядке, но некоторые данные содержат html-теги , поэтому в моей таблице вместо отформатированного текста я получаю теги, а также часть текста получает за пределами границы таблицы .

enter image description here

Вот код:

PdfPTable table4 = new PdfPTable(3);
                PdfPCell cell8 = new PdfPCell(new Phrase("Protocol", new Font(FontFactory.GetFont("Helvetica", 12f, Font.BOLD, new BaseColor(0, 0, 0)))));
                cell8.BackgroundColor = new BaseColor(242, 242, 242);
                table4.AddCell(cell8);
                PdfPCell cell9 = new PdfPCell(new Phrase("Port", new Font(FontFactory.GetFont("Helvetica", 12f, Font.BOLD, new BaseColor(0, 0, 0)))));
                cell9.BackgroundColor = new BaseColor(242, 242, 242);
                table4.AddCell(cell9);
                PdfPCell cell10 = new PdfPCell(new Phrase("Service", new Font(FontFactory.GetFont("Helvetica", 12f, Font.BOLD, new BaseColor(0, 0, 0)))));
                cell10.BackgroundColor = new BaseColor(242, 242, 242);
                table4.AddCell(cell10);

                foreach (int t in myprotocol)
                {
                    table4.AddCell(t.Protocol);
                    table4.AddCell(t.Port.ToString());
                    table4.AddCell(t.Service);
                }
                document.Add(table4);

1 Ответ

1 голос
/ 08 июля 2011

Когда вы вручную добавляете контент, будь то Table, Paragraph, Chunk или что-то еще, iTextSharp всегда будет вставлять контент именно так, как он есть. Это означает, что он не анализирует HTML.

Если все, что вы хотите сделать, это удалить теги HTML, то см. Этот пост и либо используйте RegEx (нетзависимости, но некоторые крайние случаи могут сломаться) или HtmlAgilityPack (на мой взгляд, много ненужных накладных расходов) для удаления тегов.

Если вы хотите интерпретировать теги (например, выделение жирным шрифтом, когда встречается <strong>) тогда вам нужно взглянуть на объект HTMLWorker. Вот пост , в котором подробно рассказывается о нем.

РЕДАКТИРОВАТЬ

Ниже приведен пример кода, который пытается переполнить границы таблицы, но нене на моей тестовой машине.Он создает 4 строки таблицы, 3-я и 4-я из которых имеют некоторые запутанные попытки нарушить границы таблицы, но не делают этого.(Вы увидите извилистую часть, в которую я вставляю несколько возвратов, табуляции и специальные пробелы Unicode.)

(этот код должен быть выполнен полностью, а не выбран вишня, чтобы он работал правильно, и он нацелен на iTextSharp 5.1.1.0.)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Sample object that mimic's the OPs structure
        public class SampleObject
        {
            public string Protocol { get; set; }
            public int Port { get; set; }
            public string Service { get; set; }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //Create some sample data the mimics the OP's data structure and include some edge cases that could (but don't) cause things to blow up
            List<SampleObject> myprotocol = new List<SampleObject>();
            //General text
            myprotocol.Add(new SampleObject { Protocol = "Short text", Port = 80, Service = "This is a test" });
            //Long text w/ HTML
            myprotocol.Add(new SampleObject { Protocol = "Long HTML text", Port = 81, Service = string.Format("<p>{0}{0}<p>{1}Configure the database server to only allow acces to trusted systems.{0}{1}For Example, the PCI DSS standard requires you the place the database in an{0}{1}internal network zone, segregated from the DMZ.{0}</p>", "\r\n", "\t") });
            //Long text w/ spaces replaced by Unicode FEFF which is a zero-width non-breaking space
            myprotocol.Add(new SampleObject { Protocol = "Long HTML text with zero width no-break space", Port = 82, Service = string.Format("<p>{0}{0}<p>{1}Configure the database server to only allow acces to trusted systems.{0}{1}For Example, the PCI DSS standard requires you the place the database in an{0}{1}internal network zone, segregated from the DMZ.{0}</p>", "\r\n", "\t").Replace(" ", "\uFEFF") });
            //Long text w/ sapces reaplces by Unicode 0020 which is a regular non-breaking space
            myprotocol.Add(new SampleObject { Protocol = "Long HTML text with non-breaking space", Port = 83, Service = string.Format("<p>{0}{0}<p>{1}Configure the database server to only allow acces to trusted systems.{0}{1}For Example, the PCI DSS standard requires you the place the database in an{0}{1}internal network zone, segregated from the DMZ.{0}</p>", "\r\n", "\t").Replace(" ", "\u0020") });

            using (iTextSharp.text.Document Doc = new iTextSharp.text.Document(PageSize.LETTER))
            {
                using (FileStream FS = new FileStream(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TableTest.pdf"), FileMode.Create, FileAccess.Write, FileShare.Read))
                {
                    using (PdfWriter writer = PdfWriter.GetInstance(Doc, FS))
                    {
                        Doc.Open();

                        Doc.NewPage();

                        PdfPTable table4 = new PdfPTable(3);
                        table4.SetWidths(new float[] { 0.9f, 1f, 1.2f });

                        PdfPCell cell8 = new PdfPCell(new Phrase("Protocol", new iTextSharp.text.Font(FontFactory.GetFont("Helvetica", 12.0f, iTextSharp.text.Font.BOLD, new BaseColor(0, 0, 0)))));
                        cell8.BackgroundColor = new BaseColor(242, 242, 242);
                        table4.AddCell(cell8);

                        PdfPCell cell9 = new PdfPCell(new Phrase("Port", new iTextSharp.text.Font(FontFactory.GetFont("Helvetica", 12f, iTextSharp.text.Font.BOLD, new BaseColor(0, 0, 0)))));
                        cell9.BackgroundColor = new BaseColor(242, 242, 242);
                        table4.AddCell(cell9);

                        PdfPCell cell10 = new PdfPCell(new Phrase("Service", new iTextSharp.text.Font(FontFactory.GetFont("Helvetica", 12f, iTextSharp.text.Font.BOLD, new BaseColor(0, 0, 0)))));
                        cell10.BackgroundColor = new BaseColor(242, 242, 242);
                        table4.AddCell(cell10);

                        foreach (SampleObject t in myprotocol)
                        {
                            table4.AddCell(t.Protocol);
                            table4.AddCell(t.Port.ToString());
                            table4.AddCell(t.Service);
                        }

                        Doc.Add(table4);

                        Doc.Close();
                    }
                }
            }

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