我目前正在尝试编写一个使用PDFMake创建的PDF文件,然后将该文件附加到电子邮件中。我花了6个小时试图做到这一点,但我总是出错。
下面是我导出PDF的代码。我使用createPDF.open()在serve中测试了PDF,它成功了。我还在控制台中打印了Base64数据。
exportPDF() {
console.log("ExportPDF()")
this.pdf = pdfMake;
// For use in browser(web)
//this.pdf.createPdf(getDocDefinition(this.issues, this.project, this.report)).open();
let data : string;
let newPDF;
this.pdf.createPdf(getDocDefinition(this.issues, this.project, this.report)).getBase64((buffer) => {
data = buffer;
console.log("newPDF: " + data)
});
// this.pdf.createPdf(getDocDefinition(this.issues, this.project, this.report)).getBuffer((buffer) => {
// data = buffer.toArrayBuffer();
// console.log("newPDF: " + data)
// });
// Platforms
if (this.plat.is('ios')) {
console.log("Platform: ios")
let file = "testFingering.pdf"
console.log(cordova.file.cacheDirectory);
File.removeFile(cordova.file.cacheDirectory, file);
File.writeFile(cordova.file.cacheDirectory, file, data).then(() => {
// Success!
console.log("writeFile: success!")
SocialSharing.share("tits", "tits", cordova.file.cacheDirectory + file).then(() => {
// Success!
console.log("shareViaEmail: success!")
}).catch((err) => {
// Error!
console.log("shareViaEmail: fail! " + err)
});
}).catch((err) => {
// Error!
console.log("writeFile: fail! " + JSON.stringify(err));
});
} else if (this.plat.is('android')) {
console.log("Platform: android")
} else if (this.plat.is('windows')) {
console.log("Platform: windows")
} else {
console.log("Platform: web")
}
}
以下是我收到的错误:
2017-01-31 20:40:12.997343 CMTA[1725:417453] writeFile: fail! {"code":12,"message":"PATH_EXISTS_ERR"}
2017-01-31 20:40:13.013456 CMTA[1725:417453] writeFile: fail! {"code":"Invalid parameter type"}
我只执行过一次这个代码,所以1)我不确定它为什么会记录两个错误。
2) 我知道"PATH_EXISTS_ERR"意味着路径已经存在,但如果你查看代码,我每次都会删除文件并重新创建它。
3) 我应该输入什么参数?它说它将接受"文本",我应该使用其他东西吗?我之前尝试过BufferArray(),因为我在这个应用程序的Ionic 1版本中就是这么做的,但现在已经不起作用了。
我将非常感谢任何帮助,因为这让我沮丧不已。
我最终得到了一切。不过我得走两步。
1) 我不得不将File.writeFile()移到createPDF()调用的响应中。
2) 我不得不用getBuffer()代替getBase64(),然后在互联网上为toBufferArray()找到了一个函数。
这是最后的代码:
exportPDF() {
console.log("ExportPDF()")
this.pdf = pdfMake;
// For use in browser(web)
//this.pdf.createPdf(getDocDefinition(this.issues, this.project, this.report)).open();
let data;
let file = "test11.pdf";
let newPDF;
this.pdf.createPdf(getDocDefinition(this.issues, this.project, this.report)).getBuffer((buffer) => {
data = this.toArrayBuffer(buffer);
console.log("newPDF: " + data);
console.log(cordova.file.cacheDirectory + file);
File.removeFile(cordova.file.cacheDirectory, file);
File.writeFile(cordova.file.cacheDirectory, file, data, true).then(() => {
// Success!
console.log("writeFile: success!");
SocialSharing.share("tits", "tits", cordova.file.cacheDirectory + file).then(() => {
// Success!
console.log("shareViaEmail: success!")
}).catch((err) => {
// Error!
console.log("shareViaEmail: fail! " + err)
});
}).catch((err) => {
// Error!
console.log("writeFile: fail! " + JSON.stringify(err));
});
});
// this.pdf.createPdf(getDocDefinition(this.issues, this.project, this.report)).getBuffer((buffer) => {
// data = buffer.toArrayBuffer();
// console.log("newPDF: " + data)
// });
}
toArrayBuffer(buf) {
let ab = new ArrayBuffer(buf.length);
let view = new Uint8Array(ab);
for (let i = 0; i < buf.length; ++i) {
view[i] = buf[i];
}
return ab;
}