#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:
Я, наконец, решил эту проблему, создав локальный 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));