<p>html2canvas๋Š” IE11์—์„œ SVG๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2018๋…„ 03์›” 20์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: niklasvh/html2canvas

๋ช…์„ธ์„œ:

  • html2canvas ๋ฒ„์ „ ํ…Œ์ŠคํŠธ: 1.0.0-alpha.10
  • ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ฒ„์ „: Internet Explorer 11 ๋ฐ ๋ฒ„์ „: 11.309.16299.0
  • ์šด์˜ ์ฒด์ œ: ์œˆ๋„์šฐ 10

๋ฒ„๊ทธ ๋ณด๊ณ ์„œ:

๋ฌธ์ œ
html2canvas๋Š” IE11์—์„œ SVG๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„
jsFiddle์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค: https://jsfiddle.net/coolbean/ekshfuLz/17/

  1. html2canvas ๋ฐ es6promise ์„ค์น˜
 var Promise = require('es6-promise').Promise;
 import html2canvas from "html2canvas";
  1. SVG ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” DOM์—์„œ html2canvas๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
html2canvas(SVGsource).then(function(canvas) {
  document.body.appendChild(canvas);
});

Chrome์—์„œ ์œ„์—์„œ ์‹œ๋„ํ–ˆ์„ ๋•Œ html2canvas๋Š” "1" ์ด๋ฏธ์ง€ ๋กœ๋“œ๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ IE11์€ "0" ์ด๋ฏธ์ง€ ๋กœ๋“œ๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์บ”๋ฒ„์Šค๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์˜ค๋ฅ˜ ๋กœ๊ทธ๊ฐ€ ์—†์œผ๋ฉฐ,
    ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋Š” SVG ํƒœ๊ทธ์˜ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹1.0.0-rc.1์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. IE11์€ ํ•˜์ด์ฐจํŠธ(svg ์บ”๋ฒ„์Šค)๋ฅผ ๋ณผ ์ˆ˜ ์—†์ง€๋งŒ Chrome ๋ฐ Firefox๋Š” ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  18 ๋Œ“๊ธ€

์—…๋ฐ์ดํŠธ
๋ฒ„์ „์„ [email protected] ์—์„œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

// import the following 2
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.5.0-beta4/html2canvas.js"
                type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.5.0-beta4/html2canvas.svg.js"
                type="text/javascript"></script>

์งˆ๋ฌธ
๋ฒ„์ „ "1.0.0-alpha.10"์—๋„ "html2canvas.svg.js"๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Paul-Kijtapart ์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š”๋ฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?
ํ˜„์žฌ ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ, ์—ฃ์ง€, ํฌ๋กฌ, ์˜คํŽ˜๋ผ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด HTML2PDF๊ฐ€ firefox์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— SVG๋ฅผ ์ง€์›ํ•˜๋Š” [email protected] ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ v1.0.0-alpha.11(์ตœ์‹  ๋ฒ„์ „)์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด pdf ํŒŒ์ผ์— SVG๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
0.5.0-beta4๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Firefox๋Š” ๋‹จ์ผ ํŒŒ์ผ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @GoodJeans ์ž…๋‹ˆ๋‹ค .

์ง„์ „
"๊ทœ๋ชจ" ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— "0.5.0-beta4" ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋„
์ตœ๊ทผ์— ๋ฒ„์ „์„ "v1.0.0-alpha.11"๋กœ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ ๋ณ€๊ฒฝ ๋กœ๊ทธ์— ๋”ฐ๋ฅด๋ฉด IE11 ๊ตฌ์„ฑ์›์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด ์ตœ์‹  ๋ฒ„์ „ "v1.0.0-alpha.11"์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ html2canvas๋Š” IE11์—์„œ ๋Œ€๋ถ€๋ถ„์˜ SVG ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์บก์ฒ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ
html2canvas์—์„œ ์ œ๊ณตํ•˜๋Š” ๋กœ๊ทธ์— ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์€ ์•„๋งˆ๋„ alpha.10๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํฌ๋กฌ:

1468ms html2canvas: Finished parsing node tree
1487ms html2canvas: Finished loading 3 images (3)ย [img, img, img]
1489ms html2canvas: Starting renderer

IE11 ์‚ฌ์šฉ

2137ms html2canvas: Starting node parsing
2451ms html2canvas: Finished parsing node tree
2455ms html2canvas: Finished loading 0 images 
2455ms html2canvas: Starting renderer

์œ„์˜ ๋กœ๊ทธ์—์„œ Chrome๊ณผ ๋‹ฌ๋ฆฌ IE11์€ SVG DOM์—์„œ 3๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ์บก์ฒ˜ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@Paul-Kijtapart ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์•ŒํŒŒ ๋ฒ„์ „์€ ์•ˆํƒ€๊น๊ฒŒ๋„ Internet Explorer์—์„œ SVG๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ html2canvas์™€ ํ•จ๊ป˜ eKoopmans/html2pdf๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ie 11์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ = document.getElementById('contentToConvert');
html2canvas(๋ฐ์ดํ„ฐ, {
onrendered: ํ•จ์ˆ˜(์บ”๋ฒ„์Šค) {
imgWidth = 208;
ํŽ˜์ด์ง€ ๋†’์ด = 295;
let imgHeight = canvas.height * imgWidth / canvas.width;
let heightLeft = imgHeight;
const contentDataURL = canvas.toDataURL('์ด๋ฏธ์ง€/png')
let pdf = new jspdf('p', 'mm', 'a4'); // PDF์˜ A4 ํฌ๊ธฐ ํŽ˜์ด์ง€
์œ„์น˜ = 0์œผ๋กœ ๋‘์‹ญ์‹œ์˜ค.
pdf.addImage(contentDataURL, 'PNG', 0, ์œ„์น˜, imgWidth, imgHeight)
pdf.save("testf .pdf'); // ์ƒ์„ฑ๋œ PDF
}
});

์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ IE 11์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ถ€ ํ•˜์ด์ฐจํŠธ ๊ทธ๋ž˜ํ”„(svg)๊ฐ€ ์žˆ๋Š” ๋ณด๊ณ ์„œ ํŽ˜์ด์ง€์šฉ PDF ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. html2canvas์™€ jspdf๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฒ„์ „์—์„œ ์ „ํ™˜ ํ•  ๋•Œ [email protected]์„ ์— [email protected] , ๊ทธ๊ฒƒ์€ highchart ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ ˆ์ด์•„์›ƒ ๋“ฑ์˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€์žˆ๋‹ค. [email protected] ์„ ์‚ฌ์šฉํ•˜๋ฉด ์บ”๋ฒ„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋“  ํ•˜์ด์ฐจํŠธ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋น„์–ด ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ์ƒˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹1.0.0-rc.1์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. IE11์€ ํ•˜์ด์ฐจํŠธ(svg ์บ”๋ฒ„์Šค)๋ฅผ ๋ณผ ์ˆ˜ ์—†์ง€๋งŒ Chrome ๋ฐ Firefox๋Š” ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ 1.0.0-rc.3์˜ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
๋˜ํ•œ ๋ฌด์งˆ์„œํ•œ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

1.0.0-rc.5๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Bill Gates ์”จ๋Š” ์ฆ‰์‹œ IE์— ์ง€์› ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆฌ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿผ ํฌ๊ธฐํ• ์ˆ˜๋„....

์†Œ์‹์ด ์žˆ๋‚˜์š”? ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ IE11์˜ ์ข‹์€ pdf์ž…๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ svg๋กœ IE11์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@kuldip27792
๋จผ์ € canvg ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ html2canvas๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‚ด ํŒ€์›์ด ๋Œ€์•ˆ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. PDF๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ต์…˜์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๋‹จ๊ณ„. google-chrome ์„ค์น˜
2๋‹จ๊ณ„. google-chrome ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง๋œ html์„ png/pdf๋กœ ์บก์ฒ˜

์˜ˆ
ํฌ๋กฌ --headless --print-to-pdf="d:\{{๊ฒฝ๋กœ ๋ฐ ํŒŒ์ผ ์ด๋ฆ„}}.pdf" https://google.com

์ด ๊ฒฝ์šฐ ์ƒ์„ฑ๋œ PDF๋Š” ์‚ฌ์šฉ ์ค‘์ธ ๋ธŒ๋ผ์šฐ์ €์— ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ ์Šคํƒ€์ผ์ด ๋ฉ๋‹ˆ๋‹ค.
๊นŒ๋‹ค๋กญ์ง€๋งŒ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜์‹ญ์‹œ์˜ค.

@fiftyk ๋‚˜๋Š”
@martinknc ์ œ์•ˆ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์‹ค์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@kuldip27792 ์šฐ๋ฆฌ๋Š” IE11์„ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฒ„ํŠผ์œผ๋กœ ์ œ๊ฑฐ๋œ ํŽ˜์ด์ง€๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข‹์ง€๋Š” ์•Š์ง€๋งŒ ์šฐ๋ฆฌ ๊ณ ๊ฐ์—๊ฒŒ๋Š” ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@fiftyk ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ํ•˜๊ณ ์žˆ๋Š” ์ผ์€ ๋ชจ๋“  svg ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ž์ฒด ์œ„์น˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ html2canvas์—์„œ ๋งŒ๋“  ์บ”๋ฒ„์Šค์— ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ๋งˆ์›Œ์š” ํ˜•.

๋„ค, ahmeturun์ฒ˜๋Ÿผ, ์ด๊ฒƒ์€ ์ €๋„ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์ฒจ๋ถ€๋œ ๊ฒƒ์€ svgs๊ฐ€ ์Šคํฌ๋ฆฐ์ƒท์— ๋ Œ๋”๋ง๋˜๋„๋ก ํ•˜๋Š” TypeScript ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
`
'canvg'์—์„œ { Canvg } ๊ฐ€์ ธ์˜ค๊ธฐ;
...
๊ฐœ์ธ convertSvgD3ChartsToPngs(): HTMLImageElement[] {
const pngD3Charts: HTMLImageElement[] = [];

Array.from(document.getElementsByTagName('svg')).map(svg => {
ํ•˜์ž svgD3ChartCanvas = document.createElement('์บ”๋ฒ„์Šค');

        // Increase the Pixel Density for the Screenshot
        svgD3ChartCanvas.width = parseInt(svg.getAttribute('width')) * 4;
        svgD3ChartCanvas.height = parseInt(svg.getAttribute('height')) * 4;

        let canvasContext = svgD3ChartCanvas.getContext('2d');

        // Use Canvg to convert the svg into a png
        let convertedSvgToPng = Canvg.fromString(
            canvasContext,
            (svg.parentNode as HTMLElement).innerHTML,
            {
                ignoreDimensions: true,
                scaleWidth: svgD3ChartCanvas.width,
                scaleHeight: svgD3ChartCanvas.height
            }
        );
        convertedSvgToPng.start();

        // Attach new png
        let pngD3Chart = new Image();
        pngD3Chart.src = svgD3ChartCanvas.toDataURL('image/png');
        pngD3Chart.style.width = '100%';
        pngD3Charts.push(pngD3Chart);

        // Remove HTML Attribute and use CSS
        (pngD3Chart as any).width = '';
        svg.parentNode.parentNode.appendChild(pngD3Chart);
        (svg.parentNode as HTMLElement).style.visibility = 'hidden';
        (svg.parentNode as HTMLElement).style.height = '0';
        (svg.parentNode as HTMLElement).style.minHeight = '0';
    });
    return pngD3Charts;
}`
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰