Загрузите PDF-файл для получения подробной информации о каждом текстовом символе, прямоугольнике и строке. Плюс: извлечение таблиц и визуальная отладка.
Лучше всего работает с автоматически созданными, а не отсканированными PDF-файлами. Построен на основе pdfminer.six
.
В настоящее время протестировано на Python 3.8, 3.9, 3.10, 3.11.
Переводы этого документа доступны на: Китайском языке (автор: @hbh112233abc).
Чтобы сообщить об ошибке или запросить функцию, сообщите о проблеме. Чтобы задать вопрос или попросить помощи по конкретному PDF-файлу, воспользуйтесь форумом обсуждений.
pip install pdfplumber
curl " https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf " > background-checks.pdf
pdfplumber < background-checks.pdf > background-checks.csv
Результатом будет CSV-файл, содержащий информацию о каждом символе, строке и прямоугольнике в PDF-файле.
Аргумент | Описание |
---|---|
--format [format] | csv или json . Формат json возвращает дополнительную информацию; он включает метаданные уровня PDF и уровня страницы, а также вложенные в словарь атрибуты. |
--pages [list of pages] | Список страниц, разделенных пробелами, с индексом 1 или диапазонов страниц, разделенных дефисами. Например, 1, 11-15 , что вернет данные для страниц 1, 11, 12, 13, 14 и 15. |
--types [list of object types to extract] | Возможные варианты: char , rect , line , curve , image , annot и так далее. По умолчанию все доступные. |
--laparams | Строка в формате JSON (например, '{"detect_vertical": true}' ) для передачи в pdfplumber.open(..., laparams=...) . |
--precision [integer] | Количество десятичных знаков для округления чисел с плавающей запятой. По умолчанию округление отсутствует. |
import pdfplumber
with pdfplumber . open ( "path/to/file.pdf" ) as pdf :
first_page = pdf . pages [ 0 ]
print ( first_page . chars [ 0 ])
Чтобы начать работу с PDF-файлом, вызовите pdfplumber.open(x)
, где x
может быть:
Метод open
возвращает экземпляр класса pdfplumber.PDF
.
Чтобы загрузить PDF-файл, защищенный паролем, передайте аргумент ключевого слова password
, например, pdfplumber.open("file.pdf", password = "test")
.
Чтобы установить параметры анализа макета для механизма макета pdfminer.six
, передайте аргумент ключевого слова laparams
, например, pdfplumber.open("file.pdf", laparams = { "line_overlap": 0.7 })
.
Чтобы предварительно нормализовать текст Юникода, передайте unicode_norm=...
, где ...
— одна из четырех форм нормализации Юникода: "NFC"
, "NFD"
, "NFKC"
или "NFKD"
.
Недопустимые значения метаданных по умолчанию рассматриваются как предупреждение. Если это не предусмотрено, передайте strict_metadata=True
методу open
, и pdfplumber.open
выдаст исключение, если не сможет проанализировать метаданные.
pdfplumber.PDF
Класс pdfplumber.PDF
верхнего уровня представляет один PDF-файл и имеет два основных свойства:
Свойство | Описание |
---|---|
.metadata | Словарь пар ключ/значение метаданных, взятый из Info трейлеров PDF-файла. Обычно включает «CreationDate», «ModDate», «Producer» и т. д. |
.pages | Список, содержащий один экземпляр pdfplumber.Page на каждую загруженную страницу. |
... а также имеет следующий метод:
Метод | Описание |
---|---|
.close() | Вызов этого метода вызывает Page.close() на каждой странице, а также закрывает файловый поток (за исключением случаев, когда поток является внешним, т.е. уже открыт и передан непосредственно в pdfplumber ). |
pdfplumber.Page
Класс pdfplumber.Page
лежит в основе pdfplumber
. Большинство действий, которые вы будете делать с pdfplumber
будут связаны с этим классом. Он имеет следующие основные свойства:
Свойство | Описание |
---|---|
.page_number | Последовательный номер страницы, начиная с 1 для первой страницы, 2 для второй и т. д. |
.width | Ширина страницы. |
.height | Высота страницы. |
.objects / .chars / .lines / .rects / .curves / .images | Каждое из этих свойств представляет собой список, и каждый список содержит один словарь для каждого такого объекта, внедренного на страницу. Более подробную информацию см. в разделе «Объекты» ниже. |
... и эти основные методы:
Метод | Описание |
---|---|
.crop(bounding_box, relative=False, strict=True) | Возвращает версию страницы, обрезанную до ограничивающего прямоугольника, которая должна быть выражена в виде четырехкортежа со значениями (x0, top, x1, bottom) . На обрезанных страницах сохраняются объекты, которые хотя бы частично попадают в ограничивающую рамку. Если объект попадает в рамку лишь частично, его размеры разрезаются по размеру ограничивающей рамки. Если relative=True , ограничивающая рамка рассчитывается как смещение от верхнего левого угла ограничивающей рамки страницы, а не как абсолютное позиционирование. (Наглядный пример и объяснение см. в выпуске № 245.) Когда strict=True (по умолчанию), ограничивающая рамка обрезки должна полностью находиться в пределах ограничивающей рамки страницы. |
.within_bbox(bounding_box, relative=False, strict=True) | Аналогично .crop , но сохраняет только те объекты, которые полностью попадают в ограничивающую рамку. |
.outside_bbox(bounding_box, relative=False, strict=True) | Аналогично .crop и .within_bbox , но сохраняет только те объекты, которые полностью выходят за пределы ограничивающей рамки. |
.filter(test_function) | Возвращает версию страницы, содержащую только .objects , для которых test_function(obj) возвращает True . |
... а также имеет следующий метод:
Метод | Описание |
---|---|
.close() | По умолчанию объекты Page кэшируют свой макет и информацию об объектах, чтобы избежать необходимости их повторной обработки. Однако при анализе больших PDF-файлов эти кэшированные свойства могут потребовать много памяти. Вы можете использовать этот метод для очистки кеша и освобождения памяти. |
Дополнительные методы описаны в разделах ниже:
Каждый экземпляр pdfplumber.PDF
и pdfplumber.Page
предоставляет доступ к нескольким типам PDF-объектов, все из которых получены в результате анализа PDF-файлов pdfminer.six
. Каждое из следующих свойств возвращает список соответствующих объектов Python:
.chars
, каждый из которых представляет один текстовый символ..lines
, каждый из которых представляет одну одномерную линию..rects
, каждый из которых представляет один двумерный прямоугольник..curves
, каждая из которых представляет любую серию соединенных точек, которые pdfminer.six
не распознает как линию или прямоугольник..images
, каждый из которых представляет изображение..annots
, каждый из которых представляет одну аннотацию PDF (подробности см. в разделе 8.4 официальной спецификации PDF)..hyperlinks
, каждая из которых представляет одну аннотацию PDF подтипа Link
и имеет атрибут действия URI
Каждый объект представлен как простой dict
Python со следующими свойствами:
char
Свойство | Описание |
---|---|
page_number | Номер страницы, на которой был найден этот персонаж. |
text | Например, «z», или «Z», или «». |
fontname | Название шрифта персонажа. |
size | Размер шрифта. |
adv | Равен ширине текста * размеру шрифта * коэффициенту масштабирования. |
upright | Является ли персонаж прямоходящим. |
height | Высота персонажа. |
width | Ширина персонажа. |
x0 | Расстояние левой части символа от левой стороны страницы. |
x1 | Расстояние правой стороны символа от левой стороны страницы. |
y0 | Расстояние низа символа от низа страницы. |
y1 | Расстояние верха символа от низа страницы. |
top | Расстояние между верхом символа и верхом страницы. |
bottom | Расстояние нижней части символа от верхней части страницы. |
doctop | Расстояние между верхом символа и верхом документа. |
matrix | «Текущая матрица преобразования» для этого персонажа. (Подробнее см. ниже.) |
mcid | Идентификатор раздела отмеченного контента для этого символа, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
tag | Тег раздела отмеченного контента для этого символа, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
ncs | ТКТК |
stroking_pattern | ТКТК |
non_stroking_pattern | ТКТК |
stroking_color | Цвет контура персонажа (т. е. обводки). Подробности смотрите в docs/colors.md. |
non_stroking_color | Цвет интерьера персонажа. Подробности смотрите в docs/colors.md. |
object_type | "Чар" |
Примечание . Свойство matrix
символа представляет собой «текущую матрицу преобразования», как описано в разделе 4.2.2 справочника PDF (6-е изд.). Матрица управляет масштабом, наклоном и позиционным сдвигом персонажа. Поворот представляет собой комбинацию масштаба и наклона, но в большинстве случаев его можно считать равным перекосу по оси X. Подмодуль pdfplumber.ctm
определяет класс CTM
, который помогает в этих расчетах. Например:
from pdfplumber . ctm import CTM
my_char = pdf . pages [ 0 ]. chars [ 3 ]
my_char_ctm = CTM ( * my_char [ "matrix" ])
my_char_rotation = my_char_ctm . skew_x
line
Свойство | Описание |
---|---|
page_number | Номер страницы, на которой была найдена эта строка. |
height | Высота линии. |
width | Ширина линии. |
x0 | Расстояние левого края от левой стороны страницы. |
x1 | Расстояние правого края от левой стороны страницы. |
y0 | Расстояние нижнего края от низа страницы. |
y1 | Расстояние от верхнего края нижней части страницы. |
top | Расстояние между верхом строки и верхом страницы. |
bottom | Расстояние нижнего края строки от верха страницы. |
doctop | Расстояние между верхом строки и верхом документа. |
linewidth | Толщина линии. |
stroking_color | Цвет линии. Подробности смотрите в docs/colors.md. |
non_stroking_color | Цвет без обводки, указанный для пути линии. Подробности смотрите в docs/colors.md. |
mcid | Идентификатор раздела отмеченного контента для этой строки, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
tag | Тег раздела отмеченного контента для этой строки, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
object_type | "линия" |
rect
свойстваСвойство | Описание |
---|---|
page_number | Номер страницы, на которой был найден этот прямоугольник. |
height | Высота прямоугольника. |
width | Ширина прямоугольника. |
x0 | Расстояние левой стороны прямоугольника от левой стороны страницы. |
x1 | Расстояние правой стороны прямоугольника от левой стороны страницы. |
y0 | Расстояние нижней части прямоугольника от нижней части страницы. |
y1 | Расстояние верха прямоугольника от низа страницы. |
top | Расстояние от верха прямоугольника до верха страницы. |
bottom | Расстояние от нижней части прямоугольника до верхней части страницы. |
doctop | Расстояние верха прямоугольника от верха документа. |
linewidth | Толщина линии. |
stroking_color | Цвет контура прямоугольника. Подробности смотрите в docs/colors.md. |
non_stroking_color | Цвет заливки прямоугольника. Подробности смотрите в docs/colors.md. |
mcid | Идентификатор раздела отмеченного контента для этого прямоугольника, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
tag | Тег раздела отмеченного контента для этого прямоугольника, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
object_type | "прямой" |
curve
Свойство | Описание |
---|---|
page_number | Номер страницы, на которой была найдена эта кривая. |
pts | Список кортежей (x, top) указывающих точки на кривой . |
path | Список кортежей (cmd, *(x, top)) с полным описанием пути , включая (например) контрольные точки, используемые в кривых Безье. |
height | Высота ограничивающей рамки кривой. |
width | Ширина ограничивающей рамки кривой. |
x0 | Расстояние крайней левой точки кривой от левой стороны страницы. |
x1 | Расстояние крайней правой точки кривой от левой стороны страницы. |
y0 | Расстояние нижней точки кривой от низа страницы. |
y1 | Расстояние высшей точки кривой от низа страницы. |
top | Расстояние высшей точки кривой от верха страницы. |
bottom | Расстояние нижней точки кривой от верха страницы. |
doctop | Расстояние высшей точки кривой от верха документа. |
linewidth | Толщина линии. |
fill | Заполнена ли форма, определяемая путем кривой. |
stroking_color | Цвет контура кривой. Подробности смотрите в docs/colors.md. |
non_stroking_color | Цвет заливки кривой. Подробности смотрите в docs/colors.md. |
dash | Кортеж ([dash_array], dash_phase) описывающий стиль пунктирной кривой. Подробности см. в Таблице 4.6 спецификации PDF. |
mcid | Идентификатор раздела отмеченного контента для этой кривой, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
tag | Тег раздела отмеченного контента для этой кривой, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
object_type | "изгиб" |
Кроме того, и pdfplumber.PDF
, и pdfplumber.Page
предоставляют доступ к нескольким производным спискам объектов: .rect_edges
(который разбивает каждый прямоугольник на четыре строки), .curve_edges
(который делает то же самое для объектов curve
) и .edges
(который объединяет .rect_edges
, .curve_edges
и .lines
).
image
Примечание. Хотя расположение и характеристики объектов image
доступны через pdfplumber
, эта библиотека не обеспечивает прямую поддержку реконструкции содержимого изображения. Для этого ознакомьтесь с этим предложением.
Свойство | Описание |
---|---|
page_number | Номер страницы, на которой было найдено изображение. |
height | Высота изображения. |
width | Ширина изображения. |
x0 | Расстояние левой части изображения от левой стороны страницы. |
x1 | Расстояние правой части изображения от левой стороны страницы. |
y0 | Расстояние нижней части изображения от нижней части страницы. |
y1 | Расстояние верхней части изображения от нижней части страницы. |
top | Расстояние между верхом изображения и верхом страницы. |
bottom | Расстояние нижней части изображения от верхней части страницы. |
doctop | Расстояние верха прямоугольника от верха документа. |
srcsize | Исходные размеры изображения в виде кортежа (width, height) . |
colorspace | Цветовая область изображения (например, RGB). |
bits | Количество бит на компонент цвета; например, 8 соответствует 255 возможным значениям для каждого цветового компонента (R, G и B в цветовом пространстве RGB). |
stream | Пиксельные значения изображения в виде объекта pdfminer.pdftypes.PDFStream . |
imagemask | Логическое значение, допускающее значение NULL; если True , «указывает, что данные изображения должны использоваться в качестве трафаретной маски для рисования в текущем цвете». |
mcid | Идентификатор раздела отмеченного контента для этого изображения, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
tag | Тег раздела отмеченного контента для этого изображения, если таковой имеется (в противном случае None ). Экспериментальный атрибут. |
object_type | "изображение" |
pdfminer.six
Если вы передадите параметр pdfminer.six
-handling laparams
в pdfplumber.open(...)
, то словарь .objects
каждой страницы также будет содержать объекты макета более высокого уровня pdfminer.six
, такие как "textboxhorizontal"
.
Инструменты визуальной отладки pdfplumber
могут быть полезны для понимания структуры PDF-файла и объектов, которые были извлечены из него.
PageImage
с помощью .to_image()
Чтобы превратить любую страницу (включая обрезанные) в объект PageImage
, вызовите my_page.to_image()
. При желании вы можете передать один из следующих аргументов ключевого слова:
resolution
: желаемое количество пикселей на дюйм. По умолчанию: 72
. Тип: int
.width
: желаемая ширина изображения в пикселях. По умолчанию: не установлено, определяется resolution
. Тип: int
.height
: желаемая ширина изображения в пикселях. По умолчанию: не установлено, определяется resolution
. Тип: int
.antialias
: использовать ли сглаживание при создании изображения. Установка значения True
создает изображения с менее неровным текстом и графикой, но с большими размерами файлов. По умолчанию: False
. Тип: bool
.force_mediabox
: используйте размеры страницы .mediabox
, а не размеры .cropbox
. По умолчанию: False
. Тип: bool
.Например:
im = my_pdf . pages [ 0 ]. to_image ( resolution = 150 )
Из скрипта или REPL im.show()
откроет изображение в вашей локальной программе просмотра изображений. Но объекты PageImage
также прекрасно сочетаются с блокнотами Jupyter; они автоматически визуализируются как выходные данные ячейки. Например:
Примечание . .to_image(...)
работает должным образом с экземплярами Page.crop(...)
/ CroppedPage
, но не может включать изменения, внесенные с помощью экземпляров Page.filter(...)
/ FilteredPage
.
PageImage
Метод | Описание |
---|---|
im.reset() | Очищает все, что вы нарисовали до сих пор. |
im.copy() | Копирует изображение в новый объект PageImage . |
im.show() | Открывает изображение в локальном средстве просмотра изображений. |
im.save(path_or_fileobject, format="PNG", quantize=True, colors=256, bits=8) | Сохраняет аннотированное изображение в формате PNG. Аргументы по умолчанию преобразуют изображение в палитру из 256 цветов, сохраняя PNG с 8-битной глубиной цвета. Вы можете отключить квантование, передав quantize=False , или настроить размер цветовой палитры, передав colors=N . |
В эти методы можно передать явные координаты или любой PDF-объект pdfplumber
(например, char, line, rect).
Однообъектный метод | Массовый метод | Описание |
---|---|---|
im.draw_line(line, stroke={color}, stroke_width=1) | im.draw_lines(list_of_lines, **kwargs) | Рисует линию из line , curve или кортежа из двух кортежей (например, ((x, y), (x, y)) ). |
im.draw_vline(location, stroke={color}, stroke_width=1) | im.draw_vlines(list_of_locations, **kwargs) | Рисует вертикальную линию по координате x, указанной location . |
im.draw_hline(location, stroke={color}, stroke_width=1) | im.draw_hlines(list_of_locations, **kwargs) | Рисует горизонтальную линию по координате y, указанной location . |
im.draw_rect(bbox_or_obj, fill={color}, stroke={color}, stroke_width=1) | im.draw_rects(list_of_rects, **kwargs) | Рисует прямоугольник из rect , char и т. д. или ограничивающего прямоугольника из 4 кортежей. |
im.draw_circle(center_or_obj, radius=5, fill={color}, stroke={color}) | im.draw_circles(list_of_circles, **kwargs) | Рисует круг по координате (x, y) или в центре char , rect и т. д. |
Примечание. Приведенные выше методы созданы на основе методов Pillow ImageDraw
, но параметры были изменены для обеспечения соответствия номенклатуре SVG fill
/ stroke
/ stroke_width
.
im.debug_tablefinder(table_settings={})
вернет версию PageImage с наложенными обнаруженными линиями (красными), пересечениями (кружками) и таблицами (голубыми).
pdfplumber
может извлекать текст с любой страницы (включая обрезанные и производные страницы). Он также может попытаться сохранить макет этого текста, а также определить координаты слов и поисковых запросов. Объекты Page
могут вызывать следующие методы извлечения текста:
Метод | Описание |
---|---|
.extract_text(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, layout=False, x_density=7.25, y_density=13, line_dir_render=None, char_dir_render=None, **kwargs) | Собирает все символьные объекты страницы в одну строку.
|
.extract_text_simple(x_tolerance=3, y_tolerance=3) | Немного более быстрая, но менее гибкая версия .extract_text(...) с более простой логикой. |
.extract_words(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, keep_blank_chars=False, use_text_flow=False, line_dir="ttb", char_dir="ltr", line_dir_rotated="ttb", char_dir_rotated="ltr", extra_attrs=[], split_at_punctuation=False, expand_ligatures=True, return_chars=False) | Возвращает список всех словесных объектов и их ограничивающих рамок. Слова считаются последовательностями символов, в которых (для «прямых» символов) разница между x1 одного символа и x0 следующего меньше или равна x_tolerance и где doctop одного символа и doctop следующего меньше или равно y_tolerance . (Если x_tolerance_ratio не None , экстрактор использует динамический x_tolerance равный x_tolerance_ratio * previous_character["size"] .) Аналогичный подход применяется для невертикальных символов, но вместо этого измеряются вертикальные, а не горизонтальные расстояния между ними. Изменение keep_blank_chars на True будет означать, что пустые символы рассматриваются как часть слова, а не как пробел между словами. Изменение use_text_flow на True будет использовать базовый поток символов PDF в качестве руководства для упорядочивания и сегментирования слов, а не предварительной сортировки символов по положению x/y. (Это имитирует то, как перетаскивание курсора выделяет текст в PDF-файле; при этом порядок не всегда кажется логичным.) Аргументы line_dir и char_dir сообщают этому методу направление, в котором ожидается чтение строк/символов; допустимые варианты: «ttb» (сверху вниз), «btt» (снизу вверх), «ltr» (слева направо) и «rtl» (справа налево). Аргументы line_dir_rotated и char_dir_rotated аналогичны, но для повернутого текста. Передача списка extra_attrs (например, ["fontname", "size"] ограничит каждое слово символами, которые имеют одно и то же значение для каждого из этих атрибутов, и результирующие словари слов будут указывать эти атрибуты. Установка для split_at_punctuation значения True будет принудительно разбивать токены в знаках препинания, указанных в string.punctuation ; или вы можете указать список разделительных знаков препинания, передав строку, например: split_at_punctuation='!"&'()*+,.:;<=>?@[]^`{|}~' . Если вы не установилиexpand_ligatures expand_ligatures=False , лигатуры, такие как fi будут развернуты на составляющие их буквы (например, , fi ). При передаче return_chars=True к каждому словарю слов будет добавлен список составляющих его символов в виде списка в поле "chars" . |
.extract_text_lines(layout=False, strip=True, return_chars=True, **kwargs) | Экспериментальная функция , возвращающая список словарей, представляющих строки текста на странице. Параметр strip работает аналогично методу Python str.strip() и возвращает text атрибуты без окружающих их пробелов. (Только если layout = True .) Установка return_chars в False исключит отдельные символы символов из возвращаемых текстовых строк. Остальные **kwargs — это те, которые вы должны передать в .extract_text(layout=True, ...) . |
.search(pattern, regex=True, case=True, main_group=0, return_groups=True, return_chars=True, layout=False, **kwargs) | Экспериментальная функция , позволяющая выполнять поиск по тексту страницы, возвращая список всех экземпляров, соответствующих запросу. Для каждого экземпляра объект словаря ответа содержит соответствующий текст, любые совпадения группы регулярных выражений, координаты ограничивающего прямоугольника и сами объекты char. pattern может быть скомпилированным регулярным выражением, некомпилированным регулярным выражением или строкой, не являющейся регулярным выражением. Если regex имеет значение False , шаблон рассматривается как строка, не являющаяся регулярным выражением. Если case имеет False , поиск выполняется без учета регистра. Установка main_group ограничивает результаты определенной группой регулярных выражений в pattern (по умолчанию 0 означает все совпадение). Установка для return_groups и/или return_chars значения False исключит добавление списков совпадающих групп регулярных выражений и/или символов (как "groups" и "chars" в возвращаемые словари). Параметр layout работает так же, как и для .extract_text(...) . Остальные **kwargs — это те, которые вы должны передать в .extract_text(layout=True, ...) . Примечание . Совпадения с нулевой шириной и пробелами отбрасываются, поскольку они (как правило) не имеют явного положения на странице. |
.dedupe_chars(tolerance=1, extra_attrs=("fontname", "size")) | Возвращает версию страницы с удаленными повторяющимися символами — теми, которые имеют тот же текст, позиционирование (в пределах tolerance x/y) и extra_attrs , что и другие символы. (См. выпуск № 71, чтобы понять мотивацию.) |
Подход pdfplumber
к обнаружению таблиц во многом заимствован из магистерской диссертации Ансси Нурминена и вдохновлен Tabula. Это работает следующим образом:
Объекты pdfplumber.Page
могут вызывать следующие методы таблицы:
Метод | Описание |
---|---|
.find_tables(table_settings={}) | Возвращает список объектов Table . Объект Table предоставляет доступ к свойствам .cells , .rows , .columns и .bbox , а также методу .extract(x_tolerance=3, y_tolerance=3) . |
.find_table(table_settings={}) | Аналогично .find_tables(...) , но возвращает самую большую таблицу на странице в виде объекта Table . Если несколько таблиц имеют одинаковый размер (измеряемый количеством ячеек), этот метод возвращает таблицу, ближайшую к верху страницы. |
.extract_tables(table_settings={}) | Возвращает текст, извлеченный из всех таблиц, найденных на странице, представленный в виде списка списков, со структурой table -> row -> cell . |
.extract_table(table_settings={}) | Возвращает текст, извлеченный из самой большой таблицы на странице (см. .find_table(...) выше), представленный в виде списка списков со структурой row -> cell . |
.debug_tablefinder(table_settings={}) | Возвращает экземпляр класса TableFinder с доступом к свойствам .edges , .intersections , .cells и .tables . |
Например:
pdf = pdfplumber . open ( "path/to/my.pdf" )
page = pdf . pages [ 0 ]
page . extract_table ()
Нажмите здесь, чтобы просмотреть более подробный пример.
По умолчанию extract_tables
использует вертикальные и горизонтальные линии страницы (или края прямоугольника) в качестве разделителей ячеек. Но этот метод легко настраивается с помощью аргумента table_settings
. Возможные настройки и их значения по умолчанию:
{
"vertical_strategy" : "lines" ,
"horizontal_strategy" : "lines" ,
"explicit_vertical_lines" : [],
"explicit_horizontal_lines" : [],
"snap_tolerance" : 3 ,
"snap_x_tolerance" : 3 ,
"snap_y_tolerance" : 3 ,
"join_tolerance" : 3 ,
"join_x_tolerance" : 3 ,
"join_y_tolerance" : 3 ,
"edge_min_length" : 3 ,
"min_words_vertical" : 3 ,
"min_words_horizontal" : 1 ,
"intersection_tolerance" : 3 ,
"intersection_x_tolerance" : 3 ,
"intersection_y_tolerance" : 3 ,
"text_tolerance" : 3 ,
"text_x_tolerance" : 3 ,
"text_y_tolerance" : 3 ,
"text_*" : …, # See below
}
Параметр | Описание |
---|---|
"vertical_strategy" | Либо "lines" , "lines_strict" , "text" или "explicit" . См. объяснение ниже. |
"horizontal_strategy" | Либо "lines" , "lines_strict" , "text" или "explicit" . См. объяснение ниже. |
"explicit_vertical_lines" | Список вертикальных линий, которые явно разграничивают ячейки в таблице. Может использоваться в сочетании с любой из вышеперечисленных стратегий. Элементами в списке должны быть либо числа — обозначающие координату x линии на всю высоту страницы — либо объекты line / rect / curve . |
"explicit_horizontal_lines" | Список горизонтальных линий, которые явно разграничивают ячейки в таблице. Может использоваться в сочетании с любой из вышеперечисленных стратегий. Элементами в списке должны быть либо числа — обозначающие координату y линии на всю высоту страницы — либо объекты line / rect / curve . |
"snap_tolerance" , "snap_x_tolerance" , "snap_y_tolerance" | Параллельные линии внутри точек snap_tolerance будут «привязаны» к одному и тому же горизонтальному или вертикальному положению. |
"join_tolerance" , "join_x_tolerance" , "join_y_tolerance" | Сегменты линий на одной и той же бесконечной линии, концы которых находятся в join_tolerance друг к другу, будут «объединены» в один сегмент линии. |
"edge_min_length" | Ребра короче edge_min_length будут отброшены перед попыткой восстановления таблицы. |
"min_words_vertical" | При использовании "vertical_strategy": "text" по крайней мере слова min_words_vertical должны иметь одинаковое выравнивание. |
"min_words_horizontal" | При использовании "horizontal_strategy": "text" по крайней мере слова min_words_horizontal должны иметь одинаковое выравнивание. |
"intersection_tolerance" , "intersection_x_tolerance" , "intersection_y_tolerance" | При объединении ребер в ячейки ортогональные ребра должны находиться в пределах точек intersection_tolerance , чтобы считаться пересекающимися. |
"text_*" | Все настройки с префиксом text_ затем используются при извлечении текста из каждой обнаруженной таблицы. Здесь также действительны все возможные аргументы Page.extract_text(...) . |
"text_x_tolerance" , "text_y_tolerance" | Эти настройки с префиксом text_ также применяются к алгоритму идентификации таблицы, когда используется text стратегия. То есть, когда этот алгоритм ищет слова, он ожидает, что отдельные буквы в каждом слове будут находиться на расстоянии не более чем на text_x_tolerance / text_y_tolerance . |
vertical_strategy
, и horizontal_strategy
принимают следующие параметры:
Стратегия | Описание |
---|---|
"lines" | Используйте графические линии страницы, включая стороны прямоугольных объектов, в качестве границ потенциальных ячеек таблицы. |
"lines_strict" | Используйте графические линии страницы, а не стороны прямоугольных объектов, в качестве границ потенциальных ячеек таблицы. |
"text" | Для vertical_strategy : выведите (воображаемые) линии, соединяющие левый, правый или центр слов на странице, и используйте эти линии в качестве границ потенциальных ячеек таблицы. Для horizontal_strategy то же самое, но с использованием верхних слов. |
"explicit" | Используйте только те линии, которые явно определены в explicit_vertical_lines / explicit_horizontal_lines . |
Часто бывает полезно обрезать страницу — Page.crop(bounding_box)
— прежде чем пытаться извлечь таблицу.
Извлечение таблицы для pdfplumber
было радикально переработано в v0.5.0
и внесло критические изменения.
Иногда PDF-файлы могут содержать формы, включающие входные данные, которые люди могут заполнять и сохранять. Хотя значения в полях формы выглядят как другой текст в PDF-файле, данные формы обрабатываются по-другому. Если вам нужны кровавые подробности, смотрите страницу 671 этой спецификации.
pdfplumber
не имеет интерфейса для работы с данными формы, но вы можете получить к нему доступ, используя обертки pdfplumber
вокруг pdfminer
.
Например, этот фрагмент получит имена и значения полей формы и сохранит их в словаре.
import pdfplumber
from pdfplumber . utils . pdfinternals import resolve_and_decode , resolve
pdf = pdfplumber . open ( "document_with_form.pdf" )
def parse_field_helper ( form_data , field , prefix = None ):
""" appends any PDF AcroForm field/value pairs in `field` to provided `form_data` list
if `field` has child fields, those will be parsed recursively.
"""
resolved_field = field . resolve ()
field_name = '.' . join ( filter ( lambda x : x , [ prefix , resolve_and_decode ( resolved_field . get ( "T" ))]))
if "Kids" in resolved_field :
for kid_field in resolved_field [ "Kids" ]:
parse_field_helper ( form_data , kid_field , prefix = field_name )
if "T" in resolved_field or "TU" in resolved_field :
# "T" is a field-name, but it's sometimes absent.
# "TU" is the "alternate field name" and is often more human-readable
# your PDF may have one, the other, or both.
alternate_field_name = resolve_and_decode ( resolved_field . get ( "TU" )) if resolved_field . get ( "TU" ) else None
field_value = resolve_and_decode ( resolved_field [ "V" ]) if 'V' in resolved_field else None
form_data . append ([ field_name , alternate_field_name , field_value ])
form_data = []
fields = resolve ( resolve ( pdf . doc . catalog [ "AcroForm" ])[ "Fields" ])
for field in fields :
parse_field_helper ( form_data , field )
После запуска этого сценария form_data
представляет собой список, содержащий кортеж из трех элементов для каждого элемента формы. Например, форма PDF с полем города и штата может выглядеть так.
[
['STATE.0', 'enter STATE', 'CA'],
['section 2 accident infoRmation.1.0',
'enter city of accident',
'SAN FRANCISCO']
]
Спасибо @jeremybmerrill за помощь в поддержке приведенного выше кода синтаксического анализа форм.
extract_table
в отчете об изменении и переобучении работников штата Калифорния (WARN). Демонстрирует базовую визуальную отладку и извлечение таблиц.extract_table
в PDF-файлах Национальной системы мгновенной проверки криминального прошлого ФБР. Демонстрирует, как использовать визуальную отладку для поиска оптимальных настроек извлечения таблицы. Также демонстрирует Page.crop(...)
и Page.extract_text(...).
curve
.Page.extract_text(...)
. Несколько других библиотек Python помогают пользователям извлекать информацию из PDF-файлов. В общем, pdfplumber
отличается от других библиотек обработки PDF-файлов сочетанием следующих функций:
Также полезно знать, какие функции не предоставляет pdfplumber
:
pdfminer.six
обеспечивает основу для pdfplumber
. В первую очередь он фокусируется на анализе PDF-файлов, анализе макетов PDF-файлов и позиционировании объектов, а также извлечении текста. Он не предоставляет инструментов для извлечения таблиц или визуальной отладки.
PyPDF2
— это библиотека на чистом Python, «способная разделять, объединять, обрезать и преобразовывать страницы файлов PDF. Она также может добавлять пользовательские данные, параметры просмотра и пароли к файлам PDF». Он может извлекать текст страницы, но не обеспечивает легкий доступ к объектам фигур (прямоугольникам, линиям и т. д.), извлечению таблиц или инструментам визуальной отладки.
pymupdf
существенно быстрее, чем pdfminer.six
(и, следовательно, также pdfplumber
), и может создавать и изменять PDF-файлы, но библиотека требует установки программного обеспечения, отличного от Python (MuPDF). Он также не обеспечивает легкий доступ к объектам фигур (прямоугольникам, линиям и т. д.) и не предоставляет инструментов извлечения таблиц или визуальной отладки.
camelot
, tabula-py
и pdftables
ориентированы в первую очередь на извлечение таблиц. В некоторых случаях они могут лучше подходить для конкретных таблиц, которые вы пытаетесь извлечь.
Большое спасибо следующим пользователям, которые поделились идеями, функциями и исправлениями:
Запросы на включение приветствуются, но сначала отправьте предложение, так как библиотека находится в активной разработке.
Текущие сопровождающие: