"Обработка естественного языка"

Используйте Python для обработки работы с PDF

Без программного обеспечения Adobe PDF вы также можете редактировать PDF, например добавлять текст, разбивать страницы и извлекать информацию.

Цель

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

  1. способы ИЗВЛЕЧЕНИЯ ключевой информации из PDF-файла.
  2. способы РАЗДЕЛИТЬ страницу PDF.
  3. процедура ДОБАВЛЕНИЯ различных элементов в PDF.
  4. способ ЭКСПОРТА PDF в изображения.

Кроме того, если вам интересно узнать о других советах по работе в офисе, не стесняйтесь проверять другие мои статьи на Medium.









Все коды и материалы загружены на мой GitHub. Вы можете проверить и фолк этого репо для дальнейшего изучения. =)

Источник данных

Чтобы показать приемы, в первую очередь нам нужны файлы PDF. Здесь я использую финансовые отчеты Apple в качестве примера, которые мы можем легко получить с официального сайта в формате PDF, как показано по ссылке ниже.

https://investor.apple.com/investor-relations/default.aspx

Упаковка

На протяжении всего руководства мы в основном используем пакет PyMuPDF. Если вы впервые слышите об этом, вы можете просто установить пакет,

pip install PyMuPDF

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

Чтобы импортировать пакет, вы можете использовать следующий код.

import fitz as pymupdf

Часть 1. Извлечение информации

Я обобщил наиболее распространенные элементы, которые люди хотели бы извлечь из PDF-файла, в приведенном ниже списке.

  • Основная информация
  • Текст
  • Изображений
  • Стол
  • Другие

Давайте пройдемся по ним один за другим.

1.1 основная информация

К базовой информации относится информация, относящаяся к структуре файла или свойствам файла, таким как количество страниц, дата создания, автор и т. д.

pdf_path = 'Apple Annual Report 2021.pdf'
f = pymupdf.open(pdf_path)
print('Page Number:', f.page_count)
print('Creation Date:', f.metadata['creationDate'])
print('Modified Date:', f.metadata['modDate'])
print('\nTable of Content:\n', [toc[1] for toc in f.get_toc()])
f.close()

Я думаю, что код довольно понятен. Здесь я просто хотел бы представить вам три распространенных метода, которые помогут вам извлечь основную информацию (page_count, metadata и get_toc()).

Примечание. Когда мы работаем над программой автоматизации для обработки большого количества PDF-файлов, один из советов — проверить дату изменения и использовать ее в качестве триггера для запуска программы.

1.2 текст

Другой частью информации, на которой мы всегда фокусируемся, является текст. В качестве примера возьмем Основные показатели финансового года.

Чтобы извлечь текст, нам нужно учитывать только три вещи — (1) номер страницы, (2) начальную точку текста и (3) конечную точку текста.

Чтобы извлечь текст для определенной страницы, (ниже мы используем страницу 23 в качестве примера)

f = pymupdf.open(pdf_path)
txt = f.load_page(22).get_text()
f.close()

Получив весь текст для страницы, вы можете включить ненужный контент, который может вас не интересовать, например абзац в предыдущей главе или нижний колонтитул. Чтобы удалить эти ненужные тексты, у вас есть два способа сделать это: либо установить индекс указателя, либо просто заменить их пустыми.

Чтобы установить указатель, вы можете сделать следующий код.

start_idx = txt.find('Fiscal Year Highlights')
txt = txt[start_idx:]

Чтобы заменить текст нижнего колонтитула, вы должны понимать структуру нижнего колонтитула и использовать пакет регулярных выражений для его замены.

import re
txt = re.sub("\nApple Inc. \| 2021 Form 10-K \| \d+\n", "", txt)

1.3 изображение

Помимо текста, некоторые цифры или графики часто извлекались для дальнейшего анализа. Здесь мы используем изображение логотипа бренда в качестве демонстрации.

Чтобы извлечь изображение, нам нужен номер перекрестной ссылки для объекта изображения (xref). Вы можете рассматривать это как уникальную идентификацию объектов в PDF. Чтобы получить это число, нам нужно использовать функцию get_images. Используя функцию get_images, мы получаем список изображений для определенной страницы, следуя приведенной ниже структуре элементов.
(xref, smask, width, height, bpc, colorspace, alt .colorspace, имя, фильтр)

f = pymupdf.open(pdf_path)
img_list = f.load_page(0).get_images()
print(img_list)
f.close()

[(489, 0, 46, 56, 8, ‘DeviceRGB’, ‘’, ‘Im1’, ‘DCTDecode’)]

Итак, теперь мы знаем, что номер перекрестной ссылки изображения логотипа бренда Apple — 489. Затем следующая задача — экспортировать изображение на extract_image.

f = pymupdf.open(pdf_path)
img_xref = img_list[0][0]
img_data = f.extract_image(img_xref)
img_f = open("img." + img_data["ext"], "wb")
img_f.write(img_data["image"])
img_f.close()
f.close()

1,4 таблицы

Плохая новость заключается в том, что PyMuPDF на данный момент не поддерживает прямое извлечение для таблицы, но как Data Scientist, пока мы получаем текст, мы можем найти способы преобразовать его в желаемый формат, верно?

Ниже я использую оглавление в качестве примера.

import numpy as np
import pandas as pd
pd.set_option('display.max_colwidth', None)
f = pymupdf.open(pdf_path)
txt = f.load_page(2).get_text()
f.close()
temp_table_list = txt[txt.find('Part I'):].split('\n')
temp_table_list = [cell for cell in temp_table_list if cell not in ['Part I', 'Part II', 'Part III', 'Part IV', '']]
table_list = []
cell = ''
while len(temp_table_list) > 0:
    temp_cell = temp_table_list.pop(0)
    if cell != '':
        temp_cell = cell + temp_cell
        cell = ''
    if temp_cell[-1] == ' ':
        cell = temp_cell
    else:
        table_list.append(temp_cell)
table = pd.DataFrame(np.array(table_list).reshape(-1, 3), columns=['Item', 'Details', 'Page Number'])
table

В основном процедура следующая.

  1. Загрузите страницу и получите текст.
  2. Устанавливаем индекс указателя и получаем диапазон интересующего нас текста.
  3. Разделите текст на список.
  4. Решите проблему переноса текста в пункте 5.
  5. Измените форму списка на размер 3 и преобразуйте его в фрейм данных.
  6. Сделанный!

1,5 других

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

  • Гиперссылки: page.get_links()
  • Аннотации: page.annots()
  • Поля формы: page.widgets()

Часть 2. Изменение содержимого

Помимо извлечения информации, другой операцией для PDF будет редактирование файла, например добавление текста и добавление изображений. Как правило, такие виды работы применимы только для Adobe Acrobat DC или других редакторов PDF. Однако большинство этих программ не являются бесплатными, в то время как онлайн-платформы для редактирования PDF-файлов могут каким-то образом вызывать проблемы с безопасностью. Поэтому я хотел бы поделиться тем, как мы можем использовать Python для выполнения этих операций.

  • ВСТАВИТЬ новую страницу
  • УДАЛИТЬ страницы
  • ДОБАВИТЬ текст
  • ДОБАВИТЬ изображение
  • Другие

2.1 вставка страницы

Чтобы вставить страницу, мы можем использовать метод new_page. Параметром будет номер страницы, которую вы хотите вставить. Например

Вставка на первой странице: f.new_page(0)

Вставка на последней странице: f.new_page(-1)

Вставка на странице 6: f.new_page(5)

f = pymupdf.open(pdf_path)
f.new_page(0, 612.0, 792.0)
f.save("Modified.pdf")
f.close()

Примечание: вы можете заметить, что есть три параметра, и они действительно относятся к (page number, width, height).

2.2 удалить страницы

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

f = pymupdf.open(pdf_path)
print('Original Page Number:', f.page_count)
f.delete_pages(range(0, f.page_count, 2))
print('Modified Page Number:', f.page_count)
f.save("Modified Apple Annual Report 2021.pdf")
f.close()

Исходный номер страницы: 82
Измененный номер страницы: 41

2.3 добавить текст

Чтобы добавить текст, нам нужен текстовый редактор.

f = pymupdf.open(pdf_path)
page = f.new_page(0, 612.0, 792.0)
text_writer = pymupdf.TextWriter(page.rect)

page относится к странице PDF, которую мы собираемся редактировать. page.rect возвращает прямоугольник, определенный четырьмя плавающими точками (x0, y0, x1, y1), представляющими координаты страницы. Чтобы создать объект для записи текста, мы можем использовать pymupdf.TextWriter(page.rect).

Для написания текста требуются две вещи, включая (1) координаты x-y для размещения текста и (2) текстовое значение.

# Compulsory
pos = (100, 200)
text = "https://blog.cyda.hk/"
# Optional
font_style = pymupdf.Font("helv")
font_size = 50
font_opacity = 0.5
font_color = (0, 0, 1)
text_writer.append(pos, text, font=font_style, fontsize=font_size)
text_writer.write_text(page, opacity=font_opacity, color=font_color)
f.save("Modified Apple Annual Report 2021.pdf")
f.close()

Обратите внимание: в приведенном выше коде я перечислил наиболее распространенные параметры, которые люди хотели бы изменить для форматирования шрифта для справки.

2.4 добавить изображение

Чтобы добавить изображение, нам нужно только указать координаты, которые используются для размещения изображения (x1, y1, x2, y2).

f = pymupdf.open(pdf_path)
page = f.new_page(0, 612.0, 792.0)
x = 100
y = 200
w = 300
h = 300
img_rect = pymupdf.Rect(x, y, x+w, y+h)
page.insertImage(img_rect, filename="img.jpeg")
f.save("Modified Apple Annual Report 2021.pdf")
f.close()

2,5 других

Есть гораздо больше, чем вышеперечисленные операции, которые можно использовать для редактирования PDF. Я перечислил некоторые из них для вашего ознакомления.

  • Переместить страницу: f.move_page()
  • Скопируйте страницу: f.copy_page()
  • Добавьте фигуру: page.new_shape()
  • Нарисуйте линию: shape.draw_line()
  • Нарисуйте прямоугольник: shape.draw_rect()

Часть 3 — Экспорт различных форматов

Перед окончанием урока я хотел бы сказать несколько слов о формате вывода PDF.

  • РАЗДЕЛИТЬ PDF-файл.
  • ОБЪЕДИНИТЕ PDF-файлы.
  • ЭКСПОРТИРОВАТЬ в изображения.

3.1 Разделение PDF

Иногда мы хотели бы разделить весь файл и извлечь только подмножество страниц для дальнейшей обработки. Трюк прост. Мы просто создаем новый объект PDF с именем new_f и используем метод insert_pdf для вставки страниц и их сохранения.

f = pymupdf.open(pdf_path)
new_f = pymupdf.open()
new_f.insert_pdf(f, from_page=0, to_page=1)
new_f.save("Modified Apple Annual Report 2021.pdf")
new_f.close()
f.close()

3.2 Объединение PDF

Подобный трюк можно легко применить, когда вам нужно объединить два разных PDF-файла. По сути, мы открываем два PDF-файла, а затем вставляем второй в первый и сохраняем его.

pdf1_path = 'Apple Annual Report 2021.pdf'
pdf2_path = 'Apple Annual Report 2021.pdf'
f1 = pymupdf.open(pdf1_path)
f2 = pymupdf.open(pdf2_path)
f1.insert_pdf(f2)
f1.save("Modified Apple Annual Report 2021.pdf")
f1.close()
f2.close()

3.3 экспорт изображений

Наконец, некоторым из вас может быть интересно сохранить страницу PDF как изображение. Затем вы можете использовать функцию get_pixmap(), чтобы преобразовать страницу в объект пиксельной карты, а затем сохранить как PNG.

f = pymupdf.open(pdf_path)
page = f.load_page(0)
pix = page.get_pixmap()
pix.save("page.png")

Заключение

На этом советы для офиса по использованию Python для обработки работы в формате PDF заканчиваются. Если вам интересно узнать больше об этом виде советов по работе, ставьте лайк и подписывайтесь. Оставайтесь с нами для моего следующего урока. "="

Если вы найдете мою статью полезной, пожалуйста, подтвердите мои навыки на моей странице LinkedIn, чтобы побудить меня писать больше статей.