Как снять пароль с PDF
Найдите защищённый паролем PDF файл и загрузите его. Если на файле нет сложного шифрования, с него в считанные секунды будет снята защита и его можно будет скачивать.
Безопасная обработка Вашей информации
Когда Вы загружаете файл, он передаётся по защищённому соединению. Файлы удаляются через час после обработки. Если нам нужен Ваш пароль, он не будет нами прочитан или сохранён.
На всех популярных платформах
Smallpdf.com – сайт на базе браузера. Он работает на всех платформах. Не имеет значения, пользуетесь ли Вы Mac, Windows или Linux.
С большинства PDF можно снять защиту!
Файлы с паролем владельца могут быть мнгновенно разблокированы. Тем не менее, если у файла сложное шифрование, то открыть его можно будет только после ввода правильного пароля.
Простое снятие защиты с PDF онлайн
Просто загрузите PDF файл и пароль будет удалён. Получить разблокированный PDF можно просто нажав кнопку скачать, – и всё готово!
Снимайте защиту с файлов в облаке
Все файлы обрабатываются в облаке, поэтому нет необходимости скачивать или устанавливать какое-либо программное обеспечение. Удобно, не правда ли?
I started searching how to create a Windows Phone 8 app to recognize barcodes inside a PDF document.
My best guest is to following the process below:
- Find a lib to split PDF documents into image streams (one per page).
-
Find a lib to recognize if there is a barcode in the image stream:
2.1. Try to recognize barcode in each portion of the image, i. e.:
try #1 (from y = 0, x = 0 to y = 100, x = 100);
try #2 (from y = 100, x = 0 to y = 200, x = 100);
try #3 (from y = 200, x = 0 to y = 300, x = 100);
and so on.
I’m wondering if this is the best approach to accomplish barcode recognition in a PDF document using WP8.
Another concern is about whether this process when executed by a not so good device will present an acceptable performance.
Someone already did that? Any advice?
UPDATE
I want to scan ITF barcodes, i. e., I need to scan the barcode in this image:
I’m trying to start achieving the scanning barcodes from a Image, but I’m not getting success. Below is my first try:
//get the assets folder for the app
StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Assets");
BitmapSource bitmapSource = await GetBitmapImage(folder, "Barcode.png");
WriteableBitmap writeableBitmap = new WriteableBitmap(bitmapSource);
var rgb = new RGBLuminanceSource(writeableBitmap.ToByteArray(), writeableBitmap.PixelWidth, writeableBitmap.PixelHeight);
var hybrid = new HybridBinarizer(rgb);
BinaryBitmap binBitmap = new BinaryBitmap(hybrid);
Reader reader = new ITFReader();
try
{
Result result = reader.decode(binBitmap);
if (result != null)
{
this.textBlock.Text = result.Text;
}
}
catch (Exception ex)
{
this.textBlock.Text = ex.Message;
}
Unfortunately, my text box is being filled up with this Exception:
Exception of type 'com.google.zxing.ReaderException' was thrown.
I’m using this “lib”: https://silverlightzxing.codeplex.com/
Формат электронных документов Adobe – PDF – очень распространен в интернете и как корпоративный формат. В этом формате верстают презентации, журналы, инструкции и различные документы. На PDF-файлы может быть установлен пароль.
Инструкция
По желанию автора документа, при компиляции файла автор может установить пароль на открытие текста или презентации, находящейся внутри документа. Также пароль ставится на секретные или платные документы, статистические данные и т.д.Получить пароль можно двумя способами. Первый способ – официальный – узнать пароль у автора, за вознаграждение, если это возможно. Второй способ – подобрать пароль брутом, если вы не сможете связаться с автором, если автор – вы сами, и вы забыли пароль, или в других случаях.Брут представляет собой перебор паролей с помощью специального программного обеспечения. Подбор таким способом может занимать много времени, в зависимости от сложности пароля, а также от скорости работы процессора компьютера.
Для подбора пароля брутом подойдет утилита “PDF Password Remover” от производителя VeryPDF. Программа убирает защиту от копирования и дизассемблирования, а также снимает запрет на изменение и печать документа. Также “PDF Password Remover” убирает уникальный пароль на чтение PDF-документа. Программа может работать в пакетном режиме, т.е. вы можете составить список PDF-файлов, добавив их в “PDF Password Remover”, и утилита будет снимать цифровые ограничения в порядке очереди, пока уберет защиту со всех файлов.
Еще один представитель программного обеспечения, расшифровывающего PDF-файлы, это “Adult PDF Password Recovery”. Программа подбирает пароли для снятия защиты на открытие документа, а также на его последующее редактирование, печать и копирование данных. “Adult PDF Password Recovery” поддерживает работу со стандартом Acrobat 6.0 и выше – PDF1.5, может работать в пакетном режиме. Утилита имеет поддержку Adobe Standard 40 Bit Encryption и Adobe Advanced 128 Bit Encryption, что теоретически поможет подобрать пароль практически к любому файлу.
Видео по теме
Войти на сайт
или
Забыли пароль?
Еще не зарегистрированы?
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Я искал способ получить исходный код файла PDF, а не код HEX, а простой текстовый код, я намерен закодировать файл PDF из простого текста, таким образом я могу создать отчет PDF с ESP32 или, может быть, плата Arduino, загружающая исходный код в программу, сохраняющая его на SD-карту и переименовывающая его с расширением .pdf.
Я знаю, что это сложнее, чем просто добавлять строки и строки, как в случае с HTML-документом. Если я добавлю или удалю объект, файл будет поврежден, но мы планируем создать “макет PDF”, подобный этому:
Пример макета PDF
Пример таблицы макета PDF
Таким образом, я бы не стал удалять или добавлять какие-либо объекты, а просто изменял бы уже существующую строку. Я обнаружил, что могу создавать PDF-файлы из текстового редактора, такого как Блокнот, используя простой текст, как в этом примере:
%PDF-1.4
1 0 obj
<< /Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R
>>
endobj
2 0 obj
<< /Type /Outlines
/Count 0
>>
endobj
3 0 obj
<< /Type /Pages
/Kids [ 4 0 R ]
/Count 1
>>
endobj
4 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 612 792 ]
/Contents 5 0 R
/Resources << /ProcSet 6 0 R
/Font << /F1 7 0 R >>
>>
>>
endobj
5 0 obj
<< /Length 73 >>
stream
BT
/F1 24 Tf
100 100 Td
( Hello World ) Tj
ET
endstream
endobj
6 0 obj
[ /PDF /Text ]
endobj
7 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /MacRomanEncoding
>>
endobj
xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000364 00000 n
0000000466 00000 n
0000000496 00000 n
trailer
<< /Size 8
/Root 1 0 R
>>
startxref
625
%%EOF
Итак, я искал способ извлечь такой код из моего макета PDF, но мне удалось извлечь только HEX-код, который бесполезен для моей цели. Буду благодарен за любую помощь или руководство по этому проекту.
2 ответа
Лучший ответ
Для того, что вы предлагаете, одно из возможных решений – MuPDF / MuTool. Если вы хотите декомпилировать существующий PDF-файл, в MuPDF-GL есть параметры для окон с использованием опции A для преобразования в Ascii и “PrettyPrint”
Вы можете написать свой собственный PDF-файл в виде текста, но у него могут быть ограничения: он принимается как рабочий PDF-файл.
%PDF-1.2 4 0 obj << >> stream BT/ 36 Tf((Hello World!))' ET endstream endobj 3 0 obj << /Type /Page /Parent 2 0 R /Contents 4 0 R >> endobj 2 0 obj << /Kids [3 0 R ] /Count 1 /Type /Pages /MediaBox [ -195 -442 400 400 ] >> endobj 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj trailer << /Root 1 0 R > %%EOF
Любезно предоставлено Томасом см. Создайте поток памяти типа pdf и вернитесь к браузер
Если вы используете “ручное копирование” с 16-ю символами UTF на “маленьком устройстве”, становится на шаг сложнее см. https://stackoverflow.com / a / 68442444/10802527
Более полезно для создания вашего собственного множества пользователей RaspberryPi. Скомпилируйте PDF с помощью MuTool. Создайте https: // mupdf. com / docs / manual-mutool-create.html
Входной текст, который нужно перевести во время компиляции, намного проще, особенно для обработки изображений.
%%MediaBox 0 0 612 792
%%Font TmRm Times-Roman
%%Font Helv-C Helvetica Cyrillic
%%Font Helv-G Helvetica Greek
%%Image I0 logo/ClientLogo.png
% Draw the image.
q
480 0 0 480 50 250 cm
/I0 Do
Q
% Draw a triangle. (Can be rectangles or a grid etc)
q
1 0 0 rg
50 50 m
100 200 l
200 50 l
f
Q
% Show some text. (Remember we humans work downwards, so 50 in then 760,730,700, etc. downwards)
q
0 0 1 rg
BT /TmRm 24 Tf 50 760 Td (Hello, from EPS32!) Tj ET
BT /Helv-C 24 Tf 50 730 Td <fac4d2c1d7d3d4d7d5cad4c521> Tj ET
BT /Helv-G 24 Tf 50 700 Td ( I am Line 3) Tj ET
Q
0
K J
21 Авг 2021 в 23:00
Я нашел решение с помощью программного обеспечения PDFEdit. http://pdfedit.cz/en/pdfedit_windows.html В разделе отладки есть опция под названием Decode, она генерирует файл .decode, который я затем открывал с помощью NotePad, и я смог получить читаемый, изменяемый код (изменяемый в тех частях, которые мне нужны, например, Dates, Hour Names, Температура, маршруты и т. Д.). Вы можете попробовать это и изменить текст, а затем сохранить его как .pdf, и вы сможете увидеть изменения. Свидетельство: Исходный документ без изменений “Исходный код” в Блокноте после изменения текста я сохранил его как .pdf и увидел нужные мне изменения. [Документы, измененные с помощью Блокнота 3
Код действительно обширный (5000 строк), но, возможно, я смогу сгенерировать какой-нибудь действительно простой шаблон и уменьшить эти строки. Спасибо всем!
0
Diego Estrada
21 Авг 2021 в 21:43
Содержание
- Анализ подозрительных PDF файлов
- Ищем эксплойты в PDF-документах своими силами
- Содержание статьи
- WARNING
- Многообещающий аттач
- PDF-формат
- Хакер #178. Mesh-сети или строим свой интернет
- Наиболее интересные «поля»
- Инструментарий
- Непростая задача
- Обычный JavaScript
- Исследование шелл-кода
- Сжатые потоки
- Обфусцированный JavaScript
- PDF & SWF
- Подопытные для анализа
- Подводя итоги
- Дружим с PDF
- Структура файла
- Типы данных
- Инкрементальные обновления
- Представление документа
- Извлечение текста и iTextSharp
- Заключение
- Что скрывает PDF
- Информационные метаданные
- Дополнительные метаданные
- Метаданные объектов
- Дополнительное сохранение/обновление
- Комментарии PDF
- Один большой словарь!
Анализ подозрительных PDF файлов
Несколько месяцев назад я столкнулся с интересной задачей по анализу подозрительного pdf файла. К слову сказать, обычно я занимаюсь анализом защищенности веб приложений и не только веб, и не являюсь большим экспертом в направлении malware analysis, но случай представился довольно любопытный.
Практически все инструменты представленные в данной статье содержаться в дистрибутиве Remnux, созданном специально в целях reverse engineering malware. Вы можете сами загрузить себе образ виртуальной машины для VirtualBox или Vmware.
Первым делом я проанализировал полученный экземпляр с помощью скрипта pdfid:
Декодировал javascript код с помощью все того же pdf-parser:
Привел к удобному виду, для этого можно воспользоваться js-beautify:
Неплохо. Также проанализировал файл с помощью отличной утилиты jsunpack:
На первый взгляд им была обнаружена уязвимость CVE-2009-1492, связанная с выполнением произвольного кода или отказа в обслуживании через Adobe Reader и Adobe Acrobat версий 9.1, 8.1.4, 7.1.1 и ранних версий, с помощью pdf файла, содержащего annotaion и использующего метод getAnnots. Но если проверить мои результаты, полученные выше, с соответствующим exploit-ом, то обнаруживается, что эта уязвимость не имеет отношения к текущему случаю. В нашем варианте annotaion используется для хранения большой части скрипта в том числе в целях обфускации.
Данные из annotaion вызываются методом getAnnots и находятся в объекте 9 нашего файла(как показал pdfparser). Сохраним полученный javascript код, добавив к нему поток из объекта 9. Обычно, первым шагом для безопасного выполнения кода является замена функции eval безобидным alert или console.log и открытии файла с помощью браузера. Также в этих целях можно использовать Spidermonkey. Основные необходимые нам функции и переменные уже определены в файле pre.js, который вы также можете обнаружить в дистрибутиве Remnux.
Неплохо. После запуска Spidermonkey мы получили новый скрипт, который использует функции eval и поток данных из объекта 7:
Наиболее интересная вещь в данном скрипте скрыта в переменной var v12 – это функция arguments.callee. Arguments.callee обозначает вызов самой текущей исполнемой функции. Таким образом этот код использует сам себя в целях обфускации. То есть если вы изменяете что то в текущем коде (как я делал ранее при рефакторинге или замене функции eval на alert) вы сломаете всю следующую часть расшифровки. Но не стоит отчаиваться. Статьи, описывающие подобные ситуации: isc.sans.org/diary/Browser+*does*+matter%2C+not+only+for+vulnerabilities+-+a+story+on+JavaScript+deobfuscation/1519, isc.sans.edu/diary/Static+analysis+of+malicous+PDFs+%28Part+%232%29/7906 и www.nobunkum.ru/ru/flash (от Алисы Шевченко).
В этом случае мы можем заменить вызов arguments.callee.toString().length на длину самой функции и идти дальше, заменяя вызов arguments.callee.toString().charCodeAt(0) первым символом в строке нашей функции.
Нет необходимости декодировать весь код, достаточно выполнить полученный скрипт с данными с помощью все того же spidermonkey или воспользоваться jsunpack.
Финальный скрипт выглядел так:
После рефакторинга получил:
Как видно во втором случае используются наши unescape(«%u0c0c%u0c0c») и this.collabStore = Collab.collectEmailInfo(>);
2. В функции func_04 использована переменная var v0 также со значением 0x0c0c0c0c, что как бы намекает на наличие heap spray эксплоита. Почему это значение столь популярно можно почитать тут www.corelan.be/index.php/2011/12/31/exploit-writing-tutorial-part-11-heap-spraying-demystified.
В переменных v3, v4 просматривается shellcode из-за наличия серии NOP инструкций в начале значений переменных.
Чтобы подтвердить мои предположения я использовал эмулятор libemu из бесплатного продукта PDFStreamDumper со значением, взятым из переменной v4. Также libemu вы можете найти и в Remnux:
Бинго. Обнаружился url xxxxxx.info/cgi-bin/io/n002101801r0019Rf54cb7b8Xc0b46fb2Y8b008c85Z02f01010 который и использовался для загрузки с последующем исполнением нашего вредоноса:
3. Также параметры сравнения, обнаруженные в скрипте:
выглядят также как описано в CVE-2009-2990: Ошибка индекса в массиве Adobe Reader и Acrobat 9.x до версии 9.2, 8.x и 8.1.7, а также с версии 7.x до 7.1.4 позволяет выполнить произвольный код.
В кодируемом FlateDecode потоке объекта 11 мы также обнаруживаем код в U3D:
Теперь мы имеем URL, Shellcode, несколько CVE и этого вполне достаточно для данной статьи.
Автор статьи: Андрей Ефимюк, эксперт в области ИБ, OSCP, eCPPT, хороший друг PentestIT.
Оригинал статьи
Источник
Ищем эксплойты в PDF-документах своими силами
Содержание статьи
Стоит засветить свой почтовый адрес в Сети, как сразу ты становишься просто потрясающе удачливым человеком. Почти каждый день начинают приходить письма о том, что ты претендуешь на какое-то огромное наследство или выиграл в лотерею. Добрые люди присылают PDF’ки со сверхсекретными данными, и очень часто даже антивирусы на них не ругаются. Поэтому, чтобы окончательно решить, стоит ли открывать очередной «секретный отчет по Сирии», придется провести собственное расследование.
WARNING
Многообещающий аттач
Как-то раз, приводя в порядок почтовый ящик и удаляя нежелательную корреспонденцию, я наткнулся на несколько писем с вложением, якобы от британского подразделения Google (правда, отправленных почему-то с китайских серверов), с очередным заманчивым предложением. Собственно, внимание привлекли не сами письма, а то, что они были с вложением в виде PDF-файла. «Вот китайские друзья! Вот молодцы! Прислали мне 0-day», — подумал я. И сразу же полез проверить файл на virustotal — вдруг это какое-то старье. Подумав, сервис ответил, что файл абсолютно нормальный, — ни один антивирус не имел к нему никаких вопросов. «Что-то здесь не так. Не могли же мои китайские друзья так меня подвести?» Развеять сомнения можно было только одним способом — взять и исследовать файл самому. Результатом и полученными знаниями я и хотел бы с тобой поделиться.
PDF-формат
Прежде чем начать, давай кратко рассмотрим формат PDF-документов. PDF-файлы состоят в основном из объектов, которые бывают восьми типов: boolean-значения; числа; строки; имена (Names); массивы (упорядоченный набор объектов); словари (Dictionaries) — коллекция элементов, индексируемых по имени; потоки (Streams) — обычно содержащие большой объем данных; Null-объекты.
Хакер #178. Mesh-сети или строим свой интернет
JavaScript указывает на косвенный объект
Наиболее интересные «поля»
Как мы выяснили, PDF-файл состоит из заголовка, объектов, таблицы перекрестных ссылок (для определения местоположения объектов) и трейлера. С точки зрения охоты за эксплойтами самыми интересными для нас строками будут:
Пример зашифрованной строки
Инструментарий
Для исследования PDF-файлов пригодятся следующие инструменты:
Непростая задача
Обычно злоумышленники стараются как можно лучше замаскировать наличие в PDF-файле какого-либо злонамеренного контента. Для этого они прибегают к обфускации JavaScript-кода, манипуляциям над строками и прочим приемам, усложняющим анализ как антивирусным решениям, так и исследователям. Сегодня перед нами стоит задача, несмотря на все хитрые приемы злоумышленников, научиться находить вредоносные части PDF-файлов и определять, какой функционал кроет в себе внедренный шелл-код.
В принципе, про анализ любого вредоносного PDF-файла можно написать целую статью, так как каждый экземпляр использует свой шелл-код, свои методы для сокрытия вредоносной части и прочие трюки, осложняющие жизнь исследователю. Поэтому мы рассмотрим лишь основные методы сокрытия и техники поиска, которые применимы ко всем PDF-файлам. А в каждой конкретной ситуации придется думать головой и искать методы решения. Начнем с рассмотрения самой простой ситуации и постепенной перейдем к более сложным.
Обычный JavaScript
Пример работы pdfid.py
Если в документе присутствует JavaScript, то велика вероятность того, что он содержит вредоносный код. Поэтому дальше надо анализировать его. Так как мы начали с самого простого случая, то никаких дополнительных техник сокрытия не используется и вытащить JS-код из PDF’ки можно с помощью pdf-parser.py:
или с помощью PDF Stream Dumper. После чего сохранить в отдельный файл для последующего анализа. Следующим нашим шагом будет изучение кода скрипта и выделение из него шелл-кода для последующего анализа.
Исследование шелл-кода
где pdf-exp.txt — файл с исходным шелл-кодом, shellcode.bin — файл, в который будет записан преобразованный шелл-код. После этого можно приступить к его исследованию. Для этого можно воспользоваться тулзой sctest, входящей в библиотеку libemu:
Исследование шелл-кода при помощи sctest
После чего мы получим список всех API-вызовов, выполняемых из шелл-кода. Есть у sctest еще одна интересная возможность, о которой хотелось бы упомянуть, — с ее помощью исследуемый код можно представить в виде графа вызовов:
Иногда встречаются ситуации, когда для исследования приходится пользоваться обычным отладчиком. Перед этим надо написать небольшую вспомогательную программку, которая бы передавала управление на шелл-код, следующего вида:
После чего скомпилировать и запустить под отладчиком для дальнейшего анализа.
Сжатые потоки
В рассмотренном выше случае все было предельно упрощено, увы, но в реальной жизни такие сценарии практически не встречаются. Поэтому давай рассмотрим наиболее популярные приемы, которые используются для сокрытия вредоносного кода.
После этого у нас появится файл uncompressed.pdf с распакованным содержимым, пригодным для дальнейшего анализа. Ну а дальше действуем по использованной выше схеме.
Обфусцированный JavaScript
Ну а дальше анализируем шелл-код и выясняем его функционал.
Эксплойт использует уязвимость в media.newPlayer (CVE-2009-4324)
PDF & SWF
До этого момента мы рассматривали только уязвимости, связанные с ошибками в движке JavaScript. Однако существует еще один вектор распространения вредоносных программ. Дело в том, что PDF-файлы можно использовать просто как «контейнеры»» для хранения и доставки пользователю зараженных SWF-файлов. Да, эти два популярных продукта приносят много хлопот Adobe, которой периодически приходится выпускать security-обновления :). Чтобы проанализировать вредоносные Flash-файлы, их надо предварительно вытащить из PDF-документа. Выполнить это можно при помощи утилиты SWF Mastah:
Подопытные для анализа
Чтобы не сидеть и не ждать, пока тебе придет письмо с PDF-файлом, который можно было бы проанализировать, лучше воспользоваться архивами вредоносных аттачей, использовавшихся для фишинга и целевых атак. Архивы скачиваются без проблем, правда, для их распаковки надо будет связаться с владельцем ресурса, чтобы получить пароль.
Если не хочется ничего скачивать, то можно воспользоваться услугами Metasploit Framework. Запускаем msfconsole и выполняем следующие действия:
После чего на порту 8080 поднимается HTTP-сервер, который при подключении к нему возвращает пользователю зараженный выбранным пэйлоадом PDF-файл.
Таким образом, при помощи wget’а ( MARKDOWN_HASHd2cc360a8dce9a6c58ef159660c7830aMARKDOWN_HASH ) или браузера можно заполучить этот файл для дальнейшего анализа.
Подводя итоги
Сегодня мы познакомились с тем, каким образом можно проводить анализ зараженных PDF-файлов, и рассмотрели основные методы защиты вредоносного кода от исследования. Из-за пристального внимания к безопасности продуктов Adobe можно найти в Сети много инструментов, которые могут взять большую часть рутинной работы по анализу PDF’ок на себя. Так что ты всегда сможешь выбрать софт для решения той или иной задачи. Правда, от необходимости шевелить извилинами это тебя никак не избавит. Что касается меня, то мой файл оказался простой пустышкой. В нем не было ни JavaScript, ни встроенных SWF’ок — лишь только пара изображений и текст. Поэтому, немного разочарованный, я пошел дальше ждать своего халявного 0-day-эксплойта. Надеюсь, скоро пришлют :).
Источник
Дружим с PDF
Текстовый формат PDF становится стандартом электронного документооборота во всем мире. Поэтому у программистов регулярно возникает задача извлечения текста из таких файлов. Вместе с ней появляются и более сложные задачи, например, получение текстовой структуры документа. Чтобы подружиться с PDF и решать эти задачи, изучим формат данных. После этого познакомимся с C# библиотекой iTextSharp — инструментом для работы с PDF-файлами.
Структура файла
PDF — текстовый формат, но имеет достаточно сложную структуру. Он может содержать мультимедиа, ссылки и многое другое. Для примера возьмем простой тестовый документ. Изучать формат начнем со структуры файла. Он включает четыре раздела.
Заголовок. Заголовком называется первая строка файла. Она содержит информацию о версии PDF. В нашем тестовом документе заголовок выглядит так:
PDF начал свою историю с версии 1.0. Последняя на текущий момент версия — 1.7. Символ % обозначает комментарий в языке PostScript, который лег в основу формата.
Тело. Все содержимое документа находится в теле файла. Типы данных, которые встречаются в теле, рассмотрим в следующем разделе.
Таблица xref. Эта таблица содержит ссылки на все объекты документа. Благодаря ей, не нужно читать весь документ, чтобы найти нужный объект. Таблица xref состоит из секций. Каждая секция соответствует новой версии документа.
Таблица ссылок начинается со слова xref. Каждая секция начинается с двух чисел: идентификатора первого объекта и количества объектов в секции. Объекты представляются двумя последовательностями байтов. Первая соответствует позиции первого байта объекта в файле, а вторая — номеру поколения. О поколениях и метках f и n будет немного позже.
Хвост. Этот раздел дает информацию о расположении ключевых объектов в файле. Например, в нем прописано смещение таблицы xref от начала файла. Поэтому любое программное чтение PDF-документа начинается с хвоста. В нашем примере:
Хвост начинается с ключевого слова trailer. Он включает в себя словарь с мета-информацией о документе и позицию начала таблицы ссылок. Конец файла отмечается строкой %%EOF. В словарь хвоста входят данные о количестве объектов (/Size), ссылки на каталог документа (/Root — об этом немного позже) и информационный словарь (/Info), а также идентификатор файла (/ID).
Типы данных
В теле документа содержится вся информация, которая отображается пользователю. Она может быть представлена восемью типами данных:
Любой PDF-объект может быть помечен уникальным идентификатором и использоваться как ссылка. Такие объекты называются косвенными. Они начинаются с идентификатора, номера поколения и ключевого слова obj. Заканчивается косвенный объект словом endobj. На эти объекты можно ссылаться в таблице xref и любом другом объекте (для этого используется символ R). Так как они содержатся в таблице ссылок, доступ к ним осуществляется очень быстро.
Инкрементальные обновления
Формат PDF спроектирован с идеей инкрементальных обновлений документа. То есть, при изменении содержимого, файл не перезаписывается заново. В его конец добавляются новый заголовок, xref таблица и хвост. В новых таблицах ссылок будут записаны только те объекты, которые были добавлены, изменены или удалены. Удаленные объекты помечаются символом f, а новые символом n. Каждый хвост содержит запись /Prev, которая указывает на предыдущую таблицу xref.
Представление документа
Содержимое документа составляют объекты из тела файла. Как мы уже выяснили, они могут содержать ссылки друг на друга. На деле ссылочная структура объектов представляет собой дерево. В корне находится объект, который называется каталог документа. Его потомки — важные структурные элементы, одним из которых является дерево страниц. Рассмотрим подробнее, что оно из себя представляет.
Каталог документа ссылается на корень дерева страниц. Листья дерева являются страницами. Каждый узел дерева содержит информацию о родителе, детях и количестве листьев среди потомков. Каждую страницу документа можно найти по записи /Page, корень дерева страниц — по записи /Pages, а каталог документа — по /Catalog.
Извлечение текста и iTextSharp
Теперь, когда мы получили общее представление о формате данных PDF, мы можем перейти к связанным с ним задачам. Структура PDF-документов сложна, поэтому даже задача извлечения текста не является тривиальной. Текст содержится в объектах, где есть потоки. Обычно он сжат, возможно, несколькими способами. Об этом скажут те самые фильтры из мета-информации потока. Кроме того, каждый символ в потоке зашифрован в соответствии с таблицей символов, которая также хранится в PDF-документе.
Мы не будем самостоятельно реализовывать алгоритм извлечения текста. Если вы используете язык C# для решения своих задач, подходящим инструментом для работы с PDF-документами будет библиотека iTextSharp. Она предоставляет интерфейс к той структуре, что мы обсудили, и реализует решения стандартных задач.
Для работы с существующим PDF-документом создадим экземпляр класса PdfReader.
PdfReader содержит информацию о всех тех объектах, которые были рассмотрены. Например, мы можем просмотреть мета-информацию каталога документа:
Для извлечения текста из документа используется статический класс PdfTextExtractor. Помимо PdfReader’а он принимает на вход номер страницы.
Задачи, связанные со структурой текста, такие как выделение параграфов, заголовков и тому подобные вообще не имеют общего решения. Это связано с тем, что в PDF-файле не хранится этой информации, только лишь потоки текста. Но PdfTextExtractor может принимать третий параметр – реализацию интерфейса ITextExtractionStrategy. Вы можете написать свою стратегию обработки текста, которая будет учитывать специфичные для вашего случая параметры (позицию на странице, шрифт и т.д.). В результате вы получите не только текст, но и структурные элементы.
Заключение
Формат PDF был тщательно спроектирован и имеет достаточно замысловатую структуру. Он имеет механизмы для инкрементального обновления, что позволяет рационально сохранять новые версии файла и хранить историю документа. Кроме того, PDF-файл может включать сложные мультимедийные элементы. Однако работа с текстом документа тоже усложняется. iTextSharp – вариант C# разработчиков для взаимодействия с PDF-документами.
Источник
Что скрывает PDF
В файлах PDF много информации. Бóльшая часть используется для одинаковой визуализации документа на разных платформах. Но также есть множество метаданных: дата и время создания и редактирования, какое приложение было использовано, тема документа, название, автор и многое другое. Это стандартный набор метаданных, а имеются способы вставить в PDF пользовательские метаданные: скрытые комментарии в середине файла. В данной статье мы представим некоторые формы метаданных и покажем, где их искать.
Начиная с PDF 1.0 существует стандартизированный набор значений, которые могут быть дополнительно добавлены в документ. Файловые менеджеры используют эти значения, чтобы улучшить поиск по документам. Они включают в себя:
Теперь стандарт PDF поддерживает ещё больше метаданных. Вместо небольшого набора значений по умолчанию можно хранить целый поток информации в формате XMP. В результате, туда можно внедрить данные любого типа. Опять же, они не отображаются, но их способен проанализировать менеджер файлов.
Поток XMP можно закодировать, поэтому он не всегда читается людьми, но многие приложения умеют читать и редактировать эту информацию. Вот пример того, как выглядит XMP в формате, удобном для чтения людьми:
Как несложно понять, эта информация неоценима при попытке определить историю документа или попытке внедрить другую информацию. PSPDFKit для iOS и Android поддерживает чтение и редактирование метаданных.
Потоки метаданных не ограничиваются только документами; метаданные также можно назначить любому объекту в документе. Например, потоку со встроенным изображением. Чтобы усложнить ситуацию, вспомогательные метаданные также могут храниться в самом потоке. Если пойти ещё дальше, мы можем встроить PDF в метаданные потока изображений, тем самым достигнув бесконечной рекурсии! Поэтому в следующий раз, когда будете проверять метаданные на наличие информации, помните, что вам, возможно, придётся пройти несколько уровней, чтобы найти информацию, которую вы ищете.
Дополнительное сохранение/обновление
В стандарте PDF есть концепция дополнительного сохранения, которую многие приложения, включая PSPDFKit, реализуют для ускорения сохранения. Короче говоря, этот метод добавляет дополнительную информацию в конец документа, и старые объекты, на которые больше нет ссылок, останутся висеть там. Это здорово, когда вы изменяете элементы документа на лету и не хотите ждать длительного процесса сохранения, или, например, для функции автоматического сохранения, где процесс выполняется в фоновом потоке, а мы хотим использовать минимум ресурсов.
Как можно понять, это открывает целый ящик Пандоры: история документа показывает конфиденциальную или ошибочную информацию, которую удалили с глаз, но она осталась в документе. В таких ситуациях рекомендуется выполнить полное сохранение документа. Это приведёт к удалению старых объектов или даже «сглаживанию», так что формы нельзя будет отредактировать в будущем.
Комментарии PDF
Во многих языках программирования предусмотрены комментарии, чтобы компилятор или интерпретатор игнорировал строку, такая же опция есть в PDF. Символ % используется в формате разными способами, но один из них — указание на комментарий в коде. Поэтому, если пользователь открывает документ в текстовом редакторе, то может увидеть некоторые секретные сообщения, вставленные вашим PDF-процессором. PDF-рендеры будут игнорировать эти строки комментариев, поэтому файл выглядит правильно и не показывает никаких комментариев после рендеринга.
Один большой словарь!
Последнее, что следует отметить, что формат PDF на самом деле — один большой словарь! Технически кто угодно может внедриться документ и что-то изменить. Не каждое изменение осуществляется так легко, как редактирование одной строки, но его можно сделать. По этой причине всегда следует помнить о том, какая информация может скрываться в PDF. Кроме того, если вы обрабатываете конфиденциальную информацию, следует обязательно использовать цифровые подписи для гарантии, что документ не изменён кем-то, кроме его автора, и что автор является тем, кого вы ожидаете, а не кем-то другим.
Источник