首页 > 解决方案 > 在 iTextSharp 中创建带有图像(来自文件的数据流)的 PDF

问题描述

我正在尝试按照此示例创建带有图像的 PDF 带有图像的 示例 PDF

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

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

  1. 我必须在 IMG 标签中传递的名称是什么。src 属性不包含 http-Url。而是使用前缀 data:imagestream 来标识图像的源类型。在以下斜杠之后,列出了 .NET 库清单中的资源名称。

  2. 当执行 CustomImageTagProcessor 类中的 END ovveride 函数时

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

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

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

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

解决方案


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.


推荐阅读