Używam jspdf do tworzenia plików PDF wewnątrz przeglądarki. Mam wiele wykresów zawierających svg jako dane wykresu. Aby dodać dane do pliku pdf, konwertuję plik SVG na png przy użyciu obszaru roboczego, a następnie danych Base64 przy użyciu metody canvas.toDataURL
. Po tym wszystkim wielkość konwersji pliku utworzonego przez jspdf jest ogromna (około 50 MB). Poniżej znajduje się kod dla div danych wykresu i kanwy.Rozmiar pliku pdf zbyt duży utworzony za pomocą jspdf
newdiv = document.createElement("div");
newdiv.className = "big_Con_graph big_Con_graph0";
newdiv.style.height = "0px";
newdiv.id = "big_Con_graph" + id;
Poniżej wymiary SVG obciążenia wykresu.
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";
Poniżej znajduje się kod do konwersji powyższych danych SVG wykresu i dodanie do pliku 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;
jest to kod dla funkcji 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);
Używam PNG, więc parametr imagequality nie może być używany.
Czy ktoś może mi pomóc zmniejszyć rozmiar pliku?
Konwertujesz na base64, ponieważ wymaga tego jspdf? – YakovL
Nie mam obrazu zapisanego na moim końcu, klikając przycisk I m uzyskanie danych svg i konwertowanie go do PNG przez płótno, więc cały proces wymaga danych base64. Nawet nie mogę przechowywać wszystkich danych wykresu w pamięci klienta. –
Rozumiem. I dlaczego używasz png zamiast jpeg? Używanie jpeg z modyfikatorem jakości pomogłoby (zobacz https: // programista.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL) – YakovL