Страницы В Pdf Или Сервис За 2 Часа

У вас нет Mac, и вы снова нашли страницы во входящем письме? Что с ними не так? В прошлый раз после тщательного поиска «как просмотреть iPages» было найдено простое и элегантное решение.

И, заметьте, это не бензопила со спутниковым наведением.



Страницы в PDF или сервис за 2 часа

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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.