2017-02-15 52 views
1

我试图将我的页面转换为PDF。

我有两个页面被转换成base64编码图像,然后使用jsPDF添加到PDF中。它工作正常。

我的问题是我想下面的代码等待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

您可以使用$。当()对这个..

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

它不起作用。它给了我一个空白的PDF,意思是在执行这两个函数之前保存它:/ – Knriano

+0

你是否初始化文件? – Subho

+0

是的,我做到了。我认为domtoimage功能在后台处理,因为它需要几秒钟来生成图像。所以它先保存并返回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

相关问题