Как заставить пользовательский шрифт ttf работать с jsPDF.output()

#javascript #titanium #jspdf

#javascript #titanium #jspdf

Вопрос:

Я добавил библиотеку jsPDF в свой проект Titanium для создания клиентской части PDF-файлов, которая отлично работает. Но теперь я хочу локализовать приложение для арабских стран, что означает, что у меня есть добавить пользовательский шрифт. Это отлично работает, если вы используете doc.save(‘file.pdf’), но, похоже, для doc.output() это работает некорректно. Я должен использовать output, потому что я использую jsPDF вне браузера.

Чтобы заставить библиотеку работать в Titanium, мне пришлось удалить все ссылки на window, потому что она не запущена в браузере или webview.

Я пытался записать файл из разных источников, но, похоже, ничего не дало никаких результатов.

Моя текущая реализация:

 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());
  

Я также пытался записать файл из большого двоичного объекта:

 var reader = new FileReader();
reader.onloadend = function () {
  tempFile.write(reader.result);
};
reader.readAsText(getBlob(buildDocument()));
  

Но PDF-файл пуст, если я использую это. Я также пробовал библиотеку в webview в приложении titanium, которая работает, но я действительно не хочу идти по этому пути. Это потребовало бы слишком большого количества изменений в коде.

Ожидается:

1

Актуально: 1

Ответ №1:

Я, наконец, решил эту проблему, создав локальный HTML-файл. В этот HTML-файл я загрузил jsPDF и свой собственный JavaScript для создания PDF-файла. Я загрузил этот HTML-файл в WebView.

Я генерирую все данные, необходимые для PDF, в контроллере Alloy. Я отправляю эти данные в свой WebView JavaScript, запуская событие приложения и перехватывая его в WebView.

После создания PDF-файла я запускаю событие приложения в WebView, которое содержит данные base64 документа jsPDF:

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