Html2canvas: Chrome / Chromium์—์„œ ๋น„์ •์ƒ์ ์ธ ๋ฌธ์ž ๊ฐ„๊ฒฉ

์— ๋งŒ๋“  2017๋…„ 11์›” 19์ผ  ยท  25์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: niklasvh/html2canvas

์ „ํ™” ํ•  ๋•Œ :

html2canvas(document.getElementsByClassName('console'), {
      onrendered: function(canvas) {
        var img = canvas.toDataURL()
        var iframe = '<iframe src="' + img + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen></iframe>'
        var x = window.open();
        x.document.open();
        x.document.write(iframe);
        x.document.close();
      },
      letterRendering: true,
    });

letterRendering ์œ ๋ฌด์— ๊ด€๊ณ„์—†์ด Chrome์ด ์ถœ๋ ฅํ•˜๋Š” ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

html2canvasbug

Firefox์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

screenshot-2017-11-19 http localhost

๊ทธ๋ ‡๊ฒŒ ๋ Œ๋”๋งํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์Šคํฌ๋ฆฐ ์ƒท์„ ์ฐ์œผ๋ ค๋Š” div๋กœ ์ด๋™ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•œ ๋‹ค์Œ " font-variant: normal; "๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

๋ฌธ์ž ๊ฐ„๊ฒฉ (์ด ๊ฒฝ์šฐ ๋‹จ์–ด ๊ฐ„๊ฒฉ)์€ ์‹ค์ œ๋กœ ์ •ํ™• ํ•ด ๋ณด์ด์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ฒƒ์€ ๊ธ€๊ผด ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฒ„์ „์˜ html2canvas๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? jsfiddle์—์„œ ๋ฌธ์ œ๋ฅผ ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘ : letterRendering์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ธ๊ธ‰ ํ•œ๋Œ€๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค,

0.5.0-beta4 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ๊ฐ„๊ฒฉ์ด ์ •ํ™• ํ•ด ๋ณด์ธ๋‹ค๋Š” ์˜๋ฏธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ œ๊ฐ€ ๊ณต์œ  ํ•œ ์ฒซ ๋ฒˆ์งธ ์‚ฌ์ง„์„ ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”? ๊ธ€๊ผด์ด ๋‹จ์–ด ์‚ฌ์ด์— ๊ทธ๋Ÿฌํ•œ ๊ฐ„๊ฒฉ์„ ๋งŒ๋“ค๊นŒ์š”?

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค CodeMirror์„ : ๋ Œ๋”๋ง๋˜๋Š” ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ, ๊ตฌ์ฒด์ ์œผ๋กœ ๊ฐ๋„ ๋ž˜ํผ NG2 - codemirror .

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ์•„๋ฌด ์†Œ์šฉ์ด์—†๋Š” ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•ด ๋ณด์•˜๋‹ค.

ํŒŒ์ด์–ด ํญ์Šค์™€ ํฌ๋กฌ์—์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ์— ๋ฌธ์ž ๊ฐ„๊ฒฉ CSS ๊ทœ์น™์ด์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ ๋‹จ์–ด ์‚ฌ์ด์— ํฐ ๊ฐ„๊ฒฉ์ด์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒ„์ „ 0.4.1์—์„œ๋Š” ํ…์ŠคํŠธ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์˜์‚ฌ ์š”์†Œ (: before : after)๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

letter-spacing ๊ทœ์น™์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์œผ๋กœ ๋Œ์•„ ๊ฐ‘๋‹ˆ๊นŒ? ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์˜ CSS ๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ code-mirror ์˜ CSS ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ CSS์—์„œ ๋ฌธ์ž ๊ฐ„๊ฒฉ ๊ทœ์น™์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋‹จ์–ด ์‚ฌ์ด์— ํฐ ๊ณต๋ฐฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ธ€์ž ๊ฐ„๊ฒฉ ๋ถ€๋ถ„์˜ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์—์„œ ๋ฌด์–ธ๊ฐ€์ž…๋‹ˆ๋‹ค.

์ตœ์‹  ์ •๋ณด! ์ €๋Š” master์˜ ์ตœ์‹  ์†Œ์Šค์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์œผ๋ฉฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์ •๋ง ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด์ „์—๋Š” v0.5.0-beta4 ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : firefox์—์„œ 1 ๊ฐœ์˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๊ฐ€ ํ…์ŠคํŠธ๋กœ ์ž˜๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
-webkit-background-clip : ํ…์ŠคํŠธ;
-webkit-text-fill-color : ํˆฌ๋ช…;
์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ ํฌ๋กฌ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด CSS์—์„œ letter-spacing ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ v0.5.0-beta4 ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ๋งˆ์Šคํ„ฐ ์†Œ์Šค์—์„œ ๋นŒ๋“œ ํ•ด๋ณด์‹ญ์‹œ์˜ค.

์™„๋ฃŒ๋˜์—ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ณ  ๋””์Šคํ”Œ๋ ˆ์ด๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

https://github.com/niklasvh/html2canvas/commit/77d258f1d8eeccf7e38235463a293b512c1ca3d0 ์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์†๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

screenshot_2017-12-18_09-56-43

์š”์†Œ๋ฅผ ๋ Œ๋”๋ง ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

html2canvas(document.body).then(function(canvas) {      
      document.body.appendChild(canvas);
});    

๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ ํ•œ ์ตœ์‹  ์‹œํ—˜ํŒ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ด์ „ ๋ฒ„์ „์„ ๊ต์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

@christopherkade ๋Š” letterRendering: true ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

์Šฌํ”„๊ฒŒ๋„ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let element = document.getElementById('console');
const options = {
  letterRendering: true
};

html2canvas(element, options).then(function(canvas) {      
  document.body.appendChild(canvas);

  var url = canvas.toDataURL();
  var img = '<img src="' + url + '" style="border:0;"></img>'
  var x = window.open();
  x.document.open();
  x.document.write(img);
  x.document.close();
});

์ €์žฅ์†Œ์— ์ œ๊ณต๋œ ์˜ˆ์ œ๋ฅผ ์‹œ๋„ํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค (๋งค์šฐ ๊นจ๋—ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

// Package used to detect the browser used by the user
const browser = detect();
const element = document.getElementById('console');

// Set up my options
let options = {};
// For some reason foreignObjectRendering solves the spacing issue on Chrome but gives an error on Firefox, so I detect the browser and apply the adequate options.
if (browser && browser.name === 'chrome') {      
  options = {
    useCORS: true,
    foreignObjectRendering: true
  };  
}

// Open the canvas in a new window
html2canvas(element, options).then(function(canvas) {
  const url = canvas.toDataURL();
  const img = '<img src="' + url + '" style="border:0;"></img>'
  const x = window.open();
  x.document.open();
  x.document.write(img);
  x.document.close();
});

๋‘ ๋ฒˆ์งธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ Firefox์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํฌ์ฐฉ๋˜์ง€ ์•Š์Œ (์•ฝ์†) : [์˜ˆ์™ธ ... "์‹คํ–‰๋˜์ง€ ์•Š์€ ๋ฐฉ๋ฒ•"...

๊ฐ™์€ ๋ฌธ์ œ !!

HTML ๋ณธ๋ฌธ์—์„œ CSS ์†์„ฑ font-variant-numeric : ratioal-nums ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

font-variant: tabular-nums; ( in antd.css ) ์ œ๊ฑฐ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
2018-12-19 19 20 38

์•„๋ž์–ด์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@mohafouad +1

์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ 2xSamurai no :(

์Šคํฌ๋ฆฐ ์ƒท์„ ์ฐ์œผ๋ ค๋Š” div๋กœ ์ด๋™ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•œ ๋‹ค์Œ " font-variant: normal; "๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ „์ฒด ์ฝ˜ํ…์ธ ์˜ ์™ธ๋ถ€ div์— font-variant: normal !important ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค (antd ํ”„๋กœ์ ํŠธ์—์„œ).

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋‚˜๋ฅผ ๋ฏธ์น˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค
image

font-variant : normal! important ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

@ Malarkey-Jhu์™€ @maaoui ์˜ ๋Œ€๋‹ต์ด ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ : ๊ธ€๊ผด ํŒจ๋ฐ€๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ณ  ๊ฐ„๊ฒฉ์ด ๋งค์šฐ ๋ถˆ์•ˆ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋‚˜๋Š” ๊ฒน์น˜๋Š” ๊ธ€์ž๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ํ•˜๋Š” ์ผ : ๋‚ด๋ณด๋‚ด๊ธฐ ์ค‘์— ํ…์ŠคํŠธ๊ฐ€์žˆ๋Š” ์š”์†Œ์—์„œ element.style.setProperty ( 'font-variant', 'normal')์„ ํ˜ธ์ถœํ•˜๋ฉด ๊ธ€๊ผด ๋ชจ์Œ์ด ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜๊ณ  ๊ฐ„๊ฒฉ์ด ๋ชจ๋‘ ๋ถˆ์•ˆ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋งˆ์นœ ํ›„ ํ•ด๋‹น ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์†”๋ฃจ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ์ด ๋ฌธ์ œ๋Š” codemirror css ํŒŒ์ผ์—์„œ -webkit-font-variant-ligatures ๋ฐ font-variant-ligatures ๋ฅผ normal ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ €๋ฅผ ์œ„ํ•ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. CodeMirror ๋ฒ„์ „ 5.42.2 ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰