2013-01-02 39 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);