Html2canvas: SVG 겹침의 ν…μŠ€νŠΈ νƒœκ·Έ(쀑볡/이쀑)

에 λ§Œλ“  2015λ…„ 02μ›” 19일  Β·  24μ½”λ©˜νŠΈ  Β·  좜처: niklasvh/html2canvas

(λ―Έμ•ˆ, λ‚˜λŠ” μ˜μ–΄λ₯Ό 잘 λͺ»ν•΄)

μ•ˆλ…•ν•˜μ‹­λ‹ˆκΉŒ,
이 멋진 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ SVG νƒœκ·Έλ₯Ό λ Œλ”λ§ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
SVG의 ν…μŠ€νŠΈ νƒœκ·Έλ₯Ό μΊ”λ²„μŠ€λ‘œ λ Œλ”λ§ν•  λ•Œ 일뢀 ν…μŠ€νŠΈκ°€ κ²ΉμΉ©λ‹ˆλ‹€.
ν…μŠ€νŠΈ νƒœκ·ΈλŠ” ν…μŠ€νŠΈ λ…Έλ“œ 및 SVG둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.
transform 속성을 μ‚¬μš©ν•˜λ©΄ μ‰½κ²Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
2015-02-19 15 08 29_2
λ‹€μŒμ€ μƒ˜ν”Œ μ½”λ“œμž…λ‹ˆλ‹€(html2canvas 0.5.0-alpha2 포함)

<html>
<head>
  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script type="text/javascript" src="js/html2canvas.js"></script>
</head>
<body>
  <svg width="100" height="100">
    <g transform="translate(20,20)">
      <text dy=".45em" y="10" x="0" dx="-.8em" transform="translate(0,0) rotate(-70)" style="font-size:12px;">Text</text>
    </g>
  </svg>
  <script>
    $(document).ready(function() {
      html2canvas(document.body, {
        onrendered: function(canvas) {
          document.body.appendChild(canvas);
        }
      });
    })
  </script>
</body>
</html

그리고 μ—¬κΈ° λ‚΄ λΉ λ₯Έ λ³€κ²½ 사항이 μžˆμŠ΅λ‹ˆλ‹€.

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

이것이 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.

Needs More Information

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@νš¨μ§„
IEμ—μ„œ ν…ŒμŠ€νŠΈν•œ ν›„ parentElement 속성이 ν˜„μž¬ λ…Έλ“œμ— μ±„μ›Œμ§€μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μˆ˜μ • 사항이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  parentNode μ‚¬μš©ν•˜μ‹­μ‹œμ˜€! μ–΄μ¨Œλ“  μš°λ¦¬λŠ” NodeParser 있고 λ…Έλ“œμ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κΈ° λ•Œλ¬Έμ— 더 λͺ…ν™•ν•  κ²ƒμž…λ‹ˆλ‹€.

그렇지 μ•ŠμœΌλ©΄ νƒœκ·Έ 이름을 ν…ŒμŠ€νŠΈν•˜λŠ” λŒ€μ‹  parentNode 의 μΈμŠ€ν„΄μŠ€λ₯Ό ν…ŒμŠ€νŠΈν•˜λ„λ‘ μ½”λ“œλ₯Ό λ³€κ²½ν•˜κ³  parentNodeκ°€ SVGElement κ°€ μ•„λ‹Œ κ²½μš°μ—λ§Œ ν˜„μž¬ λ…Έλ“œμ— TextContainer μžˆμŒμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. .

그것은 크둬과 ie11μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. νŒŒμ΄μ–΄ν­μŠ€μ—μ„œλŠ” 빈 μΊ”λ²„μŠ€ 버그 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈν•  수 μ—†μŠ΅λ‹ˆλ‹€!

λ‚΄ μ½”λ“œ

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

이게 도움이 되길 λ°”λž€λ‹€.

λͺ¨λ“  24 λŒ“κΈ€

#νš¨μ§„λ‹˜ κ°μ‚¬ν•©λ‹ˆλ‹€. 그게 λ‚˜μ—κ²Œ 도움이 λœλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€, 많이 λ„μ™€μ£Όμ„Έμš”!

μˆ˜μ •ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

tspan tagName을 확인할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "ν…μŠ€νŠΈ" && node.parentElement.tagName !== "tspan"

@ncoquelet λ‚΄ μ½”λ“œλ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. 감사 ν•΄μš”!

@νš¨μ§„
IEμ—μ„œ ν…ŒμŠ€νŠΈν•œ ν›„ parentElement 속성이 ν˜„μž¬ λ…Έλ“œμ— μ±„μ›Œμ§€μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μˆ˜μ • 사항이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  parentNode μ‚¬μš©ν•˜μ‹­μ‹œμ˜€! μ–΄μ¨Œλ“  μš°λ¦¬λŠ” NodeParser 있고 λ…Έλ“œμ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κΈ° λ•Œλ¬Έμ— 더 λͺ…ν™•ν•  κ²ƒμž…λ‹ˆλ‹€.

그렇지 μ•ŠμœΌλ©΄ νƒœκ·Έ 이름을 ν…ŒμŠ€νŠΈν•˜λŠ” λŒ€μ‹  parentNode 의 μΈμŠ€ν„΄μŠ€λ₯Ό ν…ŒμŠ€νŠΈν•˜λ„λ‘ μ½”λ“œλ₯Ό λ³€κ²½ν•˜κ³  parentNodeκ°€ SVGElement κ°€ μ•„λ‹Œ κ²½μš°μ—λ§Œ ν˜„μž¬ λ…Έλ“œμ— TextContainer μžˆμŒμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. .

그것은 크둬과 ie11μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. νŒŒμ΄μ–΄ν­μŠ€μ—μ„œλŠ” 빈 μΊ”λ²„μŠ€ 버그 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈν•  수 μ—†μŠ΅λ‹ˆλ‹€!

λ‚΄ μ½”λ“œ

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

이게 도움이 되길 λ°”λž€λ‹€.

λ‚΄ νŒŒμ΄μ–΄ 폭슀 문제λ₯Ό ν•΄κ²°ν•˜κ³  ffμ—μ„œλ„ μž‘λ™ν•©λ‹ˆλ‹€ :-)

더 λΆ„λͺ…ν•œ!
ffμ—μ„œλ„ 잘 μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
μˆ˜μ • 사항을 λ³‘ν•©ν–ˆκ³  pull μš”μ²­μ΄ μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 감사 ν•΄μš” :)

@hyojin @ncoquelet 이에 λŒ€ν•œ 쑰사와 μˆ˜μ •μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λ‚˜λŠ” μš”μ „μ— λ˜‘κ°™μ€ λ¬Έμ œμ— λΆ€λ”ͺμ³€κ³  κ·Έ 원인이 무엇인지 μ™„μ „νžˆ ν™•μ‹ ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ ν˜Όλž€μŠ€λŸ¬μ›Œμ§€λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μ§€λ§Œ "Uncaught ReferenceError: NodeParser is not defined"λΌλŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

@Suchetana10 μ–Έμ œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆκΉŒ? λ‘œλ”© μŠ€ν¬λ¦½νŠΈμ—μ„œ?

@hyojin κ°μ‚¬ν•©λ‹ˆλ‹€.. μΌν–ˆμŠ΅λ‹ˆλ‹€.

@hyojin κ°μ‚¬ν•©λ‹ˆλ‹€! λ‚˜μ—κ²Œλ„ μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

happyvishwasvadavi ugnugen κ·Έ μ†Œμ‹μ„ λ“€μœΌλ‹ˆ κΈ°μ©λ‹ˆλ‹€! :)

μ–΄λ–€ μ‚¬λžŒλ“€μ€ μ—¬μ „νžˆ β€‹β€‹ν…μŠ€νŠΈ μš”μ†Œμ— λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό μ—΄μ–΄μ„œ PR을 λ‹€μ‹œ λ³΄λ‚΄κ² μŠ΅λ‹ˆλ‹€.

image

λ‚΄κ°€ ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” 이 μˆ˜μ • 사항이 ν¬ν•¨λœ 라이브러리 λΉŒλ“œκ°€ μžˆλŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ? ν•˜μ΄ 차트 νŽ˜μ΄μ§€μ—μ„œ λ™μΌν•œ λ¬Έμ œκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

이 λΉŒλ“œλ₯Ό μˆ˜μ • 사항과 ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” μ—¬μ „νžˆ ν•˜μ΄ μ°¨νŠΈμ—μ„œμ΄ λ¬Έμ œμ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

이 μˆ˜μ • 사항을 λΉŒλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ μž¬μ •μ˜λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆκΉŒ?

이것이 μ—¬μ „νžˆ v1.0.0 의 λ¬Έμ œμž…λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ jsfiddle에 λŒ€ν•œ 예λ₯Ό

이 ν˜ΈλŠ” μ›μ €μžμ˜ μΆ”κ°€ 정보 μš”μ²­μ— λŒ€ν•œ 응닡이 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ λ¬Έμ œμ— μžˆλŠ” μ •λ³΄λ§ŒμœΌλ‘œλŠ” 쑰치λ₯Ό μ·¨ν•˜κΈ°μ— μΆ©λΆ„ν•œ 정보가 μ—†μŠ΅λ‹ˆλ‹€. 더 쑰사할 수 μžˆλ„λ‘ ν•„μš”ν•œ 닡변이 μžˆκ±°λ‚˜ 찾으면 연락해 μ£Όμ‹­μ‹œμ˜€.

μΉœμ• ν•˜λŠ” @niklasvh ,

이 λ†€λΌμš΄ λΌμ΄λΈŒλŸ¬λ¦¬μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. μ΅œμ‹  버전인 v1.0.0-rc.3μ—μ„œ 이 문제λ₯Ό μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ° μ—μ„œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€ (Chrome만 ν•΄λ‹Ή). μ—¬κΈ°μ„œ 일뢀 ν…μŠ€νŠΈ λ…Έλ“œ(κ·Έλž˜ν”„ 제λͺ©μ— 있음)κ°€ 볡제된 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μž¬ν˜„ 단계 -

  1. Chromeμ—μ„œλ§Œ CodePen 링크( https://codepen.io/karannagupta/pen/RXpddB) λ₯Ό μ—½λ‹ˆλ‹€.
  2. ν΄λ¦½λ³΄λ“œμ— 볡사 λ²„νŠΌ 클릭
  3. μ• λ‹ˆλ©”μ΄μ…˜μ΄ 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬μ‹­μ‹œμ˜€(λ˜λŠ” λ³΅μ‚¬λœ λ©”μ‹œμ§€λŠ” μ½˜μ†” μ°Έμ‘°).
  4. κ·Έλ¦ΌνŒμ΄λ‚˜ λ¬Έμ„œμ— κ·Έλž˜ν”„ λΆ™μ—¬λ„£κΈ°(ctrl + v)

κ·Έλž˜ν”„ 제λͺ©μ€ Line#193에 μΆ”κ°€λ©λ‹ˆλ‹€.

@hyojin , 이슈 λ‹€μ‹œ μ—΄μ–΄

λ¬Έμ•ˆ 인사,
μΉ΄λž€



text-duplication

μ•ˆλ…•ν•˜μ„Έμš” @karannagupta
같은 μ΄μœ μ—μ„œ μ˜€λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ λ‚΄ 지점 을 μ‹œλ„ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš” @hyojin

라이브러리 버전(v0.5.0-alpha2)μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ—¬κΈ° λ‚΄ νŽœμ—μ„œ 라이브러리λ₯Ό ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ μ΅œμ‹  λ²„μ „μ˜ html2canvasλ₯Ό μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ˜ν•œ html2canvas.svgλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ¬Έμ•ˆ 인사,
μΉ΄λž€

μœ λ‹ˆμ½”λ“œ 글꼴에 λ¬Έμ œκ°€ μžˆλŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

image

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰