У вас нет Mac, и вы снова нашли страницы во входящем письме? Что с ними не так? В прошлый раз после тщательного поиска «как просмотреть iPages» было найдено простое и элегантное решение.
И, заметьте, это не бензопила со спутниковым наведением.
1. Переименуйте расширение в .
zip. 2. Откройте полученный архив и найдите в нем pdf файл.
3. Прибыль! Вы думаете, мы остановились только на этом? Мы так воодушевились и воодушевились, что начали его вырубать услуга для автоматической конвертации рассматриваем схемы монетизации.
Под катом вы найдете подробное объяснение того, как это работает. Фактически, .
pages, как и некоторые форматы для MacOS, хранят специальные данные для предварительного просмотра в формате .
pdf. Чтобы не утомлять реализацию, вместо обработки на бэкенде мы решили потренировать мускулы в js. Да, из-за этого конвертер не работает в IE10+, кто им пользуется?, потому что у него нет поддержки URL (все остальное можно сделать эмулируемо).
Но на сервер ничего загружать не нужно, на клиенте все работает, а значит моментально (а еще это безопасно, никуда ничего не отправляешь).
Итак, как это работает? Pages — это zip-контейнер (кстати, как и docx, xslx и другие офисные форматы нового поколения).
Внутри него находятся: -index.xml — основной файл презентации -buildVersionHistory.plist — файл с метаданными, что он делает понятно из названия -QuickLook/Thumbnail.jpg — миниатюра изображения для предварительного просмотра внутри папки.
-QuickLook/Preview.pdf — сам файл предварительного просмотра, который открывается в macOS по нажатию пробела.
Как мы получаем файлы перетаскиванием или через инпуты уже сто раз рассказано, это не интересно, пропустим этот шаг.
Мы получили этот файл, и чтобы его прочитать, нам нужно запустить FileReader. Скрипты, работающие с файлами, имеют разные форматы ввода: некоторые принимают Blob, другие — двоичную строку.
Мы взяли js-unzip, одно из десятков простых в Google решений.
Мы взяли его за простоту и ясность.
В качестве входных данных требуется строка, поэтому мы запускаем FileReader в формате readAsBinaryString:
if (file.type === "application/x-iwork-pages-sffpages") {
var reader = new FileReader();
reader.onload = function (event) {
processZip(event.target.result)
};
reader.readAsBinaryString(file);
}
Обратите внимание, что в самом событии нет никакой полезной информации, event.target на самом деле относится к читателю, и мы могли бы написатьprocessZip(reader.result).
Почти все стандарты браузеров очень похожи по синтаксису, а FileReader создан с учетом XMLHttpRequest, так что все будет вполне знакомо.
Работу с zip-архивом мы также пропустим — для этой задачи в сети существует множество библиотек, и каждая имеет свой синтаксис, тем более, что в данном случае zip — это всего лишь контейнер, и нам даже не пришлось подключать механизмы разархивирования.
.
Самое интересное происходит в конце (этот код немного отличается от того, что есть на сайте, ради читабельности): var uintArray = new Uint8Array(dataString.length);
for (var i = 0; i < dataString.length; i++) {
uintArray[i] = dataString.charCodeAt(i)
}
var blob = new Blob([uintArray], {type: 'application/pdf'});
gotLink(URL.createObjectURL(blob));
Что тут происходит:
Двоичная строка в текстовом выражении хранит коды ASCII своих байтов.
Создаем специальный типизированный массив (uint8array) однобайтовых беззнаковых целых чисел, также в диапазоне от 0 до 255, и побайтно передаем в него числовые значения символов строки.
Это необходимо для того, чтобы объект blob (двоичный объект в js) создавался с учетом того, что каждое число хранит один байт — иначе символы могут быть интерпретированы по-разному и файл будет сгенерирован некорректно.
При этом сам Blob на вход принимает только массивы, поэтому нам дополнительно придется обернуть uintArray в обычный массив.
Поскольку выходная ссылка не будет иметь формата, мы дополнительно указываем mime-тип для объекта blob. И самое большое волшебство на сайте — это использование функции URL.createObjectURL(блоб) мы получаем ссылку на объект blob в памяти.
То есть буквально — как только мы закрываем родительский документ, ссылка перестает работать.
Ссылка выглядит следующим образом: большой двоичный объект: http://localhost: 8005/4222c9ec-1c66-4143-96a8-4223482148f6 Так вы сможете получить из архива отдельный файл и вернуть его клиенту, не обращаясь к серверу.
К сожалению, если бы не было необходимости в ссылке из URL.createObjectURL - можно было бы рассчитывать на то, что сервер прочитает файл для ie9 - Blob.poly.js существует, и с ним можно работать, но ссылка base64 в выводе оказалась оказался такого размера, что браузер просто не хотел открывать его в новом окне и зависал.
P.S. Если вы обнаружите какие-либо ошибки (ОС, версия браузера), напишите мне в личное сообщение.
Обещаю исправить это немедленно.
УПД Все исходники находятся в публичном репозитории на github Теги: #iPages #pdf #jsconverter #converter #Разработка сайтов #JavaScript
-
Спорт И Разработчики. Разрушение Мифов
19 Dec, 24 -
Создание Warcraft (Часть 1)
19 Dec, 24 -
О Болезненных Вещах.
19 Dec, 24