Предполагаю, что вы используете pdfHtml5. dataTables использует pdfmake для экспорта файлов PDF. Когда pdfmake используется в браузере, ему нужны изображения, которые должны быть определены как кодированные в base64 dataurls.
Пример: вы сделали <img src="myglyph.png">
в первом столбце некоторых строк - эти глифы должны быть включены в PDF. Сначала создайте Image
ссылки на глиф:
var myGlyph = new Image();
myGlyph.src = 'myglyph.png';
В вашей customize
функции вы должны теперь
1) построить словарь со всеми изображениями, которые должны быть включены в PDF
2) заменить text
узлы с image
узлами, чтобы ссылаться на изображения
buttons : [
{
extend : 'pdfHtml5',
customize: function(doc) {
//ensure doc.images exists
doc.images = doc.images || {};
//build dictionary
doc.images['myGlyph'] = getBase64Image(myGlyph);
//..add more images[xyz]=anotherDataUrl here
//when the content is <img src="myglyph.png">
//remove the text node and insert an image node
for (var i=1;i<doc.content[1].table.body.length;i++) {
if (doc.content[1].table.body[i][0].text == '<img src="myglyph.png">') {
delete doc.content[1].table.body[i][0].text;
doc.content[1].table.body[i][0].image = 'myGlyph';
}
}
},
exportOptions : {
stripHtml: false
}
}
Вот пример из getBase64Image
функции
function getBase64Image(img) {
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
return canvas.toDataURL("image/png");
}
Если вы просто хотите, чтобы показать title
изображений в PDF - или любым другим способом, хотят манипулировать текстовое содержимое PDF - то это немного легче , Содержание каждого столбца в каждой строке может быть отформатирован с помощью exportOptions.format.body
обратного вызова:
buttons : [
{
extend : 'pdfHtml5',
exportOptions : {
stripHtml: false
format: {
body: function(data, col, row) {
var isImg = ~data.toLowerCase().indexOf('img') ? $(data).is('img') : false;
if (isImg) {
return $(data).attr('title');
}
return data;
}
}
}
]
Причина format.body
не может быть использована вместе с изображениями, что выпускаемая только нам передавать данные обратно в text
узел части PDF документа в ,
Смотрите также
Спасибо за подробный ответ. Должен ли я добавить тот же код ('if (doc.content [1] .table.body [i] [0] .text == ' ...' для каждого изображения? Проблема в том, что я не знаю в что изображения будут включены в таблицу. Приложение, в котором используется код, является калькулятором определенного типа, поэтому количество изображений и изображений зависит от конечных результатов расчета. –
@MindaugasLi, да! Проведите этот тест для каждого '' вы хотите заменить, помните 'table.body [i] [0]' is col0, 'table.body [i] [1]' col 2 и т. Д. Вам не нужно создавать словарь, это в основном, так что один и тот же символ/изображение не повторяется 1000 раз - вы можете напрямую использовать dataUrl -> 'doc.content [1] .table.body [i] [0] .image = getBase64Image (myGlyph)', но затем размер PDF-файла может быть значительно увеличен. – davidkonrad
@ davidkonrad вы можете помочь мне в этой проблеме? https://stackoverflow.com/questions/44951044/formating-angular-datatable-before-exportin g-to-pdf – query