我已经将jsPDF库添加到我的Titanium项目中,以生成PDF客户端,这一直很好。但是现在我想将应用程序本地化为阿拉伯国家/地区,这意味着我要添加自定义字体。如果您使用doc.save('file.pdf'),则此方法非常有效,但对于doc.output()来说似乎无法正常工作。我必须使用输出,因为我在浏览器之外使用jsPDF。
要使该库在Titanium中工作,我不得不将所有引用剥离到window,因为它不在浏览器或Web视图中运行。
我尝试从不同来源写入文件,但似乎没有任何结果。
我当前的实现方式:
doc = new jsPDF();
var f = Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory, 'fonts/markazi-text.regular.ttf');
var contents = f.read();
var base64font = Ti.Utils.base64encode(contents).toString();
doc.addFileToVFS("MarkaziText-Regular", base64font);
doc.addFont('MarkaziText-Regular', 'markazi-text', 'normal');
doc.setFontSize(20);
doc.setFont('markazi-text', 'normal');
doc.text('The quick brown fox jumps over the lazy dog', 20, 20);
var tempFile = Ti.Filesystem.getFile(Ti.Filesystem.getTempDirectory(), 'report.pdf');
if (tempFile.exists()) {
tempFile.deleteFile();
}
tempFile.write(doc.output());
我也尝试过从blob写入文件:
var reader = new FileReader();
reader.onloadend = function () {
tempFile.write(reader.result);
};
reader.readAsText(getBlob(buildDocument()));
但是,如果我使用pdf,则它为空。我也已经在钛应用程序的Web视图中尝试了该库,它确实可以工作,但是我真的不想走那条路。这将需要对代码进行太多更改。
预期:
实际:
答案 0 :(得分:0)
我终于通过创建本地HTML文件解决了它。在此HTML文件中,我加载了jsPDF和我自己的JavaScript以生成PDF文件。我已将此HTML文件加载到WebView中。
我正在Alloy控制器中生成PDF所需的所有数据。我通过触发应用程序事件并将其捕获到WebView中来将这些数据发送到WebView JavaScript。
在创建PDF之后,我在WebView中触发了一个包含jsPDF文档的base64数据的应用程序事件:
Ti.App.fireEvent('app:pdfdone', {
output: doc.output('dataurlstring').replace("data:application/pdf;filename=generated.pdf;base64,", "")
});
我最终将其另存为Alloy控制器中的文件:
var f = Ti.Filesystem.getFile(Ti.Filesystem.getTempDirectory(), 'doc.pdf');
f.write(Ti.Utils.base64decode(e.output));