如何使用jsPDF.output()获得自定义ttf字体

时间:2019-03-29 15:51:09

标签: javascript titanium jspdf

我已经将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视图中尝试了该库,它确实可以工作,但是我真的不想走那条路。这将需要对代码进行太多更改。

预期:

1

实际: 1

1 个答案:

答案 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));