изображение масштаба itextsharp, отправленное в виде строки

#c# #itextsharp

#c# #itext

Вопрос:

Я отправляю следующую строку

 string text = <img alt="" src="http://localhost:6666/content/userfiles/admin/images/q4.png" /><br/>
  

Для:

 public static Paragraph CreateSimpleHtmlParagraph (String text)
        {

        string fontpath = System.Web.HttpContext.Current.Server.MapPath("~/Content/");
        BaseFont bf = BaseFont.CreateFont(fontpath   "ARIALUNI.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        var f = new Font(bf, 10, Font.NORMAL);
        var p = new Paragraph
        {
            Alignment = Element.ALIGN_LEFT,
            Font = f
        };
        var styles = new StyleSheet();
        styles.LoadTagStyle(HtmlTags.SPAN, HtmlTags.FONTSIZE, "10");
        styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H);
        using (var sr = new StringReader(text))
            {
            var elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, styles);
            foreach (var e in elements)
                {
                p.Add(e);
                }
            }
        return p;
        }
  

используя:

   document.Add(CreateSimpleHtmlParagraph("<span style='font-size:10;'>"   "<b><u>"  
                  "Notes"   "</u></b>"   ":  "   "<br/><br/>"   text   "</span>"));
  

для создания PDF с использованием itextsharp это работает очень хорошо, за исключением того, что изображение слишком большое! Есть ли способ проверить, включает ли строка ширину и высоту, и если нет, добавить для масштабирования изображения?

Комментарии:

1. HTMLWorker больше не поддерживается в iTextSharp. Вместо этого используйте XML Worker.

2. Спасибо, Бруно, мне нужно обновить программу; однако сначала я пытаюсь устранить эту проблему.

Ответ №1:

Как сказал Бруно, пожалуйста, обновитесь до XMLWorker.

Что вам нужно сделать, это реализовать больше не поддерживаемый IHTMLTagProcessor интерфейс для интересующего вас HTML-тега. Вас интересует img тег, поэтому вы захотите просто использовать в основном то, что iText уже делает, но с вашей собственной логикой. К сожалению, их класс является закрытым, поэтому вы не можете просто подклассировать его, но вы можете увидеть его содержимое здесь. В итоге вы получите класс, подобный этому:

 public class MyImageTagProcessor : IHTMLTagProcessor {
    void IHTMLTagProcessor.EndElement(HTMLWorker worker, string tag) {
        //No used
    }

    void IHTMLTagProcessor.StartElement(HTMLWorker worker, string tag, IDictionary<string, string> attrs) {
        if (!attrs.ContainsKey(HtmlTags.WIDTH)) {
            //Do something special here
            attrs.Add(HtmlTags.WIDTH, "400px");
        }

        if (!attrs.ContainsKey(HtmlTags.HEIGHT)) {
            //Do something special here
            attrs.Add(HtmlTags.HEIGHT, "400px");
        }

        worker.UpdateChain(tag, attrs);
        worker.ProcessImage(worker.CreateImage(attrs), attrs);
        worker.UpdateChain(tag);
    }
}
  

Затем в вашем коде создайте Dictionary , содержащий тег, на который вы ориентируетесь, и экземпляр этого класса:

 var processors = new Dictionary<string, IHTMLTagProcessor>();
processors.Add(HtmlTags.IMG, new MyImageTagProcessor());
  

Наконец, измените свой вызов синтаксического анализа, чтобы использовать одну из перегрузок. Нам не нужен четвертый параметр (providers), поэтому мы передаем ему значение null.

 var elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, styles, processors, null);
  

Комментарии:

1. Спасибо, Крис, я постараюсь реализовать это с помощью XMLWorker.