i'm trying to follow this example to create PDF with an image Example PDF with an Image
I'm developing with VS2013 in VB.NET (ASP.NET 3.5).
I'm getting crazy, i don't understand 2 things:
what is the name that i've to pass in the IMG tag. The src-attribute doesn´t contain a http-Url. Instead use the prefix data:imagestream to identify the source type of the image. After the following slash the name of the resource in the manifest of the .NET library is listed.
when the END ovveride function in CustomImageTagProcessor Class is executed
I've embedded an image in the project and the manifest contains
...
}
.mresource public Test1.phone.jpg
{
  // Offset: 0x00000000 Length: 0x00003E0D
}
.mresource public Test1.Resources.resources
{
  // Offset: 0x00003E11 Length: 0x0000406B
}
I'm debugging step by step but never the code in the ovverride function is executed.
This is the function that produce PDF
 Public Function CreateFromHtml(ByVal html As String) As Stream
        Dim stream = New MemoryStream()
        Using doc = New Document(PageSize.A4)
            Using ms = New MemoryStream()
                Using writer = PdfWriter.GetInstance(doc, ms)
                    writer.CloseStream = False
                    doc.Open()
                    Dim tagProcessors = CType(Tags.GetHtmlTagProcessorFactory(), DefaultTagProcessorFactory)
                    tagProcessors.RemoveProcessor(iTextSharp.tool.xml.html.HTML.Tag.IMG)
                    tagProcessors.AddProcessor(iTextSharp.tool.xml.html.HTML.Tag.IMG, New CustomImageTagProcessor())
                    Dim cssFiles = New CssFilesImpl()
                    cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS())
                    Dim cssResolver = New StyleAttrCSSResolver(cssFiles)
                    Dim charset = Encoding.UTF8
                    Dim context = New HtmlPipelineContext(New CssAppliersImpl(New XMLWorkerFontProvider()))
                    context.SetAcceptUnknown(True).AutoBookmark(True).SetTagFactory(tagProcessors)
                    Dim htmlPipeline = New HtmlPipeline(context, New PdfWriterPipeline(doc, writer))
                    Dim cssPipeline = New CssResolverPipeline(cssResolver, htmlPipeline)
                    Dim worker = New XMLWorker(cssPipeline, True)
                    Dim xmlParser = New XMLParser(True, worker, charset)
                    Using sr = New StringReader(html)
                        xmlParser.Parse(sr)
                        doc.Close()
                        ms.Position = 0
                        ms.CopyTo(stream)
                        stream.Position = 0
                    End Using
                End Using
            End Using
        End Using
        Return stream
    End Function
And this is the Class of CustomImageTagProcessor
Imports iTextSharp.tool.xml
Imports System.Reflection
Imports iTextSharp.text
Public Class CustomImageTagProcessor
    Inherits iTextSharp.tool.xml.html.Image
    Public Overrides Function [End](ByVal ctx As IWorkerContext, ByVal tag As Tag, ByVal currentContent As IList(Of IElement)) As IList(Of IElement)
        Dim src = String.Empty
        If Not tag.Attributes.TryGetValue(iTextSharp.tool.xml.html.HTML.Attribute.SRC, src) Then Return New List(Of IElement)(1)
        If String.IsNullOrEmpty(src) Then Return New List(Of IElement)(1)
        If src.StartsWith("data:imagestream/", StringComparison.InvariantCultureIgnoreCase) Then
            Dim name = src.Substring(src.IndexOf("/", StringComparison.InvariantCultureIgnoreCase) + 1)
            Using stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name)
                Return CreateElementList(ctx, tag, Image.GetInstance(stream))
            End Using
        End If
        Return MyBase.[End](ctx, tag, currentContent)
    End Function
    Protected Function CreateElementList(ByVal ctx As IWorkerContext, ByVal tag As Tag, ByVal image As Image) As IList(Of IElement)
        Dim htmlPipelineContext = GetHtmlPipelineContext(ctx)
        Dim result = New List(Of IElement)()
        Dim element = GetCssAppliers().Apply(New Chunk(CType(GetCssAppliers().Apply(image, tag, htmlPipelineContext), Image), 0, 0, True), tag, htmlPipelineContext)
        result.Add(element)
        Return result
    End Function
End Class
Thanks so much for any helps. I hope in you guys.
The problem was a lost
</img>
tag
Self Closed tag is not valid.
When i put tag also code inside overrided function has been executed.
Thanks so much.
User contributions licensed under CC BY-SA 3.0