Html2canvas: 'overflow:auto' divμ—μ„œ μˆ¨κ²¨μ§„ λΆ€λΆ„ 전체λ₯Ό λ Œλ”λ§ν•˜λŠ” 방법

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

μ΄λ―Έμ§€λ‘œ λ³€ν™˜ν•΄μ•Ό ν•˜λŠ” λͺ¨λ“  μš”μ†Œκ°€ ν¬ν•¨λœ divκ°€ μžˆμŠ΅λ‹ˆλ‹€. 그리고 κ·Έ divλŠ” ' overflow:auto '둜 μ„€μ •λ©λ‹ˆλ‹€. λͺ¨λ“  μš”μ†Œ(μŠ€ν¬λ‘€λ§μ— 숨겨져 있음)λ₯Ό μ΄λ―Έμ§€λ‘œ λ‚΄λ³΄λ‚΄λŠ” 방법을 μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€. κ·€ν•˜μ˜ λͺ¨λ“  의견과 닡변에 κ°μ‚¬ν•˜κ³  ν™˜μ˜ν•©λ‹ˆλ‹€. 미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€...

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

@ruthraprakash , λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이것은 μ΅œμ‹  λ²„μ „μ—μ„œ κ°„λ‹¨ν•œ λͺ©μ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

function fullhtml2canvas(el) {
    return new Promise(resolve => {
        html2canvas(el, {
            width: el.scrollWidth,
            height: el.scrollHeight,
        }).then(canvas => {
            resolve(canvas);
        });
    });
}

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

ν˜„μž¬ νŠΉμ • μ˜΅μ…˜μœΌλ‘œ νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•˜λŠ” μ˜΅μ…˜μ΄ μ—†μœΌλ―€λ‘œ μ›ν•˜λŠ” λ Œλ”λ§ λ°©μ‹μœΌλ‘œ νŽ˜μ΄μ§€λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

즉, 높이/λ„ˆλΉ„ μ œν•œμ„ μ œκ±°ν•˜κ³  html2canvasλ₯Ό μ‹€ν–‰ν•œ λ‹€μŒ 높이/λ„ˆλΉ„λ₯Ό μ›λž˜ κ°’μœΌλ‘œ λ‹€μ‹œ μ„€μ •ν•˜λ©΄ μ›ν•˜λŠ” 것을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

정말 κ°μ‚¬ν•©λ‹ˆλ‹€.... λ§μ”€ν•˜μ‹ λŒ€λ‘œ ν•΄λ΄μ•Όκ² μŠ΅λ‹ˆλ‹€...

λ‚˜λŠ” μ˜€λž«λ™μ•ˆ λ…Έλ ₯ν–ˆμ§€λ§Œ... 그것은 λ§Žμ€ 문제λ₯Ό λ§Œλ“ λ‹€. λ‚˜λŠ” 당신이 λ§ν•œ 것을 λ‹¬μ„±ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 슀크둀이 μžˆμ–΄λ„ 'λ³Έλ¬Έ'일 λ•Œ 잘 μž‘λ™ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€ ... μŠ€ν¬λ‘€μ΄μžˆλŠ” μš”μ†Œκ°€μžˆλŠ” div에 λŒ€ν•΄μ„œλ„ λ™μΌν•œ κ²°κ³Όλ₯Ό μ–»κ³  μ‹ΆμŠ΅λ‹ˆλ‹€ ...이 문제λ₯Ό 도와 쀄 수 μžˆλ‹€λ©΄ μ €μ—κ²Œ 큰 도움이 λ©λ‹ˆλ‹€... μ—¬λŸ¬λΆ„μ˜ μ˜κ²¬μ„ κΈ°λ‹€λ¦½λ‹ˆλ‹€...

@niklasvh , λ‚˜λŠ” 같은 λ¬Έμ œκ°€ 있고 λ‚΄κ°€ 가진 μœ μΌν•œ ν•΄κ²° 방법은 html2canvas (항상 μ˜΅μ…˜μ€ μ•„λ‹˜)λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 λŒ€μƒ μš”μ†Œμ˜ λ„ˆλΉ„λ₯Ό μ€„μ΄κ±°λ‚˜ html2canvas 을 ν˜ΈμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

http://jsfiddle.net/fMeRC/1/ (이 νŠΉμ • μ˜ˆλŠ” Chromeμ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. λ‹€λ₯Έ λΈŒλΌμš°μ €μ—μ„œ 문제λ₯Ό 보렀면 λ„ˆλΉ„λ₯Ό μ‘°μ •ν•΄μ•Ό 함)

이것은 기본적으둜 μš”μ†Œκ°€ μ°½ λ˜λŠ” (document.width - 8) 보닀 넓을 λ•Œλ§Œ λ°œμƒν•©λ‹ˆλ‹€. μ–΄λŠ 것이 더 μ€‘μš”ν•˜κ³  직접적인 관련이 μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² κ³  λ‹€λ₯Έ λΈŒλΌμš°μ €μ—μ„œλŠ” 변경될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λ§ˆλ„ κ΄€λ ¨: #199 및 #108.

childElementλ₯Ό μ‹œλ„ν•˜κ±°λ‚˜ "overflow=visible"을 μ„€μ •ν•˜κ³  "overflow=auto|hidden|inherit"λ₯Ό μ„€μ •ν•œ ν›„ ?

μŠ€νƒ€μΌμ΄ μ—†λŠ” childElement, μ˜€λ²„ν”Œλ‘œκ°€ μžˆλŠ” div의 λ‚΄μš©λ§Œ μˆ˜μ‹ :

<div id="main"><!--// main div -->
<div class="mainContent"><!--// div without style (height: auto, width: auto, margin: 0, padding: 0) -->
...content...
html2canvas([$("#main div.mainContent").get(0)],...)

μ œμ•ˆ κ°μ‚¬ν•©λ‹ˆλ‹€, @brcontainer. overflow: visible -> html2canvas( ... ) -> overflow: [old overflow] μ ‘κ·Ό 방식을 μ‹œλ„ν–ˆμ§€λ§Œ μˆ¨κ²¨μ§„/μˆ¨κΉ€ ν•΄μ œ/μˆ¨κΉ€ λ‹€μ‹œ μ½˜ν…μΈ μ˜ ν”Œλž˜μ‹œκ°€ λ„ˆλ¬΄ λˆˆμ— λ„μ—ˆμŠ΅λ‹ˆλ‹€. 비ꡐ적 λ³΅μž‘ν•˜λ‹€). λ‚˜λŠ” κ·Έ μ μ—μ„œ 차이λ₯Ό λ§Œλ“œλŠ” κ²ƒμœΌλ‘œ λ³΄μ΄λŠ” ν•΄κ²° λ°©λ²•μ˜ μ•½κ°„ μ΅œμ ν™”λœ λ³€ν˜•μ„ 생각해 λƒˆμ§€λ§Œ:

html2canvas( targetElement, {
  onpreloaded: function(){ /* set parent overflow to visible */},
  onparsed: function(){  /* reset parent overflow */ },
  // ... onrendered, etc.
});

이것은 h2cκ°€ λŒ€μƒμ„ μ μ ˆν•˜κ²Œ ꡬ문 λΆ„μ„ν•˜λŠ” 데 ν•„μš”ν•œ κ°€μž₯ 짧은 μ‹œκ°„ λ™μ•ˆμ—λ§Œ μ˜€λ²„ν”Œλ‘œλ₯Ό 'ν‘œμ‹œ'둜 μ„€μ •ν•˜λ―€λ‘œ 적어도 제 κ²½μš°μ—λŠ” ν”Œλž˜μ‹œλ₯Ό 거의 μ™„μ „νžˆ μ œκ±°ν•©λ‹ˆλ‹€. 즉, μ˜€λ²„ν”Œλ‘œλ₯Ό μž¬μ„€μ •/λ‹€μ‹œ 숨기기 전에 μΊ”λ²„μŠ€ λ Œλ”λ§ 단계가 μ™„λ£Œλ  λ•ŒκΉŒμ§€ 더 이상 기닀릴 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 이 μˆ˜μ •λœ μ ‘κ·Ό 방식이 λͺ¨λ“  μ‚¬λžŒμ—κ²Œ νš¨κ³Όκ°€ μžˆμ„μ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ html2canvas( ... ) μ—°μ†μœΌλ‘œ 두 번 ν˜ΈμΆœν•˜κ±°λ‚˜ DOM에 μΆ”κ°€ ν•­λͺ©μ„ μΆ”κ°€ν•˜μ—¬ λŒ€μƒ μ½˜ν…μΈ λ₯Ό λž˜ν•‘ν•˜λŠ” 것보닀 더 λ‚˜μ€ ν•΄κ²° 방법이라고 μƒκ°ν•©λ‹ˆλ‹€.

μ–΄μ¨Œλ“  이것은 μ—¬μ „νžˆ β€‹β€‹μ œλŒ€λ‘œ μˆ˜μ •λ˜μ—ˆμœΌλ©΄ ν•˜λŠ” μ‹€μ œ λ²„κ·Έμž…λ‹ˆλ‹€. (특히 IE9 및 10μ—μ„œλŠ” 두 가지 ν•΄κ²° 방법이 λͺ¨λ‘ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 적어도 IE11μ—μ„œλŠ” μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.)

_μ°Έκ³ : μ•žμ„œ μ–ΈκΈ‰ν•œ ν•΄κ²° 방법은 ν˜„μž¬ λ§ˆμŠ€ν„°μ— μžˆλŠ” μ΅œμ‹  λ²„μ „μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈν•˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ oncloned μ˜΅μ…˜μ„ λŒ€μ‹  μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 것 κ°™μœΌλ©° 이제 .then() 에 λŒ€ν•œ μ½œλ°±μ—μ„œ μ˜€λ²„ν”Œλ‘œ λΆ€λͺ¨ μž¬μ„€μ •μ΄ ν˜ΈμΆœλ©λ‹ˆλ‹€. (볡제된 λ¬Έμ„œ λ‚΄μ—μ„œ λΆ€λͺ¨μ˜ μ˜€λ²„ν”Œλ‘œλ₯Ό λ…μ μ μœΌλ‘œ λ³Ό 수 μžˆλ„λ‘ ν•˜κ³  μž¬μ„€μ •μ— λŒ€ν•΄ μ „ν˜€ κ±±μ •ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.)_

μ™œ 이런 μ‹μœΌλ‘œ μ‚¬μš©ν–ˆλŠ”μ§€ 이해가 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

function SnapShotDOM(target,call){
    var data = {};

    //use jquery or getComputedStyle|style.overflow
    data.overflow = /*get overflow property*/;
    data.width = /*get width property*/;
    data.height = /*get height property*/;
    data.maxWidth = /*get maxWidth property*/;
    data.maxHeight = /*get maxHeight  property*/;

    target.style.overflow="visible !important";
    target.style.height="auto !important";
    target.style.maxHeight="auto !important";

    html2canvas(target, {
        "onrendered": function(canvas) {
            target.style.overflow = data.overflow;
            target.style.width = data.width;
            target.style.height = data.height;
            target.style.maxWidth = data.maxWidth;
            target.style.maxHeight = data.maxHeight;
            call(canvas);
        }
    });
}

SnapShotDOM(document.body,function(canvas){
    console.log(canvas);
});

λ˜λŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

<style>
*.html2canvasreset{
    overflow: visible !important;
    width: auto !important;
    height: auto !important;
    max-height: auto !important;
}
</style>
<script>
function SnapShotDOM(target,call){
    var data = target.className;
    target.className += " html2canvasreset";//set className - Jquery: $(target).addClass("html2canvasreset");
    html2canvas(target, {
        "onrendered": function(canvas) {
            target.className = data;//old className - Jquery: $(target).removeClass("html2canvasreset");
            call(canvas);
        }
    });
}

SnapShotDOM(document.body,function(canvas){
    console.log(canvas);
});
</script>

onrendered 에 μ˜€λ²„ν”Œλ‘œμ™€ κ΄€λ ¨λœ λ‚΄μš©μ„ 넣지 μ•ŠλŠ” μ΄μœ λŠ” νŒŒμ‹±κ³Ό λ Œλ”λ§ μ‚¬μ΄μ˜ μ‹œκ°„μ΄ λˆˆμ— 띄기 λ•Œλ¬Έμ— κ°€λŠ₯ν•œ ν•œ 빨리 μ˜€λ²„ν”Œλ‘œλ₯Ό μž¬μ„€μ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€(즉, νŒŒμ‹± 직후, λ Œλ”λ§ μ „). μ½˜ν…μΈ μ˜ λˆˆμ— λ„λŠ” ν”Œλž˜μ‹œλ₯Ό ν”Όν•˜κΈ° μœ„ν•΄. λŒ€μ‹  onparsed 에 μ˜€λ²„ν”Œλ‘œ μž¬μ„€μ •μ„ λ„£μœΌλ©΄ 이 μž‘μ—…μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.

λ‚˜λŠ” "onpreloaded"λ₯Ό μ–ΈκΈ‰ν•˜κ³  μžˆμ—ˆλ‹€.

이 μ‹œλ„:

function SnapShotDOM(target,call){
    var data = target.className;
    target.className += " html2canvasreset";//set className - Jquery: $(target).addClass("html2canvasreset");
    html2canvas(target, {
        "onparsed": function() {
            target.className = data;//old className - Jquery: $(target).removeClass("html2canvasreset");
        },
        "onrendered": function(canvas) {
            call(canvas);
        }
    });
}

SnapShotDOM(document.body,function(canvas){
    console.log(canvas);
});

onpreloaded λ₯Ό μ‚¬μš©ν•˜λŠ” 것도 같은 μ΄μœ μž…λ‹ˆλ‹€. 즉, ꡬ문 뢄석 단계 직전에 μ˜€λ²„ν”Œλ‘œ 숨기기 ν•΄μ œ 뢀뢄을 κ°€λŠ₯ν•œ μ΅œμ‹  μ‹œμ μœΌλ‘œ μ΄λ™ν•˜μ—¬ μ‹œκ°„μ„ μ΅œμ†Œν™”ν•˜λŠ” μ΅œμ ν™”μž…λ‹ˆλ‹€. μ½˜ν…μΈ κ°€ 화면에 μ™„μ „νžˆ ν‘œμ‹œλ©λ‹ˆλ‹€. μ—¬κΈ° 및 μ—¬κΈ° μ½”λ“œμ—μ„œ 이것이 μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

@niklasvh , 이 λ¬Έμ œκ°€ μ—¬κΈ°μ—μ„œ 찾은 TODO( options.useOverflow )와 μ „ν˜€ 관련이 μžˆμŠ΅λ‹ˆκΉŒ?

μ–΄λ–€ 버전을 μ‚¬μš©ν•˜μ…¨μŠ΅λ‹ˆκΉŒ? .. λ‚΄ λ²„μ „μ—μ„œ onparsed 및 onpreloaded λ©”μ„œλ“œλ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.
html2canvas-0.5.0-alpha1을 μ‚¬μš©ν•˜λŠ” λ©”μ‹ μ €

@ejlocop 이 λ¬Έμ œλŠ” 이전 버전에 λŒ€ν•΄ λͺ‡ λ…„ 전에 μ œμΆœλ˜μ—ˆμœΌλ©° μ‚¬μš© 사둀(#511)와 관련이 없을 수 μžˆμŠ΅λ‹ˆλ‹€.

그듀은 문제λ₯Ό ν•΄κ²°? paraa μ†”λ£¨μ…˜ λ‚΄ Gantt 차트둜 λ­”κ°€λ₯Ό μ°Ύκ³  μžˆμ–΄μš”, 당신이 μ™„μ „νžˆ ν•„μš”ν•©λ‹ˆλ‹€ ...
overflow

μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

http://jsfiddle.net/fMeRC/368/

@pkpatels μ™œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” λ‹Ήμ‹ μ˜ λ°”μ΄μ˜¬λ¦°μ„ μ‹€ν–‰ν–ˆκ³  λ¬Έμž₯은 λŠκΈ°μ§€ μ•Šκ³  λ Œλ”λ§λ˜μ—ˆμŠ΅λ‹ˆλ‹€ ...
λ‚˜λŠ” λ˜ν•œμ΄ λ¬Έμ œκ°€ μžˆμ—ˆκ³  λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ μ†”λ£¨μ…˜μ€ # 117μ—μ„œ μ œμ•ˆν•œ κ²ƒμž…λ‹ˆλ‹€.

@uriklar 수직이 μ•„λ‹Œ μˆ˜ν‰ μŠ€ν¬λ‘€μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. λ‚΄ divλ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€. κ±°κΈ°μ—λŠ” μ„Έ 가지 λ‹€λ₯Έ μš”μ†Œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

@uriklar μ œμ•ˆν•œ μ†”λ£¨μ…˜μ€ divλ₯Ό μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν•˜κ³  μ™„μ „νžˆ ν‘œμ‹œλ₯Ό 클릭해도 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
screen shot 2016-03-16 at 1 41 09 pm

λ Œλ”λ§ν•˜κΈ° 전에 #text div의 높이λ₯Ό μžλ™μœΌλ‘œ μ„€μ •ν•˜κ³  λ‚˜μ€‘μ— μž¬μ„€μ •ν•˜λŠ” 것은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ? νš¨κ³Όκ°€ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

κ°€μž₯ 졜근 릴리슀(0.5.0-beta4)μ—μ„œ μ—¬μ „νžˆ μ˜€λ²„ν”Œλ‘œ λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. @usmonster 의 ν•΄κ²° 방법을 μ‚¬μš©ν•˜μ—¬ h2c 및 Promises의 졜근 λ³€κ²½ 사항에 μ μš©ν–ˆμŠ΅λ‹ˆλ‹€( @usmonster 의 λ©”λͺ¨μ— μ„€λͺ…됨).

μ°Έκ³ : μ•žμ„œ μ–ΈκΈ‰ν•œ ν•΄κ²° 방법은 ν˜„μž¬ λ§ˆμŠ€ν„°μ— μžˆλŠ” μ΅œμ‹  λ²„μ „μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈν•˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ λŒ€μ‹  onclone μ˜΅μ…˜μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 것 κ°™μœΌλ©° μ˜€λ²„ν”Œλ‘œ λΆ€λͺ¨ μž¬μ„€μ •μ€ 이제 .then()에 λŒ€ν•œ μ½œλ°±μ—μ„œ ν˜ΈμΆœλ©λ‹ˆλ‹€. (볡제된 λ¬Έμ„œ λ‚΄μ—μ„œ λΆ€λͺ¨μ˜ μ˜€λ²„ν”Œλ‘œλ₯Ό λ…μ μ μœΌλ‘œ λ³Ό 수 μžˆλ„λ‘ ν•˜κ³  μž¬μ„€μ •μ— λŒ€ν•΄ μ „ν˜€ κ±±μ •ν•˜μ§€ μ•ŠλŠ” 것도 κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.)

λ”°λΌμ„œ μ›ΉνŽ˜μ΄μ§€μ˜ μ‹€μ œ DOM을 λ³€κ²½ν•˜μ§€ μ•Šκ³  onclone μ½œλ°±μ„ μ‚¬μš©ν•˜μ—¬ h2cμ—μ„œ λ Œλ”λ§μ— μ‚¬μš©λ˜λŠ” 볡제된 λ¬Έμ„œλ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 맀우 κ°„λ‹¨ν•©λ‹ˆλ‹€. μ—¬κΈ° λ‚΄ h2c 호좜이 μžˆμŠ΅λ‹ˆλ‹€.

var renderingPromise = html2canvas($(item), {
    width: item.clientWidth,
    height: item.clientHeight,
    onclone: function(clone) {
            $(clone).find('.grid-stack-item-content')
                .css('overflow-x', 'auto')
                .css('overflow-y', 'auto');
        return true;
    }
}).then(
    function(c) {/* success */},
    function() {/* fail */}
);

λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ μœ μΌν•œ 방법은 μΊ”λ²„μŠ€λ₯Ό iframe에 λ„£κ³  κ·Έ μ•ˆμ— html2canvasλ₯Ό ν˜ΈμΆœν•˜κ³  μΊ”λ²„μŠ€μ—μ„œ toDataURL()을 ν˜ΈμΆœν•œ λ‹€μŒ μ½œλ°±μ„ μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή 이미지λ₯Ό 맨 μœ„ 창으둜 λ‹€μ‹œ μ „λ‹¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μΊ”λ²„μŠ€ 개체λ₯Ό λ‹€μ‹œ 전달할 μˆ˜λ„ μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function(canvas) { if (typeof(options.onrendered) === "function") { log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas"); options.onrendered(canvas); } return canvas; });
둜 λ³€κ²½
var width = options.width != null ? options.width : node.ownerDocument.defaultView.innerWidth; var height = options.height != null ? options.height+node.ownerDocument.defaultView.innerHeight : node.ownerDocument.defaultView.innerHeight; return renderDocument(node.ownerDocument, options, width, height, index).then(function (canvas) { if (typeof(options.onrendered) === "function") { log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas"); options.onrendered(canvas); } return canvas; });

이것은 ν™”λ©΄μ˜ μ˜€λ²„ν”Œλ‘œ(λ„ˆλΉ„μ™€ 높이 λͺ¨λ‘)에 λŒ€ν•œ μ§ˆλ¬Έμ„ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

xzw123μ—λŠ” 잘λͺ»λœ μ†”λ£¨μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. ownerDocument.defaultView.innerHeight μˆ˜λ™μœΌλ‘œ μ„€μ •ν•˜λ©΄ μ‹€μ œ μ°½ 크기 μ‘°μ • μ΄λ²€νŠΈμ—μ„œ 바인딩이 ν•΄μ œλ©λ‹ˆλ‹€. iframeμ—μ„œ ν•˜λŠ” 것이 κ°€μž₯ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€. Jordan의 μ†”λ£¨μ…˜μ„ μ‹œλ„ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

Jordan, μ–΄λ–»κ²Œ iframeμ—μ„œ μΊ”λ²„μŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆλ‚˜μš”? μ§€κΈˆ μ‹œλ„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이것이 html2canvas의 μ΅œμ’… μ†”λ£¨μ…˜μ΄μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€... iframe 톡신은 API μ™ΈλΆ€μ—μ„œ 보이지 μ•Šλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ•„ 예, window.postMessage(myData, ... ) λ₯Ό μ‚¬μš©ν•˜μ—¬ iframeμ—μ„œ μˆ˜ν–‰ν•˜λ©΄ 트릭이 μˆ˜ν–‰λ©λ‹ˆλ‹€. λ Œλ”λ§λœ ν”½μ…€μ˜ 전체 데이터 URL을 λ‹€μ‹œ κ²Œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. iframe의 HTML에 λ Œλ”λ§ μ½”λ“œλ₯Ό λ„£κ³  HTML μ†ŒμŠ€λ₯Ό λ Œλ”λ§ν•˜λŠ” 데 ν•„μš”ν•œ 데이터λ₯Ό μ „λ‹¬ν•˜κ³  μΊ”λ²„μŠ€μ— λ Œλ”λ§ν•œ λ‹€μŒ toDataUrl 데이터λ₯Ό λ‹€μ‹œ 내보내도둝 ν–ˆμŠ΅λ‹ˆλ‹€.

+1

μ•ˆλ…•ν•˜μ„Έμš”. μ†”λ£¨μ…˜μ„ κ²€μƒ‰ν•˜κ³  μ½”λ“œκ°€ μ–΄λ–»κ²Œ μ‹€ν–‰λ˜λŠ”μ§€ κ΄€μ°°ν•œ ν›„ λ‚˜λ§Œμ˜ κΉŒλ‹€λ‘œμš΄ μ†”λ£¨μ…˜μ„ μž‘μ„±ν•©λ‹ˆλ‹€.

https://gist.github.com/simonmysun/c6da13ce2827a374e71ccf07d9f08e2d

그것은 λ‚˜λ₯Ό μœ„ν•΄ μΌν•˜κ³  그것이 ν•„μš”ν•œ μ‚¬λžŒμ—κ²Œ λ„μ›€μ΄λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ•žμœΌλ‘œ 이 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 지원될 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€.

λ‚˜λŠ” μ—¬μ „νžˆ 그것을 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜μ§€λ§Œ λ‚΄ λ¬Έμ œλŠ” 이미지가 μž˜λ¦¬λŠ” κ²ƒμž…λ‹ˆλ‹€. 크둬 버전 54.0.2840.99 m μ‚¬μš© μ‹œ
(반μͺ½ μ΄λ―Έμ§€λŠ” μŠ€ν¬λ¦°μƒ·μ΄ μ°ν˜”μ§€λ§Œ λ‚˜λ¨Έμ§€ 반μͺ½μ€ 검은색 화면이 됨)

// the timeline show up 100%, but cut off, cause its static and not dynamic.
// (its cut off from the screen,but the size, and picture show as normal, 100% show)
// after moving to the canvas, everthing that not in the screen will get blank in chrome  
// it depends to the user screen, if i zoom out my chrome, i get 100% image.

κ·ΈλŸ¬λ‚˜ Mozilla 50.0.2λ₯Ό μ‚¬μš©ν•  λ•Œ μΆ•μ†Œ 없이 잘 μž‘λ™ν•©λ‹ˆλ‹€. (100% 이미지),

이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ½”λ“œ:

var zenleft = $("#leftPanel").width();  //calculate left side
var zenright = $(".dataPanel").width();  //calculate right side
var after = zenright + zenleft + 250;  // add all

//add the css, even after add overflow still not working
$("#timelineTarget").css({"background-color":"white","width":after});   

 html2canvas(canvTimeline, {
    onrendered: function (canvas) {
            $("#previewImage").html(canvas);
            getCanvas = canvas;
   }
});

image

λ§ˆμ§€λ§‰μœΌλ‘œ λ‹€μŒμ„ μΆ”κ°€ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.

$("body").css({"width": "+="+after}); //after is a total of the width of the element i want to view

κ·Έλž˜μ„œ

var zenleft = $("#leftPanel").width();  //calculate left side
var zenright = $(".dataPanel").width();  //calculate right side
var after = zenright + zenleft + 250;  // add all
$("body").css({"width": "+="+after});  //add the body

//add the css
$("#timelineTarget").css({"background-color":"white","width":after});   

 html2canvas(canvTimeline, {
    onrendered: function (canvas) {
            $("#previewImage").html(canvas);
            $("#timelineTarget").css({"background-color":"white","width":old});   //turn it back
            $("body").css({"width": "-="+after});   //turn it back
            getCanvas = canvas;
   }
});

μžμ‹ μ˜ 문제λ₯Ό ν•΄κ²°ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

onclone 이 μ˜¬λ°”λ₯Έ 방법일 수 μžˆμŠ΅λ‹ˆλ‹€. CSSλ₯Ό λ³€κ²½ν•˜μ—¬ μ›ν•˜λŠ” 것을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, 슀크둀 κ°€λŠ₯ν•œ divκ°€ μžˆμŠ΅λ‹ˆλ‹€. div μž…λ ₯을 μΊ”λ²„μŠ€ λ§€κ°œλ³€μˆ˜λ‘œ 보내면 λ·°ν¬νŠΈμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” κ²ƒλ§Œ λ Œλ”λ§λ©λ‹ˆλ‹€. λ‚˜λŠ” λͺ¨λ“  해결책을 κ±°μ³€μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆλ‹€. λˆ„κ΅¬λ“ μ§€ div의 전체 μ½˜ν…μΈ λ₯Ό μŠ€ν¬λ¦°μƒ·μœΌλ‘œ κ°€μ Έμ˜€λŠ” 방법을 말할 수 μžˆμŠ΅λ‹ˆκΉŒ?

@ruthraprakash , λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이것은 μ΅œμ‹  λ²„μ „μ—μ„œ κ°„λ‹¨ν•œ λͺ©μ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

function fullhtml2canvas(el) {
    return new Promise(resolve => {
        html2canvas(el, {
            width: el.scrollWidth,
            height: el.scrollHeight,
        }).then(canvas => {
            resolve(canvas);
        });
    });
}

νƒ€μž„λΌμΈ 차트의 μŠ€ν¬λ¦°μƒ·μ„ μ°λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. x μΆ• 값을 얻지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. νƒ€μž„λΌμΈ 차트의 이미지λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
` demoFromHTML(e) {
e.preventDefault();

  let input = window.document.getElementById('divToPDF');


  html2canvas(input)
  .then((canvas) => {

    const imgData = canvas.toDataURL('image/jpeg');

    const pdf = new pdfConverter("l", "pt");
    pdf.addImage(imgData, 'JPEG', 15, 110, 800, 250);
    pdf.save('test.pdf');
  });


}

`

λ‚˜λŠ” μ˜€λž«λ™μ•ˆ λ…Έλ ₯ν–ˆμ§€λ§Œ... 그것은 λ§Žμ€ 문제λ₯Ό λ§Œλ“ λ‹€. λ‚˜λŠ” 당신이 λ§ν•œ 것을 λ‹¬μ„±ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 슀크둀이 μžˆμ–΄λ„ 'λ³Έλ¬Έ'일 λ•Œ 잘 μž‘λ™ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€ ... μŠ€ν¬λ‘€μ΄μžˆλŠ” μš”μ†Œκ°€μžˆλŠ” div에 λŒ€ν•΄μ„œλ„ λ™μΌν•œ κ²°κ³Όλ₯Ό μ–»κ³  μ‹ΆμŠ΅λ‹ˆλ‹€ ...이 문제λ₯Ό 도와 쀄 수 μžˆλ‹€λ©΄ μ €μ—κ²Œ 큰 도움이 λ©λ‹ˆλ‹€... μ—¬λŸ¬λΆ„μ˜ μ˜κ²¬μ„ κΈ°λ‹€λ¦½λ‹ˆλ‹€...

μ–΄λ–»κ²Œ λͺΈμ΄ μž‘λ™ν•˜λŠ”μ§€ 보여쀄 수 μžˆμŠ΅λ‹ˆκΉŒ?

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