rdvojmoc / DinkToPdf

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

DinkToPdf on linux server doesn't show images #165

Open TropinAlexey opened 2 years ago

TropinAlexey commented 2 years ago

I have a .NET 6 Web API project with DinkToPdf which I use on macOS on my dev machine, and two servers on Linux Ubuntu 20.4 and Windows Server 2012. My API detects OS on which it runs and uses the corresponding library to convert HTML to PDF file on output.

My controller:

public class ClientDocController : BaseController
{
    private readonly IClientAppointmentDocumentService _clientAppointmentDocumentService;
    private readonly IConverter _htmlToPdfConverter;

    public ClientDocController(IClientAppointmentDocumentService clientAppointmentDocumentService, IConverter htmlToPdfConverter)
    {
        _clientAppointmentDocumentService = clientAppointmentDocumentService;
        _htmlToPdfConverter = htmlToPdfConverter;
    }
    [HttpGet("{documentId}/pdf/")]
    [RestApiAuthorize(AccountRolePermissions.VIEW_CLIENT_DOCUMENTS)]
    public async Task<IActionResult> GetPdfAsync([FromRoute] int documentId, bool uploadToClientPortal, int? templateId = null, 
        bool clientPrint = false, bool sendToClientEmail = false, CancellationToken cancellationToken = default)
    {
        try
        {
            var htmlDocument = templateId == null
                ? await _clientAppointmentDocumentService.GetDefaultHtmlDocumentAsync(documentId, clientPrint, cancellationToken)
                : await _clientAppointmentDocumentService.GetHtmlDocumentAsync(documentId, templateId, clientPrint, cancellationToken);

            var fileName = $"Document_{documentId}_{DateTime.Now:s}.pdf";
            var conversionSettings = PdfConfigurationDefaults.GetDefaultSettings(htmlDocument); //this get individual settings for each platform
            var pdf = _htmlToPdfConverter.Convert(conversionSettings);
            var result = File(pdf, MediaTypeNames.Application.Pdf, fileName);

            if (sendToClientEmail) await _clientAppointmentDocumentService.SendToClientByEmailAsync(new[] {result});
            if (!uploadToClientPortal) return result;

            var accessToken = Request.Headers["Authorization"].ToString();
            var response = await _clientAppointmentDocumentService.UploadToClientPortalAsync(documentId, result, accessToken);
            return Ok(response);
        }
        catch (Exception e)
        {
            return BadRequest(e.Message);
        }
    }
}

This works well on all machines, although on Linux server there are images not included in resulting PDF under tag <img src="https://..." />.

What I have checked:

Anybody have any ideas, what can I check further?

abuksh commented 1 year ago

I have the same problem. I'm trying to display an image from Azure Blob storage, and it won't render the image. It just shows a blank box.
Has anyone found a solution for this yet?

TropinAlexey commented 1 year ago

Hi. Here one workaround, but not solution

omarhaj007 commented 1 year ago

Has anyone found a solution for this yet?