2013-01-02 2 views
4

Я разбираю HTML с некоторыми изображениями внутри этого.ITextSharp: Как получить изображение встроенный ресурс

Эти изображения хранятся в виде встроенного ресурса, а не в файловой системе.

как я знаю, мне нужно установить пользовательский поставщик изображений в 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); 
      } 

Спасибо заранее.

ответ

3

Использование пользовательского поставщика изображений, похоже, не поддерживается. Единственное, что он действительно поддерживает, это изменение корневых путей.

Однако, вот одно решение проблемы:

Создайте новый HTML-тег, называемый <resimg src="{resource name}"/>, и написать обработчик пользовательских тегов для него.

Вот реализация:

/// <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); 
Смежные вопросы