Дружим с PDF
Дружим с 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).
Типы данных
В теле документа содержится вся информация, которая отображается пользователю. Она может быть представлена восемью типами данных:
- Булевы значения. Тут все привычно — true или false.
- Числа. Включают два типа данных — integer и real. Дробная часть в вещественных числах отделяется точкой.
- Имена. Представляют собой последовательность ASCII символов. Они начинаются со слеша, который не входит в имя. Вместо непосредственно символов могут включать их шестнадцатеричные коды, начинающиеся с символа #. Пример: запись /Te#73t соответствует имени Test.
- Строки. Ограничены длиной в 65535 байтов. Записываются в круглых либо треугольных скобках. Могут быть представлены как ASCII символами, так и шестнадцатеричными или восьмеричными кодами.
- Массивы. Могут содержать любые PDF-объекты. Элементы разделяются пробелом и заключаются в квадратные скобки.
- Словари. Представляют коллекцию пар ключ-значение. Ключом должно быть имя, а значением может быть любой объект. Запись словаря начинается с символов «, а заканчиваются — ».
- Потоки. Streams. Потоки содержат неограниченные последовательности байтов. В них содержится основное содержимое документов. Поток начинается с ключевого слова stream и заканчивается словом endstream. Перед началом потока записывается словарь с мета-информацией. Он включает данные о количестве байтов, фильтре применимом их к обработке и так далее.
- Null-объекты. Представляются ключевым словом null.
Любой 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-документами.
Просмотр содержимого файлов в командной строке Linux
Рассмотрим несколько команд, которые используются для просмотра содержимого текстовых файлов в командной строке Linux.
Команда cat
Команда cat выводит содержимое файла, который передается ей в качестве аргумента.
Это самый простой и наиболее часто используемый способ для вывода содержимого текстовых файлов. Но выводить большие файлы через cat не всегда удобно.
Команда nl
Команда nl действует аналогично команде cat , но выводит еще и номера строк в столбце слева.
Команду nl удобно применять для просмотра программного кода или поиска строк в файлах конфигурации.
Команда less
Утилита less выводит содержимое файла, но отображает его только в рамках текущего окна в режиме просмотра.
Вы можете прокручивать текст файла клавишами стрелок или перелистывать страницы клавишами w и z .
Для поиска текста внутри файла нажмите / .
Для просмотра списка доступных горячих клавиш нажмите h
Чтобы выйти из режима просмотра используется клавиша q .
Очень удобно, что после выхода окно терминала остается чистым и не содержит текст файла.
Команда more
Команда more очень похожа на команду less . Она также выводит файл в терминале в режиме просмотра, но имеет некоторые отличия от команды less.
Например, less в конце файла выводит сообщение (END) (или EOF — End Of File) и ожидает нажатия клавиши q чтобы закрыть режим просмотра, а more по достижении конца файла сразу возвращает управление в терминал.
Также more после своей работы оставляет текст файла в терминале, а less работает «чисто» и не сохраняет текст в терминале.
Команда head
Команда head выводит на экран только первые 10 строк файла.
Используя опцию -n можно задать количество строк, которое нужно вывести. Например, чтобы вывести 15 строк используется команда:
Вместо -n можно просто использовать знак минус — , за которым сразу указывается количество строк.
Команда tail
Команда tail аналогична команде head , но выводит последние 10 строк файла.
Заключение
Команды, которые мы рассмотрели, имеют дополнительные возможности и области применения. Для получения справки по каждой команде можно воспользоваться Man-страницами.
Работа с файлами и каталогами в Linux
В этом руководстве для начинающих пользователей мы ознакомимся с основными командами для работы с файлами и каталогами (иногда их еще называют директориями) в Linux-системах.
Требования
Cервер с Ubuntu 20.04
Все команды, описанные ниже, будут работать и в других дистрибутивах Linux.
Расположение каталогов в файловой системе
При входе на сервер, вы, как правило, попадаете в домашний каталог вашей учетной записи, отведенный для хранения файлов и создания директорий.
Для того чтобы узнать, где располагается каталог, в котором мы сейчас находимся, используется команда:
Результат выполнения команды выглядит следующим образом:
Домашний каталог располагается после имени учетной записи пользователя, в приведенном примере он называется /demo. Этот каталог находится в каталоге с именем /home и в каталоге верхнего уровня, который называется root или корневой каталог, поэтому представлен одной косой чертой /.
Просмотр содержимого каталогов
Для просмотра содержимого каталога используется команда ls. Название этой команды является сокращением слов list files.
Просмотреть содержимое любой директории можно следующими способами:
Либо введя команду:
В результате выполнения команды отображаются файлы и каталоги, находящиеся внутри данного каталога:
К команде ls можно добавлять дополнительные флаги, например, чтобы показать детализированное представление (права, список владельцев файлов или папок, размер, дату последнего модифицирования) файлов и директорий в текущей директории, можно использовать флаг -l:
Результат выполнения команды:
Для просмотра списка всех файлов, включая скрытые файлы и каталоги, вы можете добавить флаг -a:
Результат выполнения команды:
Отобразить содержимое текущей директории с добавлением к именам символов, характеризующих тип, можно с помощью команды:
Результат выполнения команды:
Перемещение между каталогами
Для перехода в домашний каталог используется команда cd. Название этой команды является сокращением слов change directory.
Для перехода в домашний каталог пользователя user используется команда:
Для перехода в предыдущую директорию, в которой мы находились до перехода в текущую директорию также используется команда cd.
В Linux-системах каждый файл и каталог находятся в самой верхней директории, которая называется «корневой» и обозначается одним символом слэш /.
Абсолютный путь указывает на расположение каталога по отношению к этой директории верхнего уровня. Это позволяет обращаться к справочникам однозначным образом из любого места в файловой системе.
Каждый абсолютный путь должен начинаться с косой черты — символа слэш /.
Для перехода в директорию уровнем выше используется команда:
Для перехода в директорию двумя уровнями выше:
Операции с файлами и каталогами
У каждой команды имеется множество параметров, чтобы узнать их, наберите команду и параметр —help, например:
Далее приведен список основных команд навигации в консоли Linux.
Создание
Создание файлов производится с помощью команды:
Создание каталогов выполняется с помощью команды вида:
Название этой команды является сокращением слов make directory.
Создание двух каталогов одновременно выполняется с помощью команды:
Для создания дерева каталогов используется команда следующего вида:
Удаление
Для удаления директорий используется команда rmdir имя_директории. Название этой команды является сокращением слов remove directory.
Для удаления файлов используется команда rm. Например, для удаления файла с именем file1 используется команда:
Команда rm также позволяет удалять не только файлы, но и каталоги.
Для удаления директории с именем dir1 со всеми подкаталогами и файлами используется опция -r (от слова recursive):
Можно удалить одновременно две директории со всем их содержимым:
Также можно использовать параметр -f, который означает, что при удалении не будет запрашиваться подтверждение.
Команда для удаления файла будет выглядеть так:
Команда для удаления каталога:
Перемещение
Для перемещения и переименования файлов и каталогов используется команда mv. Название этой команды является сокращением слова move.
Переименовать файл можно с помощью команды:
Для того чтобы переместить файл, используется команда:
Копирование
Для копирования используется команда cp. Название этой команды является сокращением слова copy.
Чтобы скопировать файл file1 и назвать его file2, используется команда:
Для того чтобы копировать директорию dir1 в директорию dir2, используется команда:
Скопировать файл с именем file1 в директорию с именем dir1, можно с помощью команды:
Редактирование файлов
Мы ознакомились с основными командами для работы с каталогами и файлами.
Далее мы изучим, как редактировать файлы и добавлять в них содержание.
Команда nano позволяет работать в одном из самых простых текстовых редакторов командной строки Linux, который занимает весь терминал в течение всего срока его использования.
В результате ввода в терминал команды nano будет открыт чистый файл.
Интерфейс выглядит следующим образом:
В верхней части открывшегося редактора отображается имя приложения и имя файла, который мы редактируем.
В середине должно располагаться содержимое файла, в настоящее время оно пустое.
В нижней части интерфейса расположен ряд комбинаций клавиш, которые указывают с основными элементами управления текстового редактора. Для каждого из них символ ^ означает клавишу CTRL.
Для того чтобы открыть справку используйте сочетание клавиш CTRL-G.
Закрывается справка с помощью сочетания клавиш CTRL-X. После закрытия справки мы возвращаемся к редактированию.
Вводить и редактировать можно любой текст, например, можно ввести: “Hello World!”
Для сохранения внесенных изменений следует нажать сочетание клавиш CTRL-O. Внимание! Это буква О, а не ноль.
Далее система попросит вас ввести либо подтвердить имя файла, который вы хотите сохранить:
Как вы можете видеть, параметры в нижней части окна редактирования также изменились. Они являются контекстными, то есть будут меняться в зависимости от того, что вы пытаетесь сделать.
После ввода имени файла нажмите клавишу ENTER.
Для того чтобы выйти из тестового редактора нажмите сочетание клавиш CTRL-X.
Если вы внесли изменения и не сохранили файл, вам будет предложено сохранить сделанные вами изменения:
Вы можете нажать клавишу Y, чтобы сохранить изменения, клавишу N для отмены изменений и выхода, или сочетание клавиш CTRL-C, чтобы отменить операцию выхода из режима редактирования файла.
Если вы решили сохранить изменения, вам будет предложено сохранить их в том же файле, который был отредактирован.
Нажмите клавишу ENTER, чтобы сохранить файл и выйти из редактора.
Заключение
Мы ознакомились с возможностями просмотра доступных файлов и каталогов, с основными командами для работы с файлами, которые позволяют просматривать, копировать, перемещать и удалять файлы, а также с основами редактирования в текстовом редакторе nano.
База знаний
rsync — резервное копирование и синхронизация файлов и папок
Rsync — мощный инструмент облегчающий рутинную операцию создания резервных копий либо синхронизацию файлов и папок.
Важно отметить, что передача файлов выполняется в один поток, в отличие от других подобных программ, создающих отдельный поток для передачи каждого файла. Данная опция увеличивает скорость передачи и уменьшает задержки при передачи небольших файлов.
- Возможность поддерживать синхронизацию целых деревьев каталогов
- Можно сохранять символические ссылки, жесткие ссылки, владельцев и права файла, метаданные и время создания
- Не требует особых привилегий
- Передача файлов одним потоком
- Поддержка RSH, SSH в качестве транспорта
- Поддержка анонимного Rsyn
Установка rsync
Синтаксис rsync
Синтаксис rsync выглядит следующим образом
В качестве источника и приемника может выступать удаленная или локальная директория.
Опции rsync
-v — Выводить подробную информацию о процессе копирования;
-q — Минимум информации;
-c — Проверка контрольных сумм для файлов;
-a — Режим архивирования, когда сохраняются все атрибуты оригинальных файлов;
-R — Относительные пути;
-b — Создание резервной копии;
-u — Не перезаписывать более новые файлы;
-l — Копировать символьные ссылки;
-L — Копировать содержимое ссылок;
-H — Копировать жесткие ссылки;
-p — Сохранять права для файлов;
-g — Сохранять группу;
-t — Сохранять время модификации;
-x — Работать только в этой файловой системе;
-e — Использовать другой транспорт, например, ssh;
-z — Сжимать файлы перед передачей;
—delete — Удалять файлы которых нет в источнике;
—exclude — Исключить файлы по шаблону;
—recursive — Перебирать директории рекурсивно;
—no-recursive — Отключить рекурсию;
—progress — Выводить прогресс передачи файла;
—stat — Показать статистику передачи;
—version — Версия утилиты.
Пример синхронизации rsync
Рассмотрим пример синхронизации локальных файлов и папок
Данная команда копирует файл с именем file в папку /backups/
Если добавить опцию —progress вы сможете увидеть прогресс копирование и сколько времени осталось до завершения операции копирования.
Синхронизация папок выполняется так же легко как и копирование файлы, вместо имени файла указываем путь до папки которую нужно синхронизировать.
Синхронизация на удаленных сервер выполняется по типу локальной, но в качестве приемника мы указываем имя пользователя, сервер и директорию в которую нужно произвести синхронизацию.
Обратная синхронизация файлов.
Синхронизация не всех файлов и папок
Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями. В примере выше указано, как скопировать только те файлы которые начинаются на букву G.
Как вы могли заметить, утилиты очень простая в использовании но в тоже время предоставляет широкий спектр возможностей при копировании и синхронизации файлов.
- rsync, linux, debian, ubuntu, vds, backup, синхронизация, резервное копирование
- 2 Пользователи нашли это полезным
Связанные статьи
Для установки SSH-соединения из-под Windows скачайте и запустите программу-клиент PuTTYЗапустите.
VPS (англ. Virtual Private Server) или VDS (англ. Virtual Dedicated Server) — услуга, в рамках.
КомандаОписание Системная информация arch отобразить архитектуру компьютера uname.
ВАЖНО: для успешного создания NS в ISP Manager Вам нужно не менее 2 ip. Убедитесь, что вы.
Связка двух веб-серверов, один из которых выполняет функцию фонтенда (Nginx), другой — бэкенда.