【问题标题】:itextsharp scale image sent as a string以字符串形式发送的 itextsharp 比例图像
【发布时间】:2014-07-01 08:39:31
【问题描述】:

我发送以下字符串

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>"));

使用itextsharp生成PDF,除了图片太大,效果很好!有没有办法检查字符串是否包含宽度和高度,如果没有添加来缩放图像?

【问题讨论】:

  • HTMLWorker 在 iTextSharp 中不再支持。请改用 XML Worker。
  • 谢谢布鲁诺,我需要更新程序;但是我想先解决这个问题。

标签: c# itextsharp


【解决方案1】:

正如布鲁诺所说,请升级到 XMLWorker。

您需要做的是为您感兴趣的 HTML 标记实现不再受支持的 IHTMLTagProcessor 接口。您对 img 标记感兴趣,因此您基本上只想使用 iText 已经存在的内容做,但用你自己的逻辑。不幸的是,他们的课程是私有的,所以你不能只是子类,但你可以see its contents here。你基本上会得到这样一个类:

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());

最后,更改您的解析调用以使用其中一个重载。我们不需要第四个参数(提供者),所以我们将 null 传递给它。

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

【讨论】:

  • 谢谢 Chris,我会尝试使用 XMLWorker 来实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2011-08-18
  • 2015-08-16
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多