【问题标题】:ITextSharp: How to get an image embedded resourceITextSharp:如何获取图像嵌入资源
【发布时间】:2013-01-03 06:19:27
【问题描述】:

我正在解析一个包含一些图像的 HTML。

这些图像作为嵌入式资源存储,而不是在文件系统中。

据我所知,我需要在 HtmlPipelineContext 中设置自定义图像提供程序,并且该提供程序需要检索图像路径或 itextsharp 图像。

问题是,有人知道我需要实现抽象图像提供程序的哪种方法吗?以及如何?

这是我的代码:

            var list = new List<string> { text };
            byte[] renderedBuffer;
            using (var outputMemoryStream = new MemoryStream())
            {
                using (
                    var pdfDocument = new Document(PageSize.A4, 30, 30, 30, 30))
                {
                    var pdfWriter = PdfWriter.GetInstance(pdfDocument, outputMemoryStream);
                    pdfWriter.CloseStream = false;
                    pdfDocument.Open();
                    HtmlPipelineContext htmlContext = new HtmlPipelineContext(new CssAppliersImpl());
                    htmlContext.SetImageProvider(new MyImageProvider());
                    htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
                    ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
                    CssResolverPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(pdfDocument, pdfWriter)));
                    XMLWorker worker = new XMLWorker(pipeline, true);
                    XMLParser p = new XMLParser(worker);
                    foreach (var htmlText in list)
                    {
                        using (var htmlViewReader = new StringReader(htmlText))
                        {
                            p.Parse(htmlViewReader);
                        }
                    }
                }

                renderedBuffer = new byte[outputMemoryStream.Position];
                outputMemoryStream.Position = 0;
                outputMemoryStream.Read(renderedBuffer, 0, renderedBuffer.Length);
            }

提前致谢。

【问题讨论】:

    标签: c# itextsharp embedded-resource


    【解决方案1】:

    似乎不支持使用自定义图像提供程序。它唯一真正支持的是更改根路径。

    但是,这是解决问题的一种方法:

    创建一个名为&lt;resimg src="{resource name}"/&gt;的新html标签,并为其编写一个自定义标签处理器。

    下面是实现:

    /// <summary>
    /// Our custom HTML Tag to add an IElement.
    /// </summary>
    public class ResourceImageHtmlTagProcessor : AbstractTagProcessor
    {
        public override IList<IElement> End(IWorkerContext ctx, Tag tag, IList<IElement> currentContent)
        {
            var src = tag.Attributes["src"];
            var bitmap = (Bitmap)Resources.ResourceManager.GetObject(src);
    
            if (bitmap == null)
                throw new RuntimeWorkerException("No resource with the name: " + src);
    
            var converter = new ImageConverter();
            var image = Image.GetInstance((byte[])converter.ConvertTo(bitmap, typeof(byte[])));
            HtmlPipelineContext htmlPipelineContext = this.GetHtmlPipelineContext(ctx);
            return new List<IElement>(1)
                {
                    this.GetCssAppliers().Apply(
                        new Chunk((Image)this.GetCssAppliers().Apply(image, tag, htmlPipelineContext), 0f, 0f, true),
                        tag,
                        htmlPipelineContext)
                };
        }
    }
    

    要配置您的新处理器,请将您指定 TagFactory 的行替换为以下内容:

    var tagProcessorFactory = Tags.GetHtmlTagProcessorFactory();
    tagProcessorFactory.AddProcessor(new ResourceImageHtmlTagProcessor(), new[] { "resimg" });
    htmlContext.SetTagFactory(tagProcessorFactory);
    

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2011-08-13
      • 2021-11-20
      相关资源
      最近更新 更多