#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.