2016-06-07 3 views
9

Я использую jspdf для создания PDF внутри браузера. У меня есть несколько диаграмм, имеющих svg как данные диаграммы. Для добавления данных в pdf я конвертирую svg в png, используя canvas, а затем Base64 Data, используя метод canvas.toDataURL. После всего этого размера конверсий файл, созданный jspdf, огромен (около 50 МБ). Ниже приведен код для данных диаграммы и холста.Размер файла Pdf слишком большой, созданный с помощью jspdf

newdiv = document.createElement("div"); 
newdiv.className = "big_Con_graph big_Con_graph0"; 
newdiv.style.height = "0px"; 
newdiv.id = "big_Con_graph" + id; 

ниже размеры для SVG графика нагрузки.

document.getElementById("big_Con_graph" + id).style.display = "block"; 
var big_chartReference = FusionCharts("big_myChartId"+id); 
if(big_chartReference != null){ 
    big_chartReference.dispose(); 
} 
var big_width = "1088"; 
var big_height = "604"; 

Ниже приведен код преобразования приведенных выше данных SVG и добавления в PDF.

var elem_graph = $($('.big_Con_graph,big_Con_graph0')[count]).clone(true); 
svgString = $(elem_graph).find("span").html(); 
var img = document.createElement('img'); 
var DOMURL = self.URL || self.webkitURL || self; 
var svg = new Blob([svgString], {type: "image/svg+xml;charset=utf-8"}); 
var url = DOMURL.createObjectURL(svg); 
img.onload = pdfAfterImageLoad(img,pdf,imgLoadSequence,DOMURL,totalReports,reportName); 
img.src = url; 

это код функции PDFAfterImageLoad:

var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 
ctx.drawImage(img, 0, 0); 
var png = canvas.toDataURL("image/png"); 
pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270); 

Я использую PNG, поэтому параметр IMAGEQUALITY не может быть использован.

Может ли кто-нибудь помочь мне уменьшить размер файла?

+0

Вы преобразовываете в base64, потому что jspdf требует этого? – YakovL

+0

У меня нет изображения, хранящегося в моем конце, нажав кнопку i m, получая данные svg и преобразовывая его в png с помощью canvas, поэтому для всего процесса требуются данные base64. Даже я не могу хранить все данные графика на клиентском хранилище. –

+0

Я вижу. И почему вы используете png вместо jpeg? Использование jpeg с модификатором качества помогло бы (см. Https: // developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL) – YakovL

ответ

16

Вам необходимо использовать сжатие изображений в создаваемых PDF-файлах. Попробуйте использовать Deflate.js и adler32cs.js и используйте параметр сжатия как в jsPDF, так и в функциях addImage, которые вы используете. Для например:

var doc = new jsPDF('p', 'pt','a4',true); 

убедитесь, что вы установите последний параметр как «истина» относится к: https://github.com/MrRio/jsPDF/blob/ddbfc0f0250ca908f8061a72fa057116b7613e78/jspdf.js#L146

Пройдите через него, и вы можете ясно видеть, что последний параметр обеспечивает сжатие.

использовать также:

pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270,'','FAST'); 

вместо

pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270); 

вы можете выбрать между NONE, БЫСТРО, MEDIUM и SLOW, в зависимости от того подходит вам лучше всего.

+0

это работает. Я получаю одну линию границы внизу - с помощью jspdf addimag. как удалить эту строку – Lini

+0

в любом случае горизонтальная линия не будет напечатана на бумаге. – Lini

+0

Я создаю PDF из пользовательского графика. Я могу генерировать PDF-файл, используя jspdf. Но цвет графа и цвет шрифта с веб-страницы воспроизводятся в pdf. (эффект коробки-тени отсутствует на графике, и график выглядит размытым). Как я могу это исправить? –

0

Вы попробовали canvg? Не очень вероятно, что это уменьшит размер файла, но, по крайней мере, вы можете попробовать.

См. Фрагмент в this reply.

+0

Да, я уже использую canvg для браузера IE и Safari. Но это связано с уменьшением размера файла. –

6

Если добавить несколько изображений в одном документе, используйте

pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270, undefined,'FAST'); 

не

pdf.addImage(png, 'PNG', leftmargin, 120, 485, 270,'','FAST'); 

иначе первое изображение заменит все другие.

+0

да .. это был только пример, pdf.addImage (png, 'PNG', leftmargin, 120, 485, 270, undefined, 'FAST'); в этом неопределенном, вы должны указывать другое имя каждый раз, когда вы добавляете image.as для API, это имя псевдонима., Которое должно быть уникальным для каждого изображения. –

+0

Просто подпрыгнув, чтобы сказать, что приведенный выше пример также уменьшил мой 4Mb PDF (11 страниц, с 10 диаграммами на странице) до 977kb. Большое вам спасибо за этот совет! – JasonMHirst