Текущие библиотеки, используемые для преобразования html + svg + css в pdf - PullRequest
0 голосов
/ 06 марта 2019

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

У меня есть HTML-код (содержимое div), который имеетнесколько svg и использует внешние css и js, включенные в заголовок html.Я ищу, как экспортировать его в PDF, он может быть в PHP или JavaScript.

Попробуйте эти альтернативы, без хороших результатов:

  • jspdf (javascript): РезультатPDF (большой вес), с одной страницей, низкого качества.
  • Html2Pdf (php): не поддерживает тег svg.

  • mPDF(php): ошибка с преобразованиями в mpdf \ classes \ svg.php

Какие другие альтернативы вы рекомендуете?

Спасибо за ваш вклад.

[РЕДАКТИРОВАТЬ 03-06]

Чтобы продолжить использовать mpdf, я пытаюсь преобразовать тег svg вIMG.С двумя различными типами графики я мог бы сделать это с хорошим качеством.

В третьем он не генерирует изображение.Некоторый код для понимания используемого метода:

HTML

<span id="graf_capitanias_ct"></span>

Создание графического D3

<script type="text/javascript">
var margin = {top: 20, right: 160, bottom: 35, left: 30};
var width = 300 - margin.left - margin.right,
    height = 150 - margin.top - margin.bottom;

var svg = d3.select("#graf_capitanias_ct")
  .append("svg")
  .attr("width", width + margin.left + margin.right)
  .attr("height", height + margin.top + margin.bottom)
  .append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

/* Data in strings like it would be if imported from a csv */
var data = [
    { year: "2018", ct: "4", capitanias: "2"},
    { year: "2017", ct: "1", capitanias: "1"},
    { year: "2016", ct: "3", capitanias: "0"},
];

var parse = d3.time.format("%Y").parse;

// Transpose the data into layers
var dataset = d3.layout.stack()(["ct", "capitanias"].map(function(valor) {
  return data.map(function(d) {
    return {x: parse(d.year), y: +d[valor]};
  });
}));

// Set x, y and colors
var x = d3.scale.ordinal()
  .domain(dataset[0].map(function(d) { return d.x; }))
  .rangeRoundBands([10, width-10], 0.02);

var y = d3.scale.linear()
  .domain([0, d3.max(dataset, function(d) {  return d3.max(d, function(d) { return d.y0 + d.y; });  })])
  .range([height, 0]);

var colors = ["#d25c4d", "#f2b447"];

// Define and draw axes
var yAxis = d3.svg.axis()
  .scale(y)
  .orient("left")
  .tickFormat(d3.format(",d"))
  .tickSize(-width, 0, 0)

var xAxis = d3.svg.axis()
  .scale(x)
  .orient("bottom")
  .tickFormat(d3.time.format("%Y"));

svg.append("g")
  .attr("class", "y cap_ct_axis")
  .call(yAxis);

svg.append("g")
  .attr("class", "x cap_ct_axis")
  .attr("transform", "translate(0," + height + ")")
  .call(xAxis)
  .selectAll("text")    
    .style("text-anchor", "end")
    .attr("dx", "-.8em")
    .attr("dy", ".15em")
    .attr("transform", "rotate(-65)");

// Create groups for each series, rects for each segment 
var groups = svg.selectAll("g.cost")
  .data(dataset)
  .enter().append("g")
  .attr("class", "cost")
  .style("fill", function(d, i) { return colors[i]; });

var rect = groups.selectAll("rect")
  .data(function(d) { return d; })
  .enter()
  .append("rect")
  .attr("x", function(d) { return x(d.x); })
  .attr("y", function(d) { return y(d.y0 + d.y); })
  .attr("height", function(d) { return y(d.y0) - y(d.y0 + d.y); })
  .attr("width", x.rangeBand())
  .on("mouseover", function() { tooltip.style("display", null); })
  .on("mouseout", function() { tooltip.style("display", "none"); })
  .on("mousemove", function(d) {
    var xPosition = d3.mouse(this)[0] - 15;
    var yPosition = d3.mouse(this)[1] - 25;
    tooltip.attr("transform", "translate(" + xPosition + "," + yPosition + ")");
    tooltip.select("text").text(d.y);
  });

 // Draw legend
var legend = svg.selectAll(".legend")
  .data(colors)
  .enter().append("g")
  .attr("class", "legend")
  .attr("transform", function(d, i) { return "translate(30," + i * 19 + ")"; });

legend.append("rect")
  .attr("x", width - 18)
  .attr("width", 18)
  .attr("height", 18)
  .style("fill", function(d, i) {return colors.slice().reverse()[i];});

legend.append("text")
  .attr("x", width + 5)
  .attr("y", 9)
  .attr("dy", ".35em")
  .style("text-anchor", "start")
  .text(function(d, i) { 
    switch (i) {
      case 0: return "Capitan\u00edas";
      case 1: return "Cuerpos t\u00e9cnicos";
    }
  });

// Prep the tooltip bits, initial display is hidden
var tooltip = svg.append("g")
  .attr("class", "tooltip")
  .style("display", "none");

tooltip.append("rect")
  .attr("width", 30)
  .attr("height", 20)
  .attr("fill", "white")
  .style("opacity", 0.5);

tooltip.append("text")
  .attr("x", 15)
  .attr("dy", "1.2em")
  .style("text-anchor", "middle")
  .attr("font-size", "12px")
  .attr("font-weight", "bold");
</script>   

Преобразование SVG в IMG

<script type="text/javascript">
function convierte_graficos_cap_ct() {
    var html = '';
    var imgscr = '';
    var img = '';
    var attributes = '';

    // css manual
    d3.selectAll('#graf_capitanias_ct svg')
    .style({
        "font": "10px sans-serif",
        "shape-rendering": "crispEdges"
    });
    d3.selectAll('.cap_ct_axis path, .cap_ct_axis line')
    .style({
        "fill": "none",
        "stroke": "#000"
    });
    d3.selectAll('.cap_ct_axis path.domain')
    .style({
        "stroke": "none"
    });
    d3.selectAll('.cap_ct_axis.y .tick line')
    .style({
        "stroke": "#ddd"
    });

    html = $('#graf_capitanias_ct').html();
    imgsrc = 'data:image/svg+xml;base64,'+ btoa(html);
    img = '<img src="'+imgsrc+'"';
    attributes = $('svg').prop("attributes");
    $.each(attributes, function() {
        img += ' '+this.name+'="'+this.value+'"';
    });
    img += '>';

    $('#graf_capitanias_ct').html(img); 
}
</script>

Обратите внимание, что стили CSS должны быть добавлены перед повторным преобразованием.Первоначально он берет их из внешнего CSS.

В результате, тег img, показывающий "не работает", не конвертирует SVG.Он ломается, потому что на графике есть текст UTF-8 (легенда).Как изменить этот текст перед конвертацией?Спасибо

1 Ответ

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

Для генерации PDF в настоящее время мы используем Snappy , который является оболочкой для WKHTMLTOPDF .
Мы используем SVG для диаграмм, встроенных в HTML, и они отображаются.
Хотяу нас действительно было несколько проблем с размером и размещением.
В итоге мы преобразовали SVG в изображение и затем кодировали его в base64.
Затем просто добавили этот Base64 к <img src="[Base64String]">

Композитор хорошо работает для снятия этих зависимостей.

{ "require":{ "knplabs/knp-snappy": "^0.4.3", "h4cc/wkhtmltopdf-amd64": "0.12.x", "h4cc/wkhtmltoimage-amd64": "0.12.x", "h4cc/wkhtmltopdf-i386": "0.12.x", "h4cc/wkhtmltoimage-i386": "0.12.x", "wemersonjanuario/wkhtmltopdf-windows": "0.12.x" } }

Несколько других вариантов:

  • FPDF - FPDF - это класс PHP, который позволяет генерировать файлы PDF на чистом PHP, то есть без использования библиотеки PDFlib.F из FPDF означает «бесплатно»: вы можете использовать его для любого вида использования и изменять его в соответствии со своими потребностями.
  • mPDF - mPDF - это библиотека PHP, которая генерирует PDF-файлы из UTF-8 кодированный HTML.Он основан на FPDF и HTML2FPDF с рядом улучшений.
  • dompdf - dompdf - это конвертер HTML в PDF.По сути, dompdf - это (в основном) CSS 2.1-совместимый HTML-макет и движок рендеринга, написанный на PHP.Это средство визуализации, основанное на стилях: оно будет загружать и читать внешние таблицы стилей, встроенные теги стилей и атрибуты стиля отдельных элементов HTML.Он также поддерживает большинство презентационных атрибутов HTML.
  • TCPDF - TCPDF - это библиотека PHP для простого и быстрого создания PDF-документов на пару строк.Он поддерживает настройку и множество ключевых функций при работе с файлами PDF.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...