【问题标题】:Creating a PDF with an image (datastream o from file) in iTextSharp在 iTextSharp 中创建带有图像的 PDF(来自文件的数据流)
【发布时间】:2019-03-22 12:23:44
【问题描述】:

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

我正在 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.net pdf itext


    【解决方案1】:

    问题是丢失了

    </img>
    

    标签

    自闭标签无效。

    当我放置标签时,覆盖函数内的代码也已执行。

    非常感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2012-03-16
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多