ITextSharp解析带有图像的HTML:它正确解析但不会显示图像

我正在尝试使用库ITextSharp从html生成.pdf。 我能够创建pdf与html文本转换为pdf文本/段落

我的问题: pdf没有显示我的图像(我的img元素来自html)。 我的html中的所有img html元素都不会显示在pdf中? ITextSharp是否可以解析HTML和显示图像。 我真的希望如此,否则我被塞满了:(

我链接到图像所在的正确目录(使用IMG_BASURL),但它们只是没有显示

我的代码:

// mainContents variable is a string containing my HTML var document = new Document(PageSize.A4, 50, 50, 80, 100); var output = new MemoryStream(); var writer = PdfWriter.GetInstance(document, output); document.open(); Hashtable providers = new Hashtable(); providers.Add("img_baseurl","C:/users/xx/VisualStudio/Projects/myproject/"); var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(mainContents), null, providers); foreach (var htmlElement in parsedHtmlElements) document.Add(htmlElement as IElement); document.Close(); 

每次我遇到这个问题时,图片对于canvas来说太大了。 更具体地说,即使是内部的裸IMG标签也会被包裹在一个将被包裹在Paragraph中的Chunk中,我认为图像溢出了段落,但我不是100%肯定。

两个简单的修复方法是放大canvas或在HTML IMG标记上指定图像尺寸。 第三个更复杂的路线是使用额外的提供商IMG_PROVIDER 。 为此,您需要实现IImageProvider接口。 下面是一个非常简单的版本

  public class ImageThing : IImageProvider { //Store a reference to the main document so that we can access the page size and margins private Document MainDoc; //Constructor public ImageThing(Document doc) { this.MainDoc = doc; } Image IImageProvider.GetImage(string src, IDictionary attrs, ChainedProperties chain, IDocListener doc) { //Prepend the src tag with our path. NOTE, when using HTMLWorker.IMG_PROVIDER, HTMLWorker.IMG_BASEURL gets ignored unless you choose to implement it on your own src = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\" + src; //Get the image. NOTE, this will attempt to download/copy the image, you'd really want to sanity check here Image img = Image.GetInstance(src); //Make sure we got something if (img == null) return null; //Determine the usable area of the canvas. NOTE, this doesn't take into account the current "cursor" position so this might create a new blank page just for the image float usableW = this.MainDoc.PageSize.Width - (this.MainDoc.LeftMargin + this.MainDoc.RightMargin); float usableH = this.MainDoc.PageSize.Height - (this.MainDoc.TopMargin + this.MainDoc.BottomMargin); //If the downloaded image is bigger than either width and/or height then shrink it if (img.Width > usableW || img.Height > usableH) { img.ScaleToFit(usableW, usableH); } //return our image return img; } } 

要使用此提供程序,只需将其添加到提供程序集合中,就像使用HTMLWorker.IMG_BASEURL

 providers.Add(HTMLWorker.IMG_PROVIDER, new ImageThing(doc)); 

应该注意的是,如果您使用HTMLWorker.IMG_PROVIDER ,那么您负责弄清楚图像的所有内容。 上面的代码假设所有图像路径都需要添加一个常量字符串,您可能希望更新它并在开始时检查HTTP 。 此外,因为我们说我们想要完全处理图像处理管道,所以不再需要提供程序HTMLWorker.IMG_BASEURL

主代码循环现在看起来像这样:

  string html = @""; string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "HtmlTest.pdf"); using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { using (Document doc = new Document(PageSize.A4, 50, 50, 80, 100)) { using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) { doc.Open(); using (StringReader sr = new StringReader(html)) { System.Collections.Generic.Dictionary providers = new System.Collections.Generic.Dictionary(); providers.Add(HTMLWorker.IMG_PROVIDER, new ImageThing(doc)); var parsedHtmlElements = HTMLWorker.ParseToList(sr, null, providers); foreach (var htmlElement in parsedHtmlElements) { doc.Add(htmlElement as IElement); } } doc.Close(); } } } 

最后一件事,请确保在此处发布时指定您要定位的iTextSharp版本。 上面的代码针对iTextSharp 5.1.2.0,但我想你可能正在使用4.X系列。

我遇到了同样的问题并尝试了以下提出的解决方案:字符串替换了一个标记,在base64中编码并将图像嵌入到.NET类库中,但都没有工作! 所以我采用了老式的解决方案:使用doc.Add()手动添加徽标
这是你的代码更新:

 string html = @""; string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "HtmlTest.pdf"); using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { using (Document doc = new Document(PageSize.A4, 50, 50, 80, 100)) { using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) { doc.Open(); using (StringReader sr = new StringReader(html)) { System.Collections.Generic.Dictionary providers = new System.Collections.Generic.Dictionary(); providers.Add(HTMLWorker.IMG_PROVIDER, new ImageThing(doc)); var parsedHtmlElements = HTMLWorker.ParseToList(sr, null, providers); foreach (var htmlElement in parsedHtmlElements) { doc.Add(htmlElement as IElement); } // here's the magic var logo = iTextSharp.text.Image.GetInstance(Server.MapPath("~/HTMLTemplate/logo.png")); logo.SetAbsolutePosition(440, 800); document.Add(logo); // end } doc.Close(); } } } 
 string siteUrl = HttpContext.Current.Server.MapPath("/images/image/ticket/Ticket.jpg"); string HTML = "
asdasdsadasdsa
";