Проблема загрузки изображений в PDF с помощью HtmlRenderer.PdfSharp - PullRequest
0 голосов
/ 21 марта 2019

Это немного длинно, но, возможно, у кого-то могут быть какие-то идеи.

Для справки - см. Изображения не отображаются в формате PDF , аналогичный вопрос.

Я использую библиотеку Htmlrenderer.PdfSharp для создания файлов PDF из содержимого HTML. Все работает отлично, за исключением изображений. Они просто отображают большую красную коробку.

PDF отлично работает при локальном запуске в режиме отладки, но не при развертывании на сервере. У меня есть немного дополнительной информации, которая может помочь - при выполнении команды для создания PDF:

        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(htmlContent, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }

На сервере я получаю несколько следующих ошибок:

Exception thrown: 'System.Security.Authentication.AuthenticationException' in System.dll

Работая локально, я не получаю этих ошибок. У меня такое ощущение, что это как-то связано с тем, что движок .NET не может правильно разрешить URL-адрес изображения. При этом URL-адрес изображения полностью указан. Это, однако, позади HTTPS, если это помогает.

Я не могу идти дальше с отладкой. Если у кого-то есть какие-либо идеи, я бы с удовольствием их услышал - даже если бы у меня было больше мест, я мог бы попытаться найти подсказки.

1 Ответ

0 голосов
/ 21 марта 2019

После долгих экспериментов я нашел решение.Вот ссылка на сборку, которая позволяет этому решению работать, поэтому убедитесь, что у вас правильная версия:

https://github.com/ArthurHub/HTML-Renderer/pull/41

Решение состоит в том, чтобы загрузить рассматриваемое изображение в байтовый массиви затем загрузите изображение непосредственно в HTML-код, используя строковое представление base64 изображения:

byte[] array = File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"[YourImageFilePathHere]"));

. Это приведет к извлечению файла из папки в развернутом пути вашего проекта - в моем случае у меня естьпапка с названием images, внутри которой находится мое изображение.

Далее, в CSS (или, при желании, встроенный, если хотите):

htmlContent += " img.logo { width:110px;height:110px;content: url('data:image/jpeg;base64," + Convert.ToBase64String(array) +"')} ";

Наконец, внутриHTML:

string imageUrl = "<img class=\"logo\"></img>";

И все!Отлично сработало для меня.

...