在iTextSharp中使用图像(来自文件的数据流o)创建PDF

问题描述 投票:0回答:1

我试图按照这个例子用图像Example PDF with an Image创建PDF

我正在使用VB.NET(ASP.NET 3.5)中的VS2013进行开发。

我疯了,我不明白两件事:

  1. 我要在IMG标签中传递的名称是什么。 src-attribute不包含http-Url。而是使用前缀data:imagestream来标识图像的源类型。在以下斜杠之后,将列出.NET库清单中资源的名称。
  2. 当执行CustomImageTa Processor Class中的END覆盖功能时

我在项目中嵌入了一个图像,清单中包含了

...
}
.mresource public Test1.phone.jpg
{
  // Offset: 0x00000000 Length: 0x00003E0D
}
.mresource public Test1.Resources.resources
{
  // Offset: 0x00003E11 Length: 0x0000406B
}

我正在逐步调试,但从未执行覆盖函数中的代码。

这是生成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

这是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

非常感谢任何帮助。我希望你们好。

vb.net pdf itext
1个回答
0
投票

这个问题很遗憾

</img>

标签

自闭标签无效。

当我把标签也代码内部覆盖功能已经执行。

非常感谢。

© www.soinside.com 2019 - 2024. All rights reserved.