2017-01-18 4 views
2

У меня довольно простая HTML-страница, представленная через asp.net. Он выглядит красивым в PDF после его запуска через HtmlRenderer.PdfSharp ЗА ИСКЛЮЧЕНИЕМ, что изображения не отображаются. Просто красный X недостающего изображения в PDF, даже если сама веб-страница действительно отображает изображение правильно.Изображения не отображаются в PDF

Вот мой HtmlRenderer.PdfSharp код:

public void BuildPDF(string url, string pdfPath) { 
    string html = GetHTML(url); 
    Byte[] res = null; 
    using(MemoryStream ms = new MemoryStream()) { 
     using(FileStream file = new FileStream(pdfPath, FileMode.Create, FileAccess.Write)) { 
     byte[] bytes = new byte[ms.Length]; 
     var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4); 
     pdf.Save(ms); 
     res = ms.ToArray(); 
     file.Write(res, 0, res.Length); 
     ms.Close(); 
     } 
    } 
} 

private string GetHTML(string url) { 
    string html = string.Empty; 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.AutomaticDecompression = DecompressionMethods.GZip; 

    using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    using(Stream stream = response.GetResponseStream()) 
    using(StreamReader reader = new StreamReader(stream)) { 
     html = reader.ReadToEnd(); 
    } 

    return html; 
} 

А вот HTML IMG, который не делает в PDF: <img src="images/ChartImg.png" />

Как я могу решить эту проблему?

ответ

4

Используйте абсолютный путь к изображениям.

<img src="http://example.org/images/ChartImg.png" /> 

Вы можете разобрать html и сначала заменить строку, прежде чем передавать ее в PDF-конвертер.

0

Это лучше использовать разрешение изображения обратного вызова для этого для этого:

var pdf = PdfGenerator.GeneratePdf(html, pdfConfig, imageLoad: OnImageLoad); 

// snip 

private void OnImageLoad(object sender, HtmlImageLoadEventArgs e) 
{ 
    using (var client = new WebClient()) 
    { 
     var url = e.Src; 
     if (!e.Src.StartsWith("http://") && !e.Src.StartsWith("https://")) 
     { 
      url = Properties.Settings.Default.BaseUrl.TrimEnd('/') + e.Src; 
     } 
     using (var stream = new MemoryStream(client.DownloadData(url))) 
     { 
      e.Callback(XImage.FromStream(stream)); 
     } 
    } 
}