2016-06-07 16 views
9

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?

+0

Konwertujesz na base64, ponieważ wymaga tego jspdf? – YakovL

+0

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. –

+0

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

Odpowiedz

16

Należy użyć kompresji obrazów w plikach PDF, które generujesz. Spróbuj użyć Deflate.js i adler32cs.js i użyj parametru compress w obu funkcjach jsPDF i addImage, których używasz. Dla np

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

upewnij się ustawić ostatni parametr jako „prawdziwy” odnoszą się do: https://github.com/MrRio/jsPDF/blob/ddbfc0f0250ca908f8061a72fa057116b7613e78/jspdf.js#L146

Przejdź przez nią i można wyraźnie zobaczyć, że ostatni parametr jest umożliwienie kompresji.

używać również:

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

zamiast

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

można wybrać pomiędzy None, szybki, średni i SLOW, cokolwiek najbardziej Ci odpowiada.

+0

to działa. Dostaję jedną linię graniczną u dołu - używając jspdf addimag. jak usunąć tę linię – Lini

+0

mimo to linia pozioma nie jest drukowana na papierze. – Lini

+0

Tworzę pdf z niestandardowego wykresu. Jestem w stanie wygenerować pdf za pomocą jspdf. Ale kolor wykresu i kolor czcionki ze strony internetowej są replikowane na pdf. (na wykresie brakuje efektu box-shadow, a na wykresie widać rozmycie). Jak mogę to naprawić? –

0

Czy próbowałeś już canvg? Nie jest bardzo prawdopodobne, że zmniejszy to rozmiar pliku, ale przynajmniej możesz spróbować.

Zobacz fragment w this reply.

+0

yes i m już używa canvg dla przeglądarek IE i Safari. Jest to związane z każdym zmniejszeniem rozmiaru pliku. –

6

Jeśli dodać kilka zdjęć na jednym dokumencie, należy

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

nie

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

inaczej pierwszy obraz zastąpi wszystkie inne.

+0

yes..it był tylko podanym przykładem, pdf.addImage (png, 'PNG', leftmargin, 120, 485, 270, undefined, 'FAST'); w tym niezdefiniowanym, musisz podać inną nazwę za każdym razem, gdy dodasz obraz. W przypadku interfejsu API jest to nazwa Alias, która musi być unikalna dla każdego obrazu. –

+0

Przeskakując, aby powiedzieć, że powyższy przykład zmniejszył również mój plik PDF 4Mb (11 stron, z 10 wykresami na stronę) do 977 kb. Dziękuję bardzo za tę wskazówkę! – JasonMHirst

Powiązane problemy