#javascript #pdf #browser #jspdf #fileapi
Вопрос:
Я запускаю в браузере. У меня есть File
(тип файла JavaScript) типа application/pdf
. Я хочу проверить, что формат pdf является либо буквенным (8,5 дюйма x 11 дюймов) , либо юридическим (8,5 дюйма x 14 дюймов) в альбомной или портретной ориентации.
Я взглянул на jsPDF, и хотя он отлично смотрится для создания pdf-документов программно (что пригодится для тестов) Я не смог найти способ использовать его для анализа существующего PDF-файла и получения информации о документе (например, формат страницы и ориентация).
Любая помощь в достижении моей цели будет оценена по достоинству, будь то jsPDF, другая библиотека или vanilla JS.
Ответ №1:
Используя простой синтаксический анализ текста, большинство, но не все PDF-файлы будут содержать одну или несколько /MediaBox
записей, представляющих каждую страницу. /CropBox
является размером просматриваемой страницы, поэтому потенциально лучше, если она присутствует. Длина страницы обычно указывается в пунктах, если только страница не использует другой пользовательский модуль. Формат [x0, y0, x1, y1], поэтому они не всегда могут начинаться с 0 или даже быть значениями ниже, именно разница между x0 и x1 указывает номинальную ширину.
Вот лишь несколько первых записей из недавних европейских примеров, поэтому обратите внимание на вариации, некоторые из них целочисленные, некоторые реальные, а некоторые смешанные (как и в большинстве материалов pdf, нет принудительного правила).
/MediaBox [0 0 595.28 841.89]
/MediaBox [0 0 842 595]
/MediaBox[0 0 387.36 594]
для НАС буквенные и юридические они обычно являются целочисленными ожидайте или ищите
/MediaBox[0 0 612 792] и аналогичные
Во многих случаях все страницы имеют одинаковую форму, даже если они предназначены для последующего поворота, но иногда страницы могут быть смешаны, однако для этого требуется поиск/подсчет всех страниц (при условии, что все они являются простыми текстовыми описаниями)
/MediaBox .... 0 576 720] = A US Gov Letter Portrait Page (8" x 10") [*]
/MediaBox .... 0 720 576] = A US Gov Letter Landscape Page
/MediaBox .... 0 576 756] = A US Gov Letter Portrait Page (8" x 10.5")
/MediaBox .... 0 756 576] = A US Gov Letter Landscape Page
/MediaBox .... 0 576 936] = A US Gov Legal Portrait Page (8" x 13") [*]
/MediaBox .... 0 936 576] = A US Gov Legal Landscape Page
/MediaBox .... 0 612 792] = A US Letter Portrait Page (8.5" x 11")
/MediaBox .... 0 792 612] = A US Letter Landscape Page
/MediaBox .... 0 612 936] = A US Gov Legal Portrait Page (8.5" x 13") [*]
/MediaBox .... 0 936 612] = A US Gov Legal Landscape Page
/MediaBox .... 0 612 1008] = A US Legal Portrait Page (8.5" x 14")
/MediaBox .... 0 1008 612] = A US Legal Landscape Page
Есть и другие исторические американские размеры
* https://en.wikipedia.org/wiki/Paper_size#Loose_sizes
Вращение чаще всего устанавливается равным 0, после чего матричное преобразование или /действие применяется для поворота первого представления в тех читателях, которые поддерживают такие действия или сценарии без блокировки. Таким образом, бесполезно искать /Rotate 0
записи 1001x
Так, например, я должен был добавить, что первый случайный файл, который я привел в качестве примера выше, представляет собой вертикальную портретную страницу, узкую и высокую, но представляет собой диаграмму, которую следует читать справа в качестве ландшафтного макета аэропорта, и тесты не помогут определить, каким образом ее следует читать как портретную или альбомную, потенциально можно установить в pdf, но пользователь должен читать оба текста как портретный, а затем альбомный