Wkhtmltopdf отсутствуют пути SVG (рендеринг)

Я использую изображение внутри кода HMTL, как показано ниже:

<!DOCTYPE html>
<html>
  <head>
    <meta charset = "utf-8">
    <title>Test</title>
  </head>
  <body>
    <svg height = "291pt" version = "1.1" viewBox = "0 0 291 291" width = "291pt" xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink"> <defs>  <style type = "text/css">*{stroke-linecap:butt;stroke-linejoin:round;}  </style> </defs> <g id = "figure_1">  <g id = "patch_1">   <path d = "M 0 291.4 L 291.4 291.4 L 291.4 0 L 0 0 z" style = "fill:none;"></path>  </g>  <g id = "axes_1">   <g id = "line2d_1">    <path clip-path = "url(#p6e64365aaf)" d = "M 268.427273 145.7 L 207.063636 251.984936 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_2">    <path clip-path = "url(#p6e64365aaf)" d = "M 248.397453 148.307103 L 199.306544 233.335052 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_3">    <path clip-path = "url(#p6e64365aaf)" d = "M 207.063636 251.984936 L 84.336364 251.984936 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_4">    <path clip-path = "url(#p6e64365aaf)" d = "M 84.336364 251.984936 L 22.972727 145.7 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_5">    <path clip-path = "url(#p6e64365aaf)" d = "M 92.093456 233.335052 L 43.002547 148.307103 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_6">    <path clip-path = "url(#p6e64365aaf)" d = "M 22.972727 145.7 L 84.336364 39.415064 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_7">    <path clip-path = "url(#p6e64365aaf)" d = "M 84.336364 39.415064 L 207.063636 39.415064 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_8">    <path clip-path = "url(#p6e64365aaf)" d = "M 96.609091 55.457845 L 194.790909 55.457845 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>   <g id = "line2d_9">    <path clip-path = "url(#p6e64365aaf)" d = "M 207.063636 39.415064 L 268.427273 145.7 " style = "fill:none;stroke:#000000;stroke-linecap:square;stroke-width:1.2;"></path>   </g>  </g> </g> <defs>  <clipPath id = "p6e64365aaf">   <rect height = "270" width = "270" x = "10.7" y = "10.7"></rect>  </clipPath> </defs></svg>
  </body>
</html>

Когда я использую wkhtmltopdf для преобразования его в PDF, некоторые пути SVG отсутствуют. У кого-нибудь была такая же проблема? Какое решение этой проблемы?

Я попытался использовать относительный путь, полный путь, исходный код base64 и SVG отдельно в коде (как в примере).

версия wkhtmltopdf: 0.12.4

Wkhtmltopdf отсутствуют пути SVG (рендеринг)

Я не уверен, поможет ли это, но похоже, что новые версии из wkhtmltopdf (bitbucket) решили эту проблему.

iury simoes-sousa 13.03.2020 19:49
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
16
1
1 739
2

Ответы 2

Так что это не точное решение, но гораздо лучшая альтернатива сейчас - это использовать chrome в безголовом режиме.

$ chrome --headless --disable-gpu --print-to-pdf test.html
[0427/011400.636954:WARNING:dns_config_service_posix.cc(174)] dns_config has unhandled options!
[0427/011400.638406:ERROR:gpu_process_transport_factory.cc(1007)] Lost UI shared context.
[0427/011400.801881:INFO:headless_shell.cc(586)] Written to file output.pdf. 

PDF output

Также, если вы хотите лучше контролировать процесс, вы должны использовать NodeJS и кукловод.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
  await page.pdf({path: 'hn.pdf', format: 'A4'});

  await browser.close();
})();

Большое спасибо, но мне действительно нужно использовать Wkhtmltopdf, потому что это всего лишь часть большого документа, который конвертируется из html в pdf на Python (jinja2 / pdfkit).

iury simoes-sousa 27.04.2018 19:15

Тогда я предлагаю вам открыть ошибку в этом репо, также у chrome puppeteer есть привязки python, если я не ошибаюсь

Tarun Lalwani 27.04.2018 19:19

Я сделал это, но до сих пор нет ответа. Я поищу гугл-кукольника.

iury simoes-sousa 27.04.2018 20:59

@IurySousa, если вы чувствуете, что этот ответ поможет, не забудьте назначить награду до истечения ее срока.

Tarun Lalwani 03.05.2018 14:20

Обходной путь - преобразовать файлы .SVG в файлы .PNG перед преобразованием в .PDF. Код .SVG можно извлечь через AgilityPack или прочитать файлы как строку. Затем используйте Библиотека SVG для преобразования в .PNG следующим образом:

var svg = SvgDocument.FromSvg<SvgDocument>(svgXmlAsString);
var bitmap = svg.Draw();
var codec = "image/png".ParseImageCodecInfo();
// intermediaryStream required due to image.Save attempting read access
using (var intermediaryStream = new MemoryStream())
{
    bitmap.Save(intermediaryStream, codec);
    intermediaryStream.Position = 0;
    await intermediaryStream.CopyToAsync(responseStream);
    await intermediaryStream.FlushAsync();
    await responseStream.FlushAsync();
}

Спасибо @Joshcodes. Оказалось, что я больше не участвую в этом проекте, но ваше решение очень похоже на то, что мы сделали. Мы искали способ сохранить в формате SVG из соображений качества печати. Также мы помещали изображения на разделенный стол с разными цветами строк. Это означает, что нам нужно использовать альфа-канал для цвета фона PNG. Но в любом случае это сработало.

iury simoes-sousa 07.04.2020 21:58

Спасибо за ответ. У нас была очень похожая ситуация с качеством печати и альфа-фоном.

Joshcodes 08.04.2020 10:49

Другие вопросы по теме