Html2canvas: рдПрд╕рд╡реАрдЬреА рдкрд░ рдХрдмреНрдЬрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдЕрдкреНрд░реИрд▓ 2012  ┬╖  64рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: niklasvh/html2canvas

рдирдорд╕реНрдХрд╛рд░,

рдХреНрдпрд╛ html2canvas SVG рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

рдкрд░реАрдХреНрд╖рдг \ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдПрд╕рд╡реАрдЬреА рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдХреГрдкрдпрд╛ рдорджрдж рдХреАрдЬрд┐рдПред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ,
рдореИрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ (рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЛрдП рд╣реБрдП svg) рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрд╕рд╡реАрдЬреА рддрддреНрд╡ рдореЗрдВ рдКрдБрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдкрд┐рдХреНрд╕рд▓ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдпрд╛ рдирд╣реАрдВред
рддрдм рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
self.image.src = " рдбреЗрдЯрд╛: рдЫрд╡рд┐ / svg + xml ," + (рдирдпрд╛ XMLSerialial ()))ред serializeToString (рдиреЛрдб);
рд╕реЗрд╡рд╛ рдореЗрд░реЗ:
self.image.src = " рдбреЗрдЯрд╛: рдЫрд╡рд┐ / svg + xml ," + encodeURIComponent ((рдирдпрд╛ XMLSerializer ())ред serializeToString (рдиреЛрдб));

рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред

рд╕рднреА 64 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирд╣реАрдВ рд╡рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреЛрдИ рджреЛрд╖ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдПрдХ рдмрдЧ (рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕, рд╕рдВрд╕реНрдХрд░рдг 12, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд afaik рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдПрд╕рд╡реАрдЬреА рдЫрд╡рд┐ рдХреИрдирд╡рд╛рд╕ рдХреЛ рджрд╛рдЧрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, html2canvas рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЫрд╡рд┐ рдХреЛ рджрд╛рдЧрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдХреИрдирд╡рд╛рд╕ рдХреЛ рдкрдардиреАрдп рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдк toDataUrl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред

рдпрджрд┐ рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрд╕рд╡реАрдЬреА рдЫрд╡рд┐рдпрд╛рдВ рдХреИрдирд╡рд╕ рдХреЛ рдЫреЗрдбрд╝рддреА рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд┐рдХрд▓реНрдк allowTaint рд╕реЗ true рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ SVG рдХреЛ рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрдирд╡реЙрдЗрд╕ SVG рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ SVG рд░реЗрдВрдбрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкрд╛рд░ рдХрд░реЗрдЧрд╛, рддреЛ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рдЧрднрдЧ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреА, рдХреНрдпреЛрдВрдХрд┐ SVG рдХрд╛ рдЙрдкрдпреЛрдЧ HTML рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдкрд░ рдХреИрдирд╡рд╛рд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рддреЗрдЬ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрд╕рд╡реАрдЬреА рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА рдПрдлрдПрдл 12), рд╕рд╛рде рд╣реА рд╕рднреА рд╕реАрдПрд╕рдПрд╕ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП https://github.com/niklasvh/html2canvas/blob/master/src/Parse.js#L1227 рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ

рдирдорд╕реНрдХрд╛рд░,
рдЖрдкрдХреА рд╢реАрдШреНрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХреА: рдиреАрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ (test.js рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ):

setTimeout (рдлрд╝рдВрдХреНрд╢рди () {

        $(h2cSelector).html2canvas($.extend({
            flashcanvas: "../external/flashcanvas.min.js",
            logging: true,
            profile: true,
            useCORS: true,
            allowTaint: true
        }, h2cOptions));
    }, 100);

рдпрд╣ SVG рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрджрд╛рд╣рд░рдг images.html рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрд╕рд╡реАрдЬреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рддреЛ рдпрд╣ рдХреНрд░реЙрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдореИрдВ рдХреНрд░реЛрдо рдореЗрдВ рдЪрд╛рд░реНрдЯ (http://www.highcharts.com/demo/) рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдпрд╣ рдЪрд╛рд░реНрдЯ рдХреЗ x рдЕрдХреНрд╖ рдФрд░ y рдЕрдХреНрд╖ рдХреЛ рддрдм рдкрдХрдбрд╝рддрд╛ рд╣реИ рдЬрдм рдЪрд╛рд░реНрдЯ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди SVG рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХреНрд╕реЗрдВрдЧрд▓ svg рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде img рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛, рдпрд╣ рдХреБрдЫ рднреА рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреНрд░реЛрдо рдХреЗ рд╡рд┐рдкрд░реАрдд, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ, рдпрд╣ рдХреБрдЫ рднреА рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЪрд╛рд░реНрдЯ рдЗрдирд▓рд╛рдЗрди рдПрд╕рд╡реАрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЪрд╛рд░реНрдЯ рдмрд╛рд╣рд░реА svg рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рд╣реИ, рддреЛ рдЪрд╛рд░реНрдЯ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм IE9 рдореЗрдВ рд╣реИ, рдХреБрдЫ рднреА рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдлрдПрдл / рдХреНрд░реЛрдо рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдЖрдк рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдбреНрд░реЙ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреИрдирд╡рд╛рд╕ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдПрд╕рд╡реАрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП +1ред рдореЗрд░реЗ рдкрд╛рд╕ рдмреЗрдмреАрд╣реЗрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдореБрдЭреЗ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХреЗ рд▓рд┐рдП рдПрд╕рд╡реАрдЬреА рдЧреНрд░рд╛рдл рдХреЗ рд╣рд╛рдИрдЪрд░реНрд╕ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕рднреА рд╣рд╛рдИрдЪрд░реНрд╕ рдПрд╕рд╡реАрдЬреА рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкрдХрдбрд╝рд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо "рд╕реЗрд╡ рдЯреВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ" рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@ babyhero184 рдореИрдВрдиреЗ

@joeyrobert рдореИрдВ рднреА рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ highcharts рдФрд░ html2canvas рдХреЗ рд╕рд╛рдеред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реЛрдЧреАред
рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рджред

@joeyrobert @ Jagdeep1 рдХреИрдирд╡рд╛рд╕ рдкрд░ SVG рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Fabric.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

+1

+1

+1

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди?

@majuansari _SVG_ рд╕реЗ _Canvas_ рдФрд░ _Canvas_ рд╕реЗ _image_ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░реЛрдо рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рд▓реЙрдХ рд╣реИред

рдореИрдВ рдЪрд╛рд░реНрдЯ рддрддреНрд╡реЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рд╛рдИрдЪрд░реНрдЯреНрд╕ SVG рдХреЛ рдареАрдХ рд╕реЗ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдЙрд╕рдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдерд╛ред рдпрджрд┐ рдХреЛрдИ рдХрд┐рд╕реА рдЪрд╛рд░реНрдЯ рдХрд╛ jQuery рдЪрдпрдирдХрд░реНрддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдореЗрдВ SVG рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@mbritton рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ http://code.google.com/p/canvg/ (рд╡рд┐рджреЗрд╢реА рдХрд╛рдо рдирд╣реАрдВ)

рд╣рд╛рдВ, рдпрд╣реА рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдерд╛ред

рдореИрдВрдиреЗ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╕рдордп рдХреИрдирд╡рд╕-рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдХреИрдирд╡рд╛рд╕ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде svg рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИред

// targetElem is a jquery obj
function take (targetElem) {
    var nodesToRecover = [];
    var nodesToRemove = [];

    var svgElem = targetElem.find('svg');

    svgElem.each(function(index, node) {
        var parentNode = node.parentNode;
        var svg = parentNode.innerHTML;

        var canvas = document.createElement('canvas');

        canvg(canvas, svg);

        nodesToRecover.push({
            parent: parentNode,
            child: node
        });
        parentNode.removeChild(node);

        nodesToRemove.push({
            parent: parentNode,
            child: canvas
        });

        parentNode.appendChild(canvas);
    });

    html2canvas(targetElem, {
        onrendered: function(canvas) {
            var ctx = canvas.getContext('2d');
            ctx.webkitImageSmoothingEnabled = false;
            ctx.mozImageSmoothingEnabled = false;
            ctx.imageSmoothingEnabled = false;

            canvas.toBlob(function(blob) {
                nodesToRemove.forEach(function(pair) {
                    pair.parent.removeChild(pair.child);
                });

                nodesToRecover.forEach(function(pair) {
                    pair.parent.appendChild(pair.child);
                });
                saveAs(blob, 'screenshot_'+ moment().format('YYYYMMDD_HHmmss')+'.png');
            });
        }
    });
}

рдмрд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рдиреЛрдЯ:
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ canvg рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмрд╕ SVG рдХреЛ рдХреИрдирд╡рд╕ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рд╕рд░рд▓ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЫрд╡рд┐ рдореЗрдВ svg рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИ рдФрд░ рдлрд┐рд░ dataURL рдХреЗ рд░реВрдк рдореЗрдВ рдЫрд╡рд┐ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред

var image = new Image();
var xml = '<svg xmlns=....></svg>';
image.src = 'data:image/svg+xml,' + escape(xml); 
document.getElementById('container').appendChild(image);
image.onload = function() {
    image.onload = function() {};
    var canvas = document.createElement('canvas');
    canvas.width = image.width;
    canvas.height = image.height;
    var context = canvas.getContext('2d');
    context.drawImage(image, 0, 0);
    image.src = canvas.toDataURL();
}

@steren : рдЬрдмрдХрд┐ рдпрд╣ рдХреНрд░реЛрдо рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ, рдЬреЛ рд▓рд╛рдЗрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ NS_ERROR_NOT_AVAILABLE рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рдЫрд╡рд┐ (0, 0, 0) - рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдПрдХ рдмрдЧ рдкрддрд╛ рд╣реИ - [11] рдЬрд╣рд╛рдВ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдПрдХ SecurityError рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред .DataURL () рдЫрд╡рд┐ рдПрдХ рд╣реА рдбреЛрдореЗрди рдкрд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж? Chrome рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ ...

@gifarangw рдЖрдкрдХрд╛ рдХреЛрдб рд╣рд╛рдИрдЪрд░реНрдЯ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдЕрджреНрднреБрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред : +1: рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВрдиреЗ рдирд┐рдХрд╛рд▓реА рдереА рд╡рд╣ рдереА рдХреИрдирд╡рд╛рд╕ред рдПрд▓рдЯреАрдПрд▓рдУрдмреА рднрд╛рдЧред

@ рдЕрдкрдиреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдирд╡реАрдирддрдо рдХреНрд░реЛрдо рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛), рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдФрд░ @gifarangw рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде

    function take(targetElem) {
        // First render all SVGs to canvases
        var elements = targetElem.find('svg').map(function() {
            var svg = $(this);
            var canvas = $('<canvas></canvas>');
            svg.replaceWith(canvas);

            // Get the raw SVG string and curate it
            var content = svg.wrap('<p></p>').parent().html();
            content = content.replace(/xlink:title="hide\/show"/g, "");
            content = encodeURIComponent(content);
            svg.unwrap();

            // Create an image from the svg
            var image = new Image();
            image.src = 'data:image/svg+xml,' + content;
            image.onload = function() {
                canvas[0].width = image.width;
                canvas[0].height = image.height;

                // Render the image to the canvas
                var context = canvas[0].getContext('2d');
                context.drawImage(image, 0, 0);
            };
            return {
                svg: svg,
                canvas: canvas
            };
        });
        targetElem.imagesLoaded(function() {
            // At this point the container has no SVG, it only has HTML and Canvases.
            html2canvas(targetElem[0], {
                onrendered: function(canvas) {
                    // Put the SVGs back in place
                    elements.each(function() {
                        this.canvas.replaceWith(this.svg);
                    });

                    // Do something with the canvas, for example put it at the bottom
                 $(canvas).appendTo('body');
                }
            })
        })
    }

(https://github.com/desandro/imagesloaded рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)

рд╣рд╛рдп рд╕рдм рдмрд╕ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ @Remiremi рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛! рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреЗрдЬ рд╣реИ рдЬрд┐рд╕рдореЗрдВ svg рдореЗрдВ HighStocks рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреНрд░рд╛рдл рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ! рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рджреЛрд╕реНрддреЛрдВ!

@Remiremi @fbotti , рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореИрдВ img.onLoad рдореЗрдВ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рдХреИрдирд╡рд╛рд╕ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛)

рдореИрдВ amcharts рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@guypaskar рдЖрдкрдХреЗ svg рдХреЛ рдЖрдЧреЗ рдХреНрдпреВрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ $(image).appendTo('body'); seting рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП image.onload , рддреЛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдЖрдк рдЕрдорд╛рдиреНрдп рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдЗрдХрди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рддреЛ рдЖрдк рд╕рд╣реА рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ> рджреГрд╢реНрдп рдЫрд╡рд┐ рдФрд░ рддреНрд░реБрдЯрд┐ рджреЗрдЦрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдПрдХ amcharts svg рдХреЛ рдПрдХ рддреНрд╡рд░рд┐рдд рдкреНрд░рдпрд╛рд╕ рджрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП svg рдЯреИрдЧ рдореЗрдВ xmlns="http://www.w3.org/2000/svg" width="1400" height="500" рдХрд╛ рдЧреБрдг рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред (рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рд╕реАрдПрд╕рдПрд╕ рдЧреБрдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕реЗ рдЙрдард╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ред)

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд┐рдХреНрд╕ рдкрд╛рдпрд╛ рд╣реИред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА svg рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рд╣реИред

рдкрд░реНрдпрд╛рдкреНрдд рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ svg рдХрдардмреЛрд▓реА рдХреЛ рдПрдХ рдЫрд╡рд┐ рдХреА рддрд░рд╣ рдорд╛рдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдореВрд▓ рдорд╕рд▓рд╛ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореБрджреНрджреЛрдВ рдиреЗ 2012 рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣рд╛рдВ рдмрддрд╛рдИ рдЧрдИ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рдХреИрдирд╡рдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рднреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

рд╢реЗрд╖ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ # 197 рдФрд░ / рдпрд╛ # 267 рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рдмрдВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣ рдЕрднреА рднреА рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ

0.5 рдПрд╕рд╡реАрдЬреА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИ

рдХрд┐рд╕реА рднреА рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЬрдм 0.5 @niklasvh рдмрд╛рд╣рд░ рдЖ рдЬрд╛рдПрдЧрд╛?

@IvoPereira рдЖрдк # 421 рдореЗрдВ 0.5 рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@niklasvh рдореЗрд░реЗ рдкрд╛рд╕ 0.5 рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдФрд░ рдПрд╕рд╡реАрдЬреА рдЕрднреА рднреА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡рд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? (рдЗрд╕рдХреА рдЗрдирд▓рд╛рдЗрди рдПрд╕рд╡реАрдЬреА)

@ рдпрд╛рдирд┐рдХреЛрд▓рдВрдЧ рдореЗрдВ рдЖрдкрдиреЗ html2canvas.js рдФрд░ html2canvas.svg.js ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jsFiddle рдпрд╛ jsbin рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдпрд╣ рдХрд╛рдо рдорд┐рд▓рд╛ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдЬрдм рдореИрдВрдиреЗ html2canvas рдХрд┐рдпрд╛ рдерд╛ рддреЛ SVG рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП http://d3pie.org

рдпрд╣ рдЗрд╕рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ:

screen

рдпрд╣ html2canvas рдХреЗ рдмрд╛рдж рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

canvas

рд╡рд╛рд╣, рдпрд╣ рдмрд╣реБрдд рдбрд░рд╛рд╡рдирд╛ рд╣реИред рдмрд╕ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╣реА рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдореЛ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл jsFiddle рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ? рдпрд╣ рдореВрд▓ рдореБрджреНрджреЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдирдП html2canvas рдХреЛ jsfiddle рдореЗрдВ рдХреИрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХреНрдпрд╛ рдХреЛрдИ рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

@nikolang рдЖрдк http://rawgit.com/niklasvh/html2canvas/master/dist/html2canvas.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзрдиреНрдпрд╡рд╛рджред рдФрд░ рдПрд╕рд╡реАрдЬреА-рд╕рдВрд╕реНрдХрд░рдг?

рдЗрд╕реА рдкреНрд░рдХрд╛рд░: http://rawgit.com/niklasvh/html2canvas/master/dist/html2canvas.svg.js

рдирдорд╕реНрддреЗ,

рдПрд╕рд╡реАрдЬреА рдореЗрд░реА рддрд░рдл рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╛рд▓реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рдХрд┐рд╕реА рдиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ svg рддрддреНрд╡реЛрдВ рдХреА "рднрд░рдг" рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧрд┐рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

@ рдмреНрд░реЗрдиреНрд░рд╛ , рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╡рд╣ рд╕рдлреЗрдж рд╣реЛ рдЬрд╛рдПред

// Create dummy canvas to get a white background
var destinationCanvas = document.createElement("canvas");
destinationCanvas.width = canvas.width;
destinationCanvas.height = canvas.height;

var destCtx = destinationCanvas.getContext('2d');

//create a rectangle with the desired color
destCtx.fillStyle = "#FFFFFF";
destCtx.fillRect(0,0,canvas.width,canvas.height);

//draw the original canvas onto the destination canvas
destCtx.drawImage(canvas, 0, 0);

var img = destinationCanvas.toDataURL("image/png");

'CanvasRenderingContext2D' рдкрд░ 'drawImage' рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓: рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ HTMLImageElement 'рдЯреВрдЯреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐' рдореЗрдВ рд╣реИред "

HTML рдореЗрдВ svg рдПрд▓рд┐рдореЗрдВрдЯ рд╣реЛрдиреЗ рдкрд░ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВрдиреЗ allowTaint рдХреЛ рд╕рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - svg рддрддреНрд╡ рд╣рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдареАрдХ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ред

NS_ERROR_NOT_AVAILABLE: рдпрд╣ рдПрдХ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдмрдЧ рд╣реИ: https://bugzilla.mozilla.org/show_bug.cgi?id=700533 (AFAICT) рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреГрд╖реНрда рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ (рдмрдЧ рд╕реЗ рдЬреБрдбрд╝рд╛) http://phrogz.net/ SVG / svg_to_png.xhtml

рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб / рдлрд┐рдХреНрд╕ рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕ рддрдп рдХреЛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ @mozilla рдХреЛ рдкреЛрдХ рдХрд░ рд╕рдХреЗ :)

рдпрд╣рд╛рдБ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:
http://stackoverflow.com/questions/18271898/html-and-svg-to-canvas-javascript/32457864#32457864

рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЛрдгреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдПрдХ рджрд╛рдЧреА рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрдЪреНрдЪреЗ рдПрд╕рд╡реАрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

<img svg-2-canvas-src="/assets/your.svg"/>

angular.module('APP')
    .directive('svg2CanvasSrc', function() {
        return {
            restrict: 'A',
            scope: false,
            link: function($scope, $element, $attrs) {

                var svgSrc = $attrs['svg2CanvasSrc'];

                var image = new Image();

                image.onload = function() {
                    image.onload = function() {};
                    var canvas = document.createElement('canvas');
                    canvas.width = image.width;
                    canvas.height = image.height;
                    var context = canvas.getContext('2d');
                    context.drawImage(image, 0, 0);
                    $element[0].src = canvas.toDataURL();
                };

                image.src = svgSrc;
            }
        };
    });

@remiremi рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реИ, svg рдЧрд╛рдпрдм рд╣реИ ..
рдореВрд▓ - https://s29.postimg.org/5lkprhx93/with_SVG.png
рдкрд░рд┐рдгрд╛рдо - https://s23.postimg.org/j1otj2por/without_SVG.png

@remiremi ... рдкреНрд▓рдЧрдЗрди рдХрд╛ рдирд╛рдо рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп

рдореВрд▓ рд░реВрдк рд╕реЗ, html2canvas рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрд╕рд╡реАрдЬреА рдкрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЪреМрдбрд╝рд╛рдИ / рдКрдВрдЪрд╛рдИ рд╕реЗрдЯ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рд╣рд┐рддреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдПрд╕рд╡реАрдЬреА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдЧрдгрдирд╛ рдЪреМрдбрд╝рд╛рдИ / рдКрдВрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВредред 'рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдХреНрд╕рд▓ рдХреЗ рд╕рд╛рде, Booyah

рдЕрднреА рднреА рдмрд╣реБ-рд▓рд╛рдЗрди рд╕реНрдкреИрди рдФрд░ рдбрд┐рд╡ рдХреЗ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдореБрджреНрджреЗ рд╣реИрдВ

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ,
рдореИрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ (рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЛрдП рд╣реБрдП svg) рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрд╕рд╡реАрдЬреА рддрддреНрд╡ рдореЗрдВ рдКрдБрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдкрд┐рдХреНрд╕рд▓ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдпрд╛ рдирд╣реАрдВред
рддрдм рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
self.image.src = " рдбреЗрдЯрд╛: рдЫрд╡рд┐ / svg + xml ," + (рдирдпрд╛ XMLSerialial ()))ред serializeToString (рдиреЛрдб);
рд╕реЗрд╡рд╛ рдореЗрд░реЗ:
self.image.src = " рдбреЗрдЯрд╛: рдЫрд╡рд┐ / svg + xml ," + encodeURIComponent ((рдирдпрд╛ XMLSerializer ())ред serializeToString (рдиреЛрдб));

рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдореИрдВ DOM рдореЗрдВ SVG рдПрд▓рд┐рдореЗрдВрдЯ рдкрд░ html2canvas рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛?

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛!

+1 рдЕрднреА рднреА рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдПрд╕рд╡реАрдЬреА рддрддреНрд╡ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

{
  profile: true,
  allowTaint: false,
  onrendered: function() {
    //...done()
  }
}

рдЕрд░реЗ, рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди (jQuery рдХреЗ рдмрд┐рдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:
рдЙрдкрд╛рдп

let targetElem =document.getElementById ('рдмреЙрдбреА');
nodesToRecover = [];
let nodesToRemove = [];

    let svgElem = targetElem.querySelector('svg')

    let parentNode = svgElem.parentNode;
        // let svg = parentNode.innerHTML;
        let svg = "<svg xmlns=\"http://www.w3.org/2000/svg\" id=\"svg-annotations\" style=\"opacity: 1;\" _ngcontent-c7=\"\">\n\t\t\t<defs><marker id=\"arrow-start\" refY=\"4.5\" markerWidth=\"9.9\" markerHeight=\"9\" orient=\"auto\"><path fill=\"black\" d=\"M 9.9 0 L 9.9 9 L 0 4.5 Z\" /></marker><marker id=\"arrow-end\" refX=\"9.9\" refY=\"4.5\" markerWidth=\"9.9\" markerHeight=\"9\" orient=\"auto\"><path fill=\"black\" d=\"M 0 0 L 0 9 L 9.9 4.5 Z\" /></marker></defs><g class=\"annotation-group\" id=\"measurement-36122\" style=\"opacity: 1;\"><g class=\"annotations\"><g class=\"annotation callout elbow editable \" transform=\"translate(758.541 408.978)\"><g class=\"annotation-connector\"><path class=\"connector\" fill=\"none\" stroke=\"black\" d=\"M 0 0 L 137 137 L 162 137\" /></g><g class=\"annotation-note\" transform=\"translate(162 137)\"><g class=\"annotation-note-content\" transform=\"translate(0 3)\"><rect class=\"annotation-note-bg\" fill=\"white\" fill-opacity=\"0\" x=\"0\" width=\"104.79\" height=\"41.36\" /><text class=\"annotation-note-label\" fill=\"black\" y=\"41.36\" dx=\"0\"><tspan x=\"0\" dy=\"0.8em\" /></text><text class=\"annotation-note-title\" font-weight=\"bold\" fill=\"black\"><tspan x=\"0\" dy=\"0.8em\">Face</tspan><tspan x=\"0\" dy=\"1.2em\">:5453831.5mm┬▓</tspan></text></g><path class=\"note-line\" stroke=\"black\" d=\"M 0 0 L 104.79 0\" /><circle class=\"handle \" cursor=\"move\" fill=\"grey\" fill-opacity=\"0.1\" stroke=\"grey\" stroke-dasharray=\"5\" cx=\"0\" cy=\"0\" r=\"10\" /></g></g></g></g><g class=\"annotation-group\" id=\"measurement-59622\" style=\"opacity: 1;\"><g class=\"annotations\"><g class=\"annotation callout elbow editable \" transform=\"translate(889.656 387.507)\"><g class=\"annotation-connector\"><path class=\"connector\" fill=\"none\" stroke=\"black\" d=\"M 0 0 L 137 137 L 162 137\" /></g><g class=\"annotation-note\" transform=\"translate(162 137)\"><g class=\"annotation-note-content\" transform=\"translate(0 3)\"><rect class=\"annotation-note-bg\" fill=\"white\" fill-opacity=\"0\" x=\"0\" width=\"104.79\" height=\"41.36\" /><text class=\"annotation-note-label\" fill=\"black\" y=\"41.36\" dx=\"0\"><tspan x=\"0\" dy=\"0.8em\" /></text><text class=\"annotation-note-title\" font-weight=\"bold\" fill=\"black\"><tspan x=\"0\" dy=\"0.8em\">Face</tspan><tspan x=\"0\" dy=\"1.2em\">:5453831.5mm┬▓</tspan></text></g><path class=\"note-line\" stroke=\"black\" d=\"M 0 0 L 104.79 0\" /><circle class=\"handle \" cursor=\"move\" fill=\"grey\" fill-opacity=\"0.1\" stroke=\"grey\" stroke-dasharray=\"5\" cx=\"0\" cy=\"0\" r=\"10\" /></g></g></g></g></svg>";

        this.canvas = document.createElement('canvas');
        this.canvas.setAttribute('id', '_canvas');

        canvg(this.canvas, svg, {renderCallback: function(){
            console.log(this);
        }});

        nodesToRecover.push({
            parent: parentNode,
            child: svgElem
        });
        parentNode.removeChild(svgElem);

        nodesToRemove.push({
            parent: parentNode,
            child: this.canvas
        });

        parentNode.appendChild(this.canvas);
        let data = this.canvas.toDataURL('image/png', 0.5);
        console.log(data);

рдореИрдВ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ, IE11 рдореЗрдВ рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди, рдореИрдВ рдХреИрдирд╡рд╛рд╕ рдХреЛ рд╡реЗрдмрдкреЗрдЬ рдкрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

рдирдорд╕реНрдХрд╛рд░ред рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ svg рдЬрдм рдпрд╣ <image> рдЯреИрдЧ рд╣реЛрддрд╛ рд╣реИред
barchart (24)

рдирдореВрдирд╛ svg

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <image xlink:href="https://mdn.mozillademos.org/files/6457/mdn_logo_only_color.png" height="200" width="200"/>
</svg>

Jsfiddle http://jsfiddle.net/maestro888/fmjywksq/ рдореЗрдВ рдирдореВрдирд╛

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд┐рдХреНрд╕ рдкрд╛рдпрд╛ рд╣реИред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА svg рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рд╣реИред

рдкрд░реНрдпрд╛рдкреНрдд рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ svg рдХрдардмреЛрд▓реА рдХреЛ рдПрдХ рдЫрд╡рд┐ рдХреА рддрд░рд╣ рдорд╛рдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди IE11 рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ ...

рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рд╣рд▓ рдорд┐рд▓ рдЧрдпрд╛ред
рдмрд╕ рдЕрдкрдиреЗ рдЬреЗрдПрд╕ рдлрд┐рдбреЗрд▓ рдХреА рдЬрд╛рдБрдЪ рдХреА рдФрд░ рдпрд╣ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╕рд╛рджрд░,

рдмрд░реНрдирд╛рд░реНрдб рдЯреАрдП рдмреЗрдХрд░

рдмреБрдз рдкрд░, 27 рдорд╛рд░реНрдЪ 2019 рдХреЛ рд╢рд╛рдо 4:34 рдмрдЬреЗ рдПрд▓реЗрд╕реЗрдВрдбреНрд░реЛ рдХреИрдВрдбрд┐рдиреА рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд┐рдХреНрд╕ рдкрд╛рдпрд╛ рд╣реИред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА svg рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рд╣реИред

рдкрд░реНрдпрд╛рдкреНрдд рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ svg рдХрдардмреЛрд▓реА рдХреЛ рдорд╛рдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдПрдХ рдЫрд╡рд┐ рдХреА рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди IE11 рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ ...

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/niklasvh/html2canvas/issues/95#issuecomment-477242196 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AM7ZzLPsl0WJS7gGI9npSsRxR33FCnN9ks5va52bgaJpZM4AD-Sb
ред

рдореБрдЭреЗ рдХреИрдирд╡рдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрд╣ IE11 рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

JQuery рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП рдореЗрд░рд╛ рдкреБрдирдГ рд╡рд┐рд╕реНрддреГрдд рд╕реНрдирд┐рдкреЗрдЯ:

let svgIcons = document.querySelectorAll('.svg-icon');

for (let i = 0; i < svgIcons.length; ++i) {
  let curSvg = svgIcons[i];
  let canvas;
  let xml;

  // Size and color needed for every browser
  curSvg.setAttribute('width', curSvg.parentNode.offsetWidth);
  curSvg.setAttribute('height', curSvg.parentNode.offsetHeight);
  curSvg.setAttribute('style', 'fill: blue');

  canvas = document.createElement('canvas');
  canvas.className = 'screenShotTempCanvas';
  xml = new XMLSerializer().serializeToString(curSvg);
  canvg(canvas, xml);
  curSvg.parentNode.insertBefore(canvas, curSvg.nextSibling);
  curSvg.style.display = 'none';
 }

рд╡рд╛рд╣реН рднрдИ рд╡рд╛рд╣

рдереВ рдкрд░, 28 рдорд╛рд░реНрдЪ 2019, 08:49 рдПрд▓реЗрд╕реЗрдВрдбреНрд░реЛ рдХреИрдВрдбрд┐рдиреА, рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореБрдЭреЗ canvg рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ https://github.com/canvg/canvg ,
рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдпрд╣рд╛рдВ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ
https://stackoverflow.com/questions/34042440/using-html2canvas-to-render-a-highcharts-chart-to-pdf-doesnt-work-on-ie-and-fir :
рдпрд╣ IE11 рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/niklasvh/html2canvas/issues/95#issuecomment-47750s21
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AM7ZzKNy1GOgQU9TVv7PGCi4fJvYSxDVks5vbIIOgaJpZM4AD-bb
ред

рд╣рд╛рдп @niklasvh рдЕрдкрдиреЗ html2canvas рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рджреЗрдЦрдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛, рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА npm рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрдирд╡рд╛рд╕ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ svg рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ "1.0.0-Alpha.12
"рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ" 1.0.0-rc.1 "рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣рдорд╛рд░реЗ anguar6 рдЖрд╡реЗрджрди рдореЗрдВ, рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд╕реВрдЪреА рд╕реЗ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдорд╕реНрдпрд╛ рдЖ рдЬрд╛рдПрдЧреА svg рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ Svg рд╣реИ 100% рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдбрд┐рд╡ рдореЗрдВ svg рдЯреИрдЧ рднреА рдореМрдЬреВрдж рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ рдХреИрдирд╡рд╛рд╕ рдХреЛ рднреА рдиреЗрд╕реНрдЯреЗрдб рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рдкреЗрдЬ рдХреЛ png рдЗрдореЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЫрд╡рд┐ рдореЗрдВ рдХреЗрд╡рд▓ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд svg рдЖрдЗрдХрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдореМрдЬреВрджрд╛ рдХреИрдирд╡рд╕ рднреА рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдПрдХ рдФрд░ рдЪреАрдЬ рдПрдХ рдмрд╛рд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдореЗрд░реЗ рджреВрд╕рд░реЗ рдкреЗрдЬ svg рд╕рднреА рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕реНрдХреНрд░реАрди рд╢реЙрдЯ рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рд╣реИ рдХреГрдкрдпрд╛ рдПрдХ рдмрд╛рд░ рджреЗрдЦреЗрдВ рдФрд░ рдореБрдЭреЗ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВред
html2canvas (this.screen.nativeElement, {useCORS: true})ред рдлрд┐рд░ (рдХреИрдирд╡рд╛рд╕ => {
this.canvas.nativeElement.src = рдХреИрдирд╡рд╛рд╕.toDataURL ('рдЫрд╡рд┐ / рдкреАрдПрдирдЬреА');
this.downloadLink.nativeElement.href = рдХреИрдирд╡рд╛рд╕.toDataURL ('рдЫрд╡рд┐ / рдкреАрдПрдирдЬреА');
this.downloadLink.nativeElement.download = 'рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ.png';
this.downloadLink.nativeElement.click ();
};

html2canvas_orginal_Before export
html2canvas_orginal_after export
html2canvas_exported image

testpdf (1) .pdf
рдирдорд╕реНрддреЗ,
рдореБрдЭреЗ рдЕрдХреНрд╖ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЪрд╛рд░реНрдЯ рдХрд╛ рдмрд╛рдХреА рдХреНрд╖реЗрддреНрд░ рдХрд╛рд▓рд╛ рд╣реИред рдХреЛрдИ рднреА рд╕реБрдЭрд╛рд╡ рд╣реИ

рд╣рд╛рдп @niklasvh рдЕрдкрдиреЗ html2canvas рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рджреЗрдЦрдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛, рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА npm рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрдирд╡рд╛рд╕ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ svg рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ "1.0.0-Alpha.12
"рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ" 1.0.0-rc.1 "рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣рдорд╛рд░реЗ anguar6 рдЖрд╡реЗрджрди рдореЗрдВ, рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд╕реВрдЪреА рд╕реЗ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдорд╕реНрдпрд╛ рдЖ рдЬрд╛рдПрдЧреА svg рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ Svg рд╣реИ 100% рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдбрд┐рд╡ рдореЗрдВ svg рдЯреИрдЧ рднреА рдореМрдЬреВрдж рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ рдХреИрдирд╡рд╛рд╕ рдХреЛ рднреА рдиреЗрд╕реНрдЯреЗрдб рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рдкреЗрдЬ рдХреЛ png рдЗрдореЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЫрд╡рд┐ рдореЗрдВ рдХреЗрд╡рд▓ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд svg рдЖрдЗрдХрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдореМрдЬреВрджрд╛ рдХреИрдирд╡рд╕ рднреА рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдПрдХ рдФрд░ рдЪреАрдЬ рдПрдХ рдмрд╛рд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдореЗрд░реЗ рджреВрд╕рд░реЗ рдкреЗрдЬ svg рд╕рднреА рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕реНрдХреНрд░реАрди рд╢реЙрдЯ рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рд╣реИ рдХреГрдкрдпрд╛ рдПрдХ рдмрд╛рд░ рджреЗрдЦреЗрдВ рдФрд░ рдореБрдЭреЗ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВред
html2canvas (this.screen.nativeElement, {useCORS: true})ред рдлрд┐рд░ (рдХреИрдирд╡рд╛рд╕ => {
this.canvas.nativeElement.src = рдХреИрдирд╡рд╛рд╕.toDataURL ('рдЫрд╡рд┐ / рдкреАрдПрдирдЬреА');
this.downloadLink.nativeElement.href = рдХреИрдирд╡рд╛рд╕.toDataURL ('рдЫрд╡рд┐ / рдкреАрдПрдирдЬреА');
this.downloadLink.nativeElement.download = 'рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ.png';
this.downloadLink.nativeElement.click ();
};

html2canvas_orginal_Before export
html2canvas_orginal_after export
html2canvas_exported image

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛, рдХреНрд▓реЛрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ svg рдЦреЛрдЬрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐

HTML2canvas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ SVG рдХреЗ рд▓рд┐рдП рдКрдБрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЗрд╕ рддрд░рд╣ рдореИрдВ svg рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

var selectItem = document.querySelector ("ред ChartWrapper");
var svgElements = selectItem.querySelectorAll ('svg');
рдХреЗ рд▓рд┐рдП (рдЖрдЗрдП = 0; рдореИрдВ <svgElements.length; рдореИрдВ ++) {
selectItem.getElementsByTagName ("svg") [i] .style.height = document.getElementsByTagName ("svg") [i] .getBoundingClientClure () рдКрдВрдЪрд╛рдИ;
рдЪрдпрдирд┐рдд item.getElementsByTagName ("svg") [i] .style. рдЙрдкрд▓рдмреНрдзрддрд╛ = document.getElementsByTagName ("svg") [i] .getBoundingClientRect () рдЪреМрдбрд╝рд╛рдИ;
}
html2canvas (selectItem, {backgroundColor: '# 000', allowTaint: true})ред рдлрд┐рд░ (рдХреИрдирд╡рд╛рд╕ =) {ред
var myImage = рдХреИрдирд╡рд╛рд╕ред
window.location.href = myImage;
})
рдХреЗ рд▓рд┐рдП (рдЖрдЗрдП = 0; рдореИрдВ <svgCount? i ++) {
рдЪрдпрдирд┐рдд item.getElementsByTagName ("svg") [i] .style.height = '100%';
рдЪрдпрдирд┐рдд Item.getElementsByTagName ("svg") [i] .style. рдЙрдкрд▓рдмреНрдзрддрд╛ = '100%';
}

// use html2canvas in react project when i need a screenshot for the svg
/**
 * svg to canvas
 * <strong i="5">@param</strong> targetElem
 * <strong i="6">@return</strong> {Promise<[]>} // return svg elements
 */
async function svgToCanvas(targetElem) {
  let nodesToRecover = [], nodesToRemove = [], svgElems = targetElem.querySelectorAll('svg');

  for (let i = 0; i < svgElems.length; i++) {
    let node = svgElems[i], parentNode = node.parentNode, svg = parentNode.innerHTML,
      canvas = document.createElement('canvas'),
      ctx = canvas.getContext('2d');
    canvas.setAttribute('data-cover', 'svg');
    const v = await Canvg.from(ctx, svg);
    v.start();
    // record svg elements
    nodesToRecover.push({
      parent: parentNode,
      child: node
    });
    parentNode.removeChild(node);
    //  record canvas elements
    nodesToRemove.push({
      parent: parentNode,
      child: canvas
    });

    parentNode.appendChild(canvas);
  }
  return nodesToRecover;
}

/**
 * recover canvas to svg
 * <strong i="7">@param</strong> targetElem
 * <strong i="8">@param</strong> svgElems // need to recover svg elements
 * <strong i="9">@return</strong> *
 */
function recoverCanvasToSvg(targetElem, svgElems) {
  let canvasElems = targetElem.querySelectorAll("canvas[data-cover='svg']");
  if(!targetElem){
    throw new Error('must have targetElem param')
  }
  if(!isArray(svgElems) && svgElems.length !== canvasElems.length) {
    throw new Error('svgElems must be an Array, and it`s length equal to canvasElems`s length')
  }
  for(let i = 0; i < canvasElems.length; i++){
    let node = canvasElems[i], parentNode = node.parentNode;
    parentNode.removeChild(node);
    parentNode.appendChild(svgElems[i]?.child);
  }
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

AlphaDu picture AlphaDu  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

deepender87 picture deepender87  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

celik75 picture celik75  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Josh10101010 picture Josh10101010  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Loki180 picture Loki180  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ