2017-02-15 10 views
1

私のページをPDFに変換しようとしています。

私は、base64でエンコードされたイメージに変換され、jsPDFを使用してPDFに追加される2つのページを持っています。それはうまく動作します。

私の問題は、以下のコードでは、保存する前にdomtoimage関数が処理されるのを待ちます。

var doc = new jsPDF(); 
 

 
//First 
 
domtoimage.toPng(document.getElementById('page')) 
 
.then(function (dataUrl) { 
 
      doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 
 
      doc.addPage(); 
 
}); 
 
//Second 
 
domtoimage.toPng(document.getElementById('page2')) 
 
.then(function (dataUrl) { 
 
      doc.addImage(dataUrl, 'png', 15, 10, 180, 280); }); 
 
//Third 
 
doc.save("file.pdf");

私は、このソリューションが見つかりました:https://api.jquery.com/jquery.when/を私は約束に慣れていないです、私はそれを動作させる方法がわかりません。

ありがとうございました。

+0

多分 '.delay(ms)'が役立つかもしれません。さもなければ 'setTimeout()'関数を使うことができます。遅延に関する詳細はこちらをご覧ください:https://api.jquery.com/delay/ – Jer

+0

'.delay'はエフェクトキュー(例:fadeIn/slideDown)にのみ適用されます。一般的な「特定の時間を待つ」のではありません。 –

答えて

1

var doc = new jsPDF(); 

//First 
domtoimage.toPng(document.getElementById('page')) 
.then(function (dataUrl) { 
    doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 
    doc.addPage(); 
    domtoimage.toPng(document.getElementById('page2')).then(function (dataUrl) { 
     doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 
     doc.save("file.pdf"); 
    }); 
}); 
+0

私が期待した答えの種類ではありませんが動作します。ありがとうございました:) – Knriano

1

あなたはこれを試すことができます。

var doc = new jsPDF(); 

//First 
domtoimage.toPng(document.getElementById('page')) 
.then(function (dataUrl) { 
      doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 
      doc.addPage(); 

      //Second 
      domtoimage.toPng(document.getElementById('page2')) 
       .then(function (dataUrl) { 
        doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 

        //Third 
        doc.save("file.pdf");  
       }); 

}); 
1

あなたはこのために$ .whenを()を使用することができます。..

function func1(){ 
    domtoimage.toPng(document.getElementById('page')) 
    .then(function (dataUrl) { 
     doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 
     doc.addPage(); 
    }); 
} 

function func2(){ 
    domtoimage.toPng(document.getElementById('page2')) 
    .then(function (dataUrl) { 
     doc.addImage(dataUrl, 'png', 15, 10, 180, 280); }); 
} 

$.when(func1(), func2()) 
.done(function(){ 
    doc.save("file.pdf"); 
    }).fail(function(){ 
     console.log('failure'); 
}); 
+0

それは動作しません。それは私に2つの機能を実行する前に保存することを意味する空白のPDFを提供します:/ – Knriano

+0

uは文書を初期化しましたか? – Subho

+0

はい、しました。私は画像を生成するのに数秒かかるので、domtoimage関数はバックグラウンドで扱われると思います。それで、最初に保存して、ドーム画像に戻って治療を終えるために – Knriano

1

以下のようなものを試してみてください:

var doc = new jsPDF(); 
 

 
$.when(fn1()).done(function (v1) { 
 
    console.log(v1); 
 
}); 
 

 
//First 
 
function fn1() { 
 
    domtoimage.toPng(document.getElementById('page')) 
 
    .then(function (dataUrl) { 
 
     doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 
 
     doc.addPage(); 
 

 
     // Call next function. 
 
     $.when(fn2()).done(function(v2) { 
 
     console.log(v2); 
 
     }); 
 
    }); 
 

 
    return 'success'; 
 
} 
 

 
//Second 
 
function fn2() { 
 
    domtoimage.toPng(document.getElementById('page2')) 
 
    .then(function (dataUrl) { 
 
     doc.addImage(dataUrl, 'png', 15, 10, 180, 280); 
 

 
     // Call next function. 
 
     $.when(fn3()).done(function(v3) { 
 
     console.log(v3); 
 
     }); 
 
    }); 
 

 
    return 'success'; 
 
} 
 

 
//Third 
 
function fn3() { 
 
    doc.save("file.pdf"); 
 

 
    return 'success'; 
 
}

+0

それは動作しません。関数はfn1、fn2、fn3の順で呼び出されますが、関数domtoimageはバックグラウンドで処理されていると思います。結果は最初にPDFを保存してから、domtoimageを実行します – Knriano

+0

更新していただきありがとうございます。 – Yogesh

+0

@Knriano、私はコードを更新し、他の機能でも約束を加えました。これが動作すれば、試してみてください。 – Yogesh

関連する問題