Меню

Парсинг pdf таблиц python



Работа с PDF-файлами в Python: чтение и разбор

Сегодня формат переносимых документов (PDF) относится к наиболее часто используемым форматам данных. В 1990 году структура документа PDF была определена Adobe. Идея, лежащая в основе формата PDF, заключается в том, что передаваемые данные / документы выглядят одинаково для обеих сторон, участвующих в процессе коммуникации — для создателя, автора или отправителя и получателя. PDF является преемником формата PostScript и стандартизирован как ISO 32000-2: 2017 .

Обработка PDF документов

Для Linux существуют мощные инструменты командной строки, такие как pdftk и pdfgrep. Как разработчик, вы с огромным энтузиазмом создаете свое собственное программное обеспечение, основанное на Python и использующее свободно доступные библиотеки PDF.

Эта статья — начало небольшой серии, в которой будут рассмотрены эти полезные библиотеки Python. В первой части мы сосредоточимся на манипулировании существующими PDF-файлами. Вы узнаете, как читать и извлекать содержимое (как текст, так и изображения), вращать отдельные страницы и разбивать документы на отдельные страницы. Вторая часть будет посвящена добавлению водяных знаков на основе наложений. Третья часть будет посвящена исключительно написанию / созданию PDF-файлов, а также удалению и повторному объединению отдельных страниц в новый документ.

Инструменты и библиотеки

Спектр доступных решений для связанных с Python инструментов, модулей и библиотек PDF немного сбивает с толку, и требуется время, чтобы понять, что к чему и какие проекты поддерживаются постоянно. На основании нашего исследования это те кандидаты, которые соответствуют современным требованиям:

PyPDF2 : библиотека Python для извлечения информации и содержимого документов, постраничного разделения документов, объединения документов, обрезки страниц и добавления водяных знаков. PyPDF2 поддерживает как незашифрованные, так и зашифрованные документы.

PDFMiner : полностью написан на Python и хорошо работает для Python 2.4. Для Python 3 используйте клонированный пакет PDFMiner.six . Оба пакета позволяют анализировать и преобразовывать PDF-документы. Это включает в себя поддержку PDF 1.7, а также языков CJK (китайский, японский и корейский) и различные типы шрифтов (Type1, TrueType, Type3 и CID).

PDFQuery : он описывает себя как «быструю и удобную библиотеку очистки PDF», которая реализована как оболочка для PDFMiner, lxml и pyquery . Его цель состоит в том, чтобы «надежно извлекать данные из наборов PDF-файлов, используя как можно меньше кода».

tabula-py : Это простая оболочка Python для tabula-java , которая может читать таблицы из PDF-файлов и преобразовывать их в Pandas DataFrames. Это также позволяет вам конвертировать файл PDF в файл CSV / TSV / JSON.

pdflib для Python: расширение библиотеки Poppler, которое предлагает для него привязки Python. Это позволяет вам анализировать и конвертировать PDF документы. Не следует путать его коммерческий клон с таким же именем.

PyFPDF : библиотека для создания документов PDF под Python. Портировано из библиотеки FPDF PHP, известной замены PDFlib-расширения со множеством примеров, сценариев и производных.

PDFTables : коммерческий сервис, предлагающий извлечение из таблиц в виде документа PDF. Предлагает API, позволяющий использовать PDFTables в качестве SAAS.

PyX — графический пакет Python: PyX — это пакет Python для создания файлов PostScript, PDF и SVG. Он сочетает в себе абстракцию модели чертежа PostScript с интерфейсом TeX / LaTeX. Сложные задачи, такие как создание 2D и 3D графиков в готовом для публикации качестве, построены из этих примитивов.

ReportLab : амбициозная промышленная библиотека, в основном ориентированная на точное создание PDF-документов. Доступна свободно как версия с открытым исходным кодом, так и коммерческая улучшенная версия с именем ReportLab PLUS.

PyMuPDF (он же «fitz»): привязки Python для MuPDF, который является облегченным средством просмотра PDF и XPS. Библиотека может получать доступ к файлам в форматах PDF, XPS, OpenXPS, epub, комиксах и художественных книгах, а также известна своей высокой производительностью и высоким качеством рендеринга.

pdfrw : чистый анализатор PDF на основе Python для чтения и записи PDF. Он точно воспроизводит векторные форматы без растеризации. Вместе с ReportLab он помогает повторно использовать части существующих PDF-файлов в новых PDF-файлах, созданных с помощью ReportLab.

Библиотека| Используется для
—|—
PyPDF2| чтение
PyMuPDF| чтение
PDFlib| чтение
PDFTables| чтение
Табула-ру| чтение
PDFMiner.six| чтение
PDFQuery| чтение
pdfrw| Чтение, Запись / Создание
ReportLab| Запись / Создание
дарохранительница| Запись / Создание
PyFPDF| Запись / Создание

Ниже мы сосредоточимся на PyPDF2 и PyMuPDF и объясним, как извлечь текст и изображения самым простым способом. Чтобы понять использование PyPDF2, помогло сочетание официальной документации и множества примеров, доступных на других ресурсах. Напротив, официальная документация PyMuPDF намного понятнее и значительно быстрее при использовании библиотеки.

Извлечение текста с помощью PyPDF2

PyPDF2 может быть установлен как обычный программный пакет, так и с использованием pip3 (для Python3). Тесты здесь основаны на пакете для предстоящего выпуска Debian GNU / Linux 10 «Buster». Имя пакета Debian является python3-pypdf2 .

В листинге 1 PdfFileReader сначала импортируется класс. Затем, используя этот класс, он открывает документ и извлекает информацию о документе, используя метод getDocumentInfo() , количество используемых страниц getDocumentInfo() и содержимое первой страницы.

Обратите внимание, что PyPDF2 начинает считать страницы с 0, и поэтому вызов pdf.getPage(0) извлекает первую страницу документа. В конце концов, извлеченная информация печатается в stdout .

Листинг 1: Извлечение информации и содержимого документа.

Рис. 1: Извлеченный текст из файла PDF с использованием PyPDF2

Как показано на рисунке 1 выше, извлеченный текст печатается на постоянной основе. Здесь нет ни абзацев, ни разделений предложений. Как указано в документации по PyPDF2, все текстовые данные возвращаются в том порядке, в котором они представлены в потоке содержимого страницы, и их использование может привести к неожиданностям. Это в основном зависит от внутренней структуры документа PDF и от того, как поток инструкций PDF был создан процессом записи PDF.

Извлечение текста с помощью PyMuPDF

PyMuPDF доступен на веб-сайте PyPi, и вы устанавливаете пакет с помощью следующей команды в терминале:

Отображение информации о документе, печать количества страниц и извлечение текста из документа PDF выполняется аналогично PyPDF2 (см. Листинг 2 ). Импортируемый модуль имеет имя fitz и возвращается к предыдущему имени PyMuPDF.

Листинг 2: Извлечение содержимого из документа PDF с использованием PyMuPDF.

Приятной особенностью PyMuPDF является то, что он сохраняет исходную структуру документа без изменений — целые абзацы с разрывами строк сохраняются такими же, как в PDF-документе (см. Рисунок 2 ).

Рис. 2: извлеченные текстовые данные

Извлечение изображений из PDF с помощью PyMuPDF

PyMuPDF упрощает извлечение изображений из документов PDF с использованием метода getPageImageList() . Листинг 3 основан на примере из вики-страницы PyMuPDF и извлекает и сохраняет все изображения из PDF в формате PNG постранично. Если изображение имеет цветовое пространство CMYK, оно будет сначала преобразовано в RGB.

Листинг 3: Извлечение изображений.

Запустив этот скрипт Python на 400-страничном PDF, он извлек 117 изображений менее чем за 3 секунды, что удивительно. Отдельные изображения хранятся в формате PNG. Чтобы сохранить исходный формат и размер изображения вместо преобразования в PNG, взгляните на расширенные версии сценариев в вики PyMuPDF .

Читайте также:  Сводные таблицы дата месяц год

Рис. 3: Извлеченные изображения

Разделение PDF-файлов на страницы с помощью PyPDF2

Для этого примера, в первую очередь необходимо импортировать классы PdfFileReader и PdfFileWriter . Затем мы открываем файл PDF, создаем объект для чтения и перебираем все страницы, используя метод объекта для чтения getNumPages .

Внутри цикла for мы создаем новый экземпляр PdfFileWriter , который еще не содержит страниц. Затем мы добавляем текущую страницу к нашему объекту записи, используя метод pdfWriter.addPage() . Этот метод принимает объект страницы, который мы получаем, используя метод PdfFileReader.getPage() .

Следующим шагом является создание уникального имени файла, что мы делаем, используя исходное имя файла плюс слово «page» плюс номер страницы. Мы добавляем 1 к текущему номеру страницы, потому что PyPDF2 считает номера страниц, начиная с нуля.

Наконец, мы открываем новое имя файла в режиме (режиме wb ) записи двоичного файла и используем метод write() класса pdfWriter для сохранения извлеченной страницы на диск.

Листинг 4: Разделение PDF на отдельные страницы.

Рис. 4: Разделение PDF

Найти все страницы, содержащие текст

Этот вариант использования довольно практичен и работает аналогично pdfgrep . Используя PyMuPDF, скрипт возвращает все номера страниц, которые содержат данную строку поиска. Страницы загружаются одна за другой, и с помощью метода searchFor() обнаруживаются все вхождения строки поиска. В случае совпадения соответствующее сообщение печатается на stdout .

Листинг 5: Поиск заданного текста.

На рисунке 5 ниже показан результат поиска для термина «Debian GNU / Linux» в книге на 400 страниц.

Рис. 5: Поиск документа PDF

Заключение

Методы, показанные здесь, довольно мощные. Сравнительно небольшое количество строк кода позволяет легко получить результат. Другие варианты использования рассматриваются во второй части (скоро!), Посвященной добавлению водяного знака в PDF.

Источник

parse tables from a PDF document

The PDF in this link (http://www.lenovo.com/psref/pdf/psref450.pdf) contains a number of tables like this:

enter image description here

I’d like to programmatically extract the data and the structure from these tables.

Things I’ve tried: converting the PDF to HTML using

  1. Tika: Unfortunately, the tables are converted to space delimited paragraphs — and some of the strings contain spaces so it’s notpossible to split them.
  2. Python’s PDFMiner: returned an assertion error due to missing fonts. I suspect the HTML would have been similar to the output from Tika,though I’ll need to resolve the issue with the missing fonts to confirm this.
  3. Online tools: I tried http://www.zamzar.com/ and a couple of others. The file was either too big to process (for the online services) or it generated errors.

I was planning to convert the PDF to HTML and then parse it with BeautifulSoup.

The output could be JSON (e.g. one object per table), XML, or pretty much any format that maintains the structure.

3 Answers 3

You could try PDFBox. The documentation for that is here:

Extend org.apache.pdfbox.pdfviewer.PDFPageDrawer and override the strokePath method. From there you can intercept the drawing operations for horizontal and vertical line segments and use that information to determine the column and row positions. You can set up text regions to determine which numbers/letters/characters are drawn in which region. Since you know the layout of the regions are tabular you’ll be able to define tables and tell which column and row the extracted text belongs to using simple algorithms.

@alex-woolford: In general, perfect extraction of data (with or without the same formatting that you see in the PDF) is not always possible, thought it is, to some extent less than 100%. I’m saying this based on having worked on a similar project to yours, earlier. I came across similar issues to what you have, and some research on the Net showed that PDF in general is not a perfectly reversible format, i.e. it is not always possible to recover the text and format from a PDF with 100% accuracy. Sometimes characters even get lost, or transposed, and so on, during the extraction process (using some library). This seems to be due to the very nature of the PDF format and specification. It is not a text-based format. It is a derivative of PostScript and has some weird rules about layout of data. And this is according to official PDF documents, or according to the sites of product companies who have been working with PDF for a long time, and whose products are well known.

If less than perfect accuracy is tolerable, there are some products available (thought I don’t know of any for Python, as of now). One is xpdf and another is PDFTextStream. I’ve used the former, not the latter. xpdf is a C library and also has command-line tools. PDFTextStream is a Java tool/library. It was a paid product earlier, but last I checked, it is now free for single-threaded applications, IIRC.

Even though xpdf is for C and PDFTextStream is for Java, you could call them from Python via XML-RPC or some other distributed computing / cross-language communication approach such as sockets. Some work would be involved, for that, of course.

Only FYI, as mine is not a publicly available tool: it sure is possible. Here is this one table in plain text form — the spaces in between are tabs, not spaces:

I second PDFBox, as it works similar to my own hand-written utility: interrogate (x,y) positions, sort, then paste together «likely» strings and insert a tab when the horizontal space is larger than one would reasonably expect.

I even got the little Scissors in Zapf Dingbats 🙂

Источник

Экспортируем данные из PDF при помощи Python

Существует много случаев, когда вам нужно извлечь данные из PDF и экспортировать их в другой формат при помощи Python. К сожалению, на сегодняшний день доступно не так уж много пакетов Python, которые выполняют извлечение лучшим образом. В данной статье мы рассмотрим различные пакеты, которые вы можете использовать для извлечения текста. Мы также научимся извлекать изображения из PDF. Так как в Python нет конкретного решения для этих задач, вам нужно уметь использовать эту информацию. После извлечения необходимых данных, мы рассмотрим, как мы можем взять эти данные и извлечь её в другом формате.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Читайте также:  Таблица параметров звездочка цепи

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Начнем с того, как извлекать текст!

Извлечение Текста с PDFMiner

Наверное, самым известным является пакет PDFMiner. Данный пакет существует, начиная с версии Python 2.4. Его изначальная задача заключалась в извлечение текста из PDF. В целом, PDFMiner может указать вам точное расположение текста на странице, а также родительскую информацию о шрифтах. Для версий Python 2.4 – 2.7, вы можете ссылаться на следующие сайты с дополнительной информацией о PDFMiner:

PDFMiner не совместим с Python 3. К счастью, существует вилка для PDFMiner под названием PDFMiner.six, которая работает аналогичным образом. Вы можете найти её здесь: https://github.com/pdfminer/pdfminer.six

Инструкции по установке PDFMiner как минимум можно назвать устаревшими. Вы можете использовать pip для проведения установки:

Если вам нужно установить PDFMiner в Python 3 (что вы, скорее всего, и пытаетесь сделать), то вам нужно провести установку следующим образом:

Документация PDFMiner достаточно скудная. По большей части вам понадобится гугл и StackOverflow, чтобы понять, как использовать PDFMiner эффективнее в случаях, не описанных в данной статье.

Извлекаем весь текст

Возможно, вам нужно будет извлечь весь текст из PDF. Пакет PDFMiner предоставляет несколько разных методов, которые позволяют это сделать. Мы рассмотрим несколько программных методов для начала. Попробуем считать весь текст из формы W9 для внутренних доходов. Копию вы можете найти здесь: https://www.irs.gov/pub/irs-pdf/fw9.pdf

После удачного сохранения PDF файла, мы можем взглянуть на код:

PDFMiner имеет тенденцию быть через чур подробным в тех или иных случаях, если вы работаете с ним напрямую. Здесь мы импортируем фрагменты из различных частей PDFMiner. Так как для этих классов нет документации, как и docstrings, углубляться в то, чем они являются, мы в этой статьей не будем. Вы можете ознакомиться с исходным кодом лично, если вам действительно любопытно. Однако, я думаю мы можем следовать примеру кода.

Первое, что мы делаем, это создаем экземпляр ресурсного менеджера. Далее, мы создаем файловый объект через модуль io в Python. Если вы работаете в Python 2, то вам может понадобиться модуль StringIO. Наш следующий шаг – создание конвертера. В данном случае, мы выберем TextConverter, однако вы можете также использовать HTMLConverter или XMLConverter, если захотите. Наконец, мы создаем объект интерпретаторв PDF, который использует наш диспетчер ресурсов, объекты конвертера и извлечет текст.

Последний шаг, это открыть PDF и ввести цикл через каждую страницу. В конце мы захватим весь текст, закроем несколько обработчиков и выведем текст в stdout.

Извлечение текста постранично

Честно говоря, брать весь текст из многостраничного документа далеко не всегда оказывается полезным. Как правило, вам может понадобиться работать с отдельными фрагментами документа. Давайте перепишем код таким образом, чтобы он извлекал текст постранично. Это позволит нам проверить текст (страница за раз):

Источник

Работа с PDF-файлами в Python (часть I): чтение и разбор

В эпоху бурной цифровизации Portable Document Format (PDF) — межплатформенный открытый формат электронных документов, изначально разработанный компанией Adobe Systems એ с использованием ряда возможностей языка PostScript એ , стал особенно популярным. В первую очередь, он предназначен для представления в электронном виде полиграфической продукции. C 1 июля 2008 года PDF стал открытым стандартом ISO એ 32000. Последняя версия ISO 32000‑2: 2017 впитала в себя весь опыт использования стандарта и отражает его эволюцию. Сегодня PDF, де‑факто, стал стандартном обмена электронными документами полиграфического качества, готовыми для печати и для многих приложений стал бесценным источником контента. Но работать с таким контентом сложно.

Этим руководством начинаем небольшую серию коротких конспективных статей, посвященных отдельными практическим аспектам работы с PDF‑документами, используя Python. Надеюсь, что прочитав её и отрепетировав все приведённый в ней примеры вы сможете закрыть практически все ваши практические потребности по работе с информацией этих документов.

Обработка PDF документов

В Linux для работы с файлами PDF всё проще, есть мощные инструменты командной строки, такие как pdftk и pdfgrep. Но, поскольку, PDF — межплатформенный открытый формат электронных документов, хотелось бы с таким же удобством работать и в Windows, и в macOS. При этого нужна фантазия и усилия разработчика. Вот и совсем недавно встретилась задачка переноса информации из PDF‑файла в базу данных. Естественно, задача автоматизации здесь имеет свою уникальную специфику и без разработки здесь ну совсем никак.

Это руководство — начало небольшой серии, где будут рассмотрены полезные для разработчика библиотеки, позволяющие создавать собственные скрипты Python для решения рутинных задач автоматизации. В первой части внимание сконцентрировано на манипулировании существующими PDF‑файлами. Вы узнаете, как читать и извлекать содержимое (текст и изображения) и разбивать документы на отдельные страницы. Вторая часть будет посвящена наложению водяных знаков в документ. Третья часть посвящена исключительно написанию/созданию PDF‑файлов, а также удалению и повторному объединению отдельных страниц в новый документ.

Инструменты и библиотеки

Спектр доступных решений для связанных с Python инструментов, модулей и библиотек PDF немного сбивает с толку. Требуется время, чтобы понять, что к чему и какие проекты постоянно поддерживаются. Наше исследование позволило отобрать тех кандидатов, которые соответствуют современным требованиям:

  1. PyPDF2 — библиотека для извлечения информации и содержимого документов, постраничного разделения документов, объединения документов, обрезки страниц и добавления водяных знаков. PyPDF2 поддерживает как незашифрованные, так и зашифрованные документы.
  2. PDFMiner — полностью написан на Python и хорошо работает для Python 2.4. Для Python 3 используйте клонированный пакет PDFMiner.six. Оба пакета позволяют анализировать и преобразовывать PDF‑документы. Это включает в себя поддержку PDF 1.7, а также языков CJK એ (китайский, японский и корейский) и различные типы шрифтов (Type1, TrueType એ , Type3 и CID).
  3. PDFQuery — позиционируется как «быстрая и удобная библиотека чистого PDF» и реализована как оболочка для PDFMiner, lxml и pyquery. Основная идея заключается в том, чтобы «надежно извлекать данные из наборов PDF‑файлов, используя как можно меньше кода».
  4. tabula-py — простая оболочка Python для tabula-java, которая может читать таблицы из PDF‑файлов и преобразовывать их во фреймы (DataFrames) Pandas. Позволяет конвертировать файл PDF в файлы форматов CSV એ /TSV એ /JSON એ .
  5. pdflib — расширение библиотеки Poppler, которое позволяет анализировать и конвертировать PDF‑документы. Не следует его путать с коммерческим клоном с таким же именем.
  6. PyFPDF — библиотека для создания документов PDF под Python. Портировано из библиотеки FPDF (PHP એ ), известной замены PDFlib-расширения со множеством примеров, сценариев и производных.
  7. PDFTables — коммерческий сервис, предлагающий извлечение данных из таблиц документов PDF. Предлагает API, позволяющий использовать PDFTables в качестве SAAS એ .
  8. PyX — графический пакет Python для создания файлов PostScript, PDF и SVG એ . Он сочетает в себе абстракцию модели чертежа PostScript с интерфейсом TeX એ /LaTeX એ . Сложные задачи, такие как создание 2D и 3D графиков в готовом для публикации качестве, построены из этих примитивов.
  9. ReportLab — амбициозная промышленная библиотека, в основном ориентированная на оздание высококачественных PDF‑документов. Доступны как свободная версия с открытым исходным кодом, так и коммерческая, улучшенная, версия ReportLab PLUS.
  10. PyMuPDF (он же «fitz») — привязка Python для MuPDF, который является облегченным средством просмотра PDF и XPS. Библиотека может получать доступ к файлам в форматах PDF, XPS એ , OpenXPS, epub એ в комиксах и художественных книгах, а также известна своей высокой производительностью и высоким качеством рендеринга.
  11. pdfrw — чистый анализатор PDF на основе Python для чтения и записи PDF. Он точно воспроизводит векторные форматы без растеризации. Вместе с ReportLab он помогает повторно использовать части существующих PDF‑файлов в новых PDF‑файлах, созданных с помощью ReportLab.
Читайте также:  Денежная и налоговая реформы таблица

В своём исследовании мы учитывали мнения Github-сообщества, а именно:

  • Звёзды Github: общее количество звезд проекта, выставленных пользователям.
  • Релизы Github: количество релизов каждого проекта, что отражает активность работы над проектом и его зрелость.
  • Fork-и Github: количество, сделанных копий каждого проекта, что показывает популярность использования проекта в собственных работах.

Github

Github

Библиотека Использование Releases
Github
PyPDF2 Чтение 2 972 10 751
PyMuPDF Чтение 474 59 111
pdflib Чтение 20 4
PDFTables Чтение 85 69
tabula-py Чтение 971 23 200
PDFMiner.six Чтение 1 599 11 1 400
PDFQuery Чтение 477 1 70
pdfrw Чтение, Запись/Создание 1 145 4 187
Reportlab Запись/Создание 31 48 22
PyX Запись/Создание 23 26 7
PyFPDF Запись/Создание 457 7 174

Читать это руководство, не прорабатывая приведённые в нём примеры, бессмысленно. Поэтому, вооружимся IDLE Python и воспользуемся менеджером пакетов pip или pip3 для установки PyPDF2 и PyMuPDF. Наберём в командной строке (Windows):

Проект в Windows

Для того, что бы не запутаться создадим папочку для своего проекта. Как видите местом для неё выбрана папка «Документы» стандартной установки Windows.
Вот так это выглядит в Windows

Папки images и dist будем использовать для записи результатов работы своих программ, а в папке source храним исходные PDF‑файлы, сами скрипты будем хранить в корне. Кстати, все примеры этой серии статей о работе с PDF‑файлами есть на Github, откуда их можно забрать и использовать в качестве «кирпича» для своих упражнений

Извлечение текста с помощью PyPDF2

Начнём с PyPDF2 . Ниже приведен скрипт, который позволяет извлечь из PDF‑файла текст и вывести него в консоль.

Сначала импортируем PdfFileReader , помня о том, что пакет уже установлен. Задаём имя файла из папки source (можете загрузить туда свой файл и поменять Computer-Vision-Resources.pdf в скрипте на имя загруженного файла), открывает документ и получаем информацию о документе, используя метод getDocumentInfo() и общее количество страниц getNumPages() . Далее в цикле for читаем каждую страницу, получаем содержимое page.extractText() и печатаем в stdout .

Обратите внимание, что PyPDF2 начинает считать страницы с 0, и поэтому вызов pdf.getPage(i) при i = 0 извлекает первую страницу документа. Приведённый ниже скрипт запишем в файл pdf‑reader‑1.py

Извлечение текста с помощью PyPDF2

Извлечение текста с помощью PyPDF2

Как видите, извлеченный текст печатается сплошным потоком. Здесь нет ни абзацев, ни разделений предложений. Как указано в документации по PyPDF2, все текстовые данные возвращаются в том порядке, в котором они представлены на странице. В основном, это зависит от внутренней структуры документа PDF и от того, как поток инструкций, создан во время его записи, поэтому их использование может привести к неожиданностям, надо дополнительно «парсить», не очень удобно.

Извлечение текста с помощью PyMuPDF

Перейдём к PyMuPDF.

Отображение информации о документе, печать количества страниц и извлечение текста из документа PDF выполняется аналогично PyPDF2 (см. скрипт ниже). Импортируемый модуль имеет имя fitz , что соответствует имени PyMuPDF в ранних версиях. Приведённый ниже скрипт запишем в файл pdf‑reader‑2.py

Извлечение текста с помощью PyMuPDF

Извлечение текста с помощью PyMuPDF

Приятной особенностью PyMuPDF является то, что он сохраняет исходную структуру документа без изменений — целые абзацы с разрывами строк сохраняются такими же, как в PDF‑документе.

Извлечение изображений из PDF с помощью PyMuPDF

Переходим к изображениям. PyMuPDF упрощает извлечение изображений из документов PDF с использованием метода getPageImageList() . Скрипт, приведённый ниже, основан на примере из вики-страницы PyMuPDF и извлекает и постранично сохраняет все изображения из PDF в формате PNG. Если изображение имеет цветовое пространство CMYK, оно будет сначала преобразовано в RGB. Приведённый ниже скрипт запишем в файл pdf‑reader‑3.py

Извлечение изображений

Извлечение изображений

Этот скрипт Python извлёк 773 изображения на 400-страничном PDF, размером полгигабайта менее чем за 3 минуты, что удивительно. Отдельные изображения хранятся в формате PNG. Чтобы сохранить исходный формат и размер изображения вместо преобразования в PNG, взгляните на расширенные версии сценариев в вики PyMuPDF.

Разделение PDF‑файлов на страницы с помощью PyPDF2

Для этого примера, в первую очередь необходимо импортировать классы PdfFileReader и PdfFileWriter . Затем мы открываем файл PDF, создаем объект для чтения и перебираем все страницы, используя метод объекта для чтения getNumPages .

Внутри цикла for мы создаем новый экземпляр PdfFileWriter , который еще не содержит страниц. Затем мы добавляем текущую страницу к нашему объекту записи, используя метод pdfWriter.addPage() . Этот метод принимает объект страницы, который мы получаем, используя метод PdfFileReader.getPage() .

Следующим шагом является создание уникального имени файла, что мы делаем, используя исходное имя файла плюс слово «page» плюс номер страницы. Мы добавляем 1 к текущему номеру страницы, потому что PyPDF2 считает номера страниц, начиная с нуля.

Наконец, мы открываем новое имя файла в режиме (режиме wb ) записи двоичного файла и используем метод write() класса pdfWriter для сохранения извлеченной страницы на диск. Приведённый ниже скрипт запишем в файл pdf‑reader‑4.py

Разделили исходный файл на страницы

Разделили исходный файл на страницы

Найти все страницы, где есть заданный текст

Этот скрипт довольно практичен и работает аналогично pdfgrep . Используя PyMuPDF, скрипт возвращает все номера страниц, которые содержат заданную строку поиска. Страницы загружаются одна за другой и с помощью метода searchFor() обнаруживаются все вхождения строки поиска. В случае совпадения соответствующее сообщение печатается на stdout . Приведённый ниже скрипт запишем в файл pdf‑reader‑5.py :

Результаты поиска COMPUTER VISION

Результаты поиска COMPUTER VISION

Методы, показанные здесь, довольно мощные. Сравнительно небольшое количество строк кода позволяет легко получить результат. Другие варианты применения рассматриваются во второй части, посвященной добавлению водяного знака и картинок в PDF.

Все скрипты этой серии публикаций опубликованы на Github.

Источник

Adblock
detector