rdvojmoc / DinkToPdf

C# .NET Core wrapper for wkhtmltopdf library that uses Webkit engine to convert HTML pages to PDF.
MIT License
1.08k stars 414 forks source link

Images are not shown #27

Open wgutierrezr opened 6 years ago

wgutierrezr commented 6 years ago

Hi I'm creating a PDF from Html file and the images are not shown. How can I convert an html file with images?

rdvojmoc commented 6 years ago

Please provide HTML that you are trying to convert.

Franklin89 commented 6 years ago

@wgutierrezr did you use an img tag and and point the src to a https url? If so, try http if possible. Worked for me.

ajitscorpio commented 6 years ago

can I add an image in the header?

here are my header settings:

        HeaderSettings = { FontSize = 12, Left = "Name", Right = "<img 
        src='http://abc.com/Images/logo.gif'/>My Compnay", Line = true, Spacing = 2.812 }    

But it is rendering img tag as it is. Any ideas?

agpcardoso commented 6 years ago

For me, just works if I set the complete image path in the html file like this example


 omitted html code...

<img width=364 height=83 src="file:///C:/Projects/Printer/Dispatchment.API/Cartas/Model/image001.png" align=left hspace=12>

 omitted html code...
bill-richards commented 5 years ago

Does not work for me either

<img width="110" height="96" src="images/badge.png" /> <img width="110" height="96" src="/images/badge.png" /> <img width="110" height="96" src="~/images/badge.png" /> <img width="110" height="96" src='@Url.Content("~/images/badge.png")' />

or any of the above using <image />

it also won't pick up a relative stylesheet link

<link rel="stylesheet" type="text/css" href="css/certificates.css">
<link rel="stylesheet" type="text/css" href="/css/certificates.css">
<link rel="stylesheet" type="text/css" href="~/css/certificates.css">
<link rel="stylesheet" type="text/css" href='@Url.Content("~/css/certificates.css")'>

Even though the page shows as expected in the browser.

The Stylesheet is not extremely bad an issue, however the image is a real pain … strange how it works on the google homepage though. Is it something to do with my environment or is this a bug?

omr-htp commented 5 years ago

Hello,

with asp.net core 2.1 app as a workaround i used

@{
    var hst = Context.Request.Scheme + "://" + Context.Request.Host;
}

<link rel="stylesheet" href="@hst/lib/bootstrap/dist/css/bootstrap.css"/>

leen2175 commented 5 years ago

@omer-hatip
May I ask what method you used to render the razor engine. cshtml formatted as String? Sorry, this is machine translation.

OmerHatip commented 5 years ago

@leen2175

I used this Extension

public static class ControllerExtensions
{
    public static async Task<string> RenderViewAsync<TModel>(this Controller controller, TModel model, string viewName = null, bool partial = false)
    {
       if (string.IsNullOrEmpty(viewName))
        {
            viewName = controller.ControllerContext.ActionDescriptor.ActionName;
        }
        controller.ViewData.Model = model;

        using (var writer = new StringWriter())
        {
            IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
            ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial);

            if (viewResult.Success == false)
            {
                return $"A view with the name {viewName} could not be found";
            }

            ViewContext viewContext = new ViewContext(
                controller.ControllerContext,
                viewResult.View,
                controller.ViewData,
                controller.TempData,
                writer,
                new HtmlHelperOptions()
            );

            await viewResult.View.RenderAsync(viewContext);

            return writer.GetStringBuilder().ToString();
        }
    }
}

then in controller action you can use it like :

var viewHtml = await this.RenderViewAsync(model, viewName);
leen2175 commented 5 years ago

@OmerHatip
thanks ! it is work for me!~

Lemraj commented 5 years ago

@rdvojmoc I have the same problem with printing images in an generated PDF file. I am using the example in code maze blog. (https://code-maze.com/create-pdf-dotnetcore/). I tried all the possible ways I know to show an image, but without any result. Any help? thanks.

Example: var objectSettings = new ObjectSettings { PagesCount = true, HtmlContent = templateGenerator.GetHtmlString(id), WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "Assets", "Styles.css"), LoadImages = true }, };

image

rdvojmoc commented 5 years ago

Problem is in your <img src='/Assets/logo.png' />. This is relative path, for this to work you will need to provide absolute path to the image for example <img src='http://localhost:5000/Assets/logo.png' />

Lemraj commented 5 years ago

Thank you for the quick response! I appreciate it. Your suggestion did work for me! Thanks a lot! I also had to enable serving files from the \Assets folder located under the root folder of the site.

This is the Startup code for enabling multiple web roots:

// Enable serving files from the configured web root folder (i.e., WWWROOT)
app.UseStaticFiles();

// Enable serving files from \Assets located under the root folder of the site
app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = new PhysicalFileProvider(
    Path.Combine(Directory.GetCurrentDirectory(), @"Assets")),
    RequestPath = new PathString("/Assets")
});
aspgirl commented 5 years ago

Problem is in your <img src='/Assets/logo.png' />. This is relative path, for this to work you will need to provide absolute path to the image for example <img src='http://localhost:5000/Assets/logo.png' />

@rdvojmoc can we set resolveRelativeLinks to true in dinkToPdf?

wangweinjcn commented 5 years ago

I use base64 image in html content ,not url; like this;

<img src="data: image/png; base64,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"/>

pdf display: image

html display: image

those images can display in html. but not display in pdf. how resolve ? thank you!

rohanshenoy96 commented 4 years ago

I use base64 image in html content ,not url; like this;

<img src="data: image/png; base64,iVBORw0KGgoAAAANSUhEUgAAAKcAAAAfCAYAAACCj930AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXnSURBVHhepY5RiiQxFMP6/peexQsCI5zURwRNZPtR9O/vkd/v9/+HA/3qYG107cH92kJ7+Lol4955va8M7jsH+9rJt75zsK+d7P2U7UDXN7z4K89fWX8w0K8O1kbXHtyvLbSHr1sy7p3X+8rgvnOwr5186zsH+9rJ3k/ZDnR9w4u/8vyV9QcD/epgbXTtwf3aQnv4uiXj3nm9rwzuOwf72sm3vnOwr53s/ZTtQNc3vPgrz19ZfzDQrw7WRtce3K8ttIevWzLundf7yuC+c7CvnXzrOwf72sneT9kOdH3Di7/y/JX1BwP96mBtdO3B/dpCe/i6JePeeb2vDO47B/vaybe+c7Cvnez9lO1A1ze8+CvPX1l/MNCvDtZG1x7cry20h69bMu6d1/vK4L5zsK+dfOs7B/vayd5P2Q50fcOLv/L8lfUHA/3qYG107cH92kJ7+Lol4955va8M7jsH+9rJt75zsK+d7P2U7UDXN7z4K89fWX8w0K8O1kbXHtyvLbSHr1sy7p3X+8rgvnOwr5186zsH+9rJ3k/ZDnR9w4u/8vyV9QcD/epgbXTtwf3aQnv4uiXj3nm9rwzuOwf72sm3vnOwr53s/ZTtQNc3vPgrz19ZfzDQrw7WRtce3K8ttIevWzLundf7yuC+c7CvnXzrOwf72sneT9kOdH3Di7/y/JX1BwP96mBtdO3B/dpCe/i6JePeeb2vDO47B/vaybe+c7Cvnez9lO1A1ze8+CvPX1l/MNCvDtZG1x7cry20h69bMu6d1/vK4L5zsK+dfOs7B/vayd5P2Q50fcOLv/L8lfUHA/3qYG107cH92kJ7+Lol4955va8M7jsH+9rJt75zsK+d7P2U7UDXN7z4K89fWX8w0K8O1kbXHtyvLbSHr1sy7p3X+8rgvnOwr5186zsH+9rJ3k/ZDnR9w4u/8vyV9QcD/epgbXTtwf3aQnv4uiXj3nm9rwzuOwf72sm3vnOwr53s/ZTtQNc3vPgrz19ZfzDQrw7WRtce3K8ttIevWzLundf7yuC+c7CvnXzrOwf72sneT9kOdH3Di7/y/JX1BwP96mBtdO3B/dpCe/i6JePeeb2vDO47B/vaybe+c7Cvnez9lO1A1ze8+CvPX1l/MNCvDtZG1x7cry20h69bMu6d1/vK4L5zsK+dfOs7B/vayd5P2Q50fcOLv/L8lfUHA/3qYG107cH92kJ7+Lol4955va8M7jsH+9rJt75zsK+d7P2U7UDXN7z4K89fWX8w0K8O1kbXHtyvLbSHr1sy7p3X+8rgvnOwr5186zsH+9rJ3k/ZDnR9w4u/8vyV9QcD/epgbXTtwf3aQnv4uiXj3nm9rwzuOwf72sm3vnOwr53s/ZTtQNc3vPgrz19ZfzDQrw7WRtce3K8ttIevWzLundf7yuC+c7CvnXzrOwf72sneT9kOdH3Di7/y/JX1BwP96mBtdO3B/dpCe/i6JePeeb2vDO47B/vaybe+c7Cvnez9lO1A1ze8+CvPX1l/MNCvDtZG1x7cry20h69bMu6d1/vK4L5zsK+dfOs7B/vayd5P2Q50fcOLv/L8lfUHA/3qYG107cH92kJ7+Lol4955va8M7jsH+9rJt75zsK+d7P2U7UDXN7z4K89fWX8w0K8O1kbXHtyvLbSHr1sy7p3X+8rgvnOwr5186zsH+9rJ3k/ZDnR9w4u/8vyV9QcD/epgbXTtwf3aQnv4uiXj3nm9rwzuOwf72sm3vnOwr53s/ZTtQNc3vPgrz19ZfzDQrw7WRtce3K8ttIevWzLundf7yuC+c7CvnXzrOwf72sneT9kOdH3Di7/y/JX1BwP96mBtdO3B/dpCe/i6JePeeb2vDO47B/vaybe+c7Cvnez9lO1A1ze8+CvPX1l/MNCvDtZG1x7cry20h69bMu6d1/vK4L5zsK+dfOs7B/vayd5P2Q50fcOLv/L8lfUHA/3qYG107cH92kJ7+Lol4955va8M7jsH+9rJt75zsK+d7P2U7UDXN7z4G39//wBGtRXUqNj0GwAAAABJRU5ErkJggg=="/>

pdf display: image

html display: image

those images can display in html. but not display in pdf. how resolve ? thank you!

I'm facing the same issue. Base64 image i need to display in pdf converted document can this be done?

todsmer commented 3 years ago

I had same issue as @rohanshenoy96 and @wangweinjcn - I had to remove spaces from src="data: image/png; base64,iVBOR… to make src="data:image/png;base64,iVBOR…. First is interpreted only by browsers, second - by both browsers and library.

renilbabu03 commented 3 years ago

My image was in local folder and not hosted. I did it by converting the image to Binary64 and then passing it hardcoded to the src. It works if you have static image

MeaningOfLights commented 3 years ago

See my solution here: https://stackoverflow.com/a/46658645/495455

WojGrab commented 8 months ago

@todsmer you got base64 working with this lib? I am using img same as you: <img style="height:100%; width:100%" src="data:image/png;base64,iVBOR.... and still blank space instead of image... with .jpg same - extension doesn't matter. I tried removing white characters like you but without success. In ObjectSettings > WebSettings I've set LoadImages to true but nothing has changed.

Edit: removing style from img made png working. Instead I used width, height attributes of img: <img widht="100%" height="100%" src="data:image/png;base64,iVBORw0K... Eveything works! Although probably would be better and worked at the beggining if it was wkhtmltopdf 0.12.6 and not 0.12.4... unfortunately dinktopdf is abandoned...

camilo-pacifica commented 2 months ago

Hello,

with asp.net core 2.1 app as a workaround i used

@{
    var hst = Context.Request.Scheme + "://" + Context.Request.Host;
}

<link rel="stylesheet" href="@hst/lib/bootstrap/dist/css/bootstrap.css"/>

worked to me with asp net core 8, such a genius