Чтение файла .docx для извлечения текста вместе со шрифтом и другой информацией о форматировании текста

#javascript #python #ms-word #python-docx #wordprocessingml

Вопрос:

Как указано в вопросе, моя цель-найти библиотеку python для извлечения информации о тексте и шрифтах из файла .docx. Например, для следующего текста: «Привет , мир» Мне нужно уметь читать, что строка hello выделена полужирным шрифтом, а не курсивом, а мир строк не выделен полужирным шрифтом и курсивом. В дополнение к тому, чтобы знать, выделен ли текст жирным шрифтом или курсивом, мне также нужно знать другую информацию, такую как размер, цвет, тип шрифта (например, ariel, times new roman) и т. Д. Мне нужно иметь возможность прочитать весь файл .docx и извлечь информацию.

Я попытался использовать библиотеку python-docx и смог извлечь текст, но не соответствующую информацию о шрифте в файле .docx. например, в следующем коде:

 import docx
doc = docx.Document('cg0002.docx')
for para in doc.paragraphs:
    for run in para.runs:
        font = run.font
        is_bold = font.bold
 

Я бы получил шрифт и is_bold как нет. После дальнейших исследований я узнал, что вы не можете использовать библиотеку для чтения шрифта .docx, но вы должны назначить их самостоятельно. Есть ли какая-либо другая библиотека, которую я могу использовать для достижения своей цели?

Компромиссы, на которые я готов пойти: Я не особенно категоричен в использовании python для решения этой проблемы. Я могу использовать любой другой язык, такой как java, javascript, c/c , powershell и т.д. Я также могу работать с преобразованием документов в другие форматы, такие как pdf, если это облегчает извлечение информации, при условии, что документ остается нетронутым (например, я мог бы попытаться загрузить его в Google docs и использовать appscript, чтобы попытаться извлечь текст, но некоторые шрифты не будут сохранены после просмотра с помощью Google docs, поэтому я не хочу этого делать.

Комментарии:

1. Ваш вопрос предполагает, что все форматирование текста выполняется локальным форматированием (выберите текст, используйте шрифт формата для изменения). Хорошо сконструированные файлы Word используют стили шрифтов, а не локальное форматирование, поэтому ваш код должен проверять применение стилей к тексту, а также получать характеристики стиля. В случае нумерованного или маркированного текста это включает стиль типа плюс стили списка. Таблицы также используют стили таблиц. Ваш проект-это не простой проект.

2. @JohnKorchok совершенно прав. То, о чем вы, по-видимому, просите, — это «эффективное» форматирование символов, которое включает в себя разрешение «каскада» иерархии стилей. Это похоже на то, как работает CSS, где стили находятся в «слоях», и нетривиально вычислить, что применимо к определенному набору текста. В настоящее время нет поддержки API для эффективного форматирования, python-docx поэтому для этого вам придется действовать самостоятельно.

3. @JohnKorchok и сканни, спасибо вам за ваш ответ. Я думаю, что подойду к этому с точки зрения компьютерного зрения. Я предполагаю, что было бы нетрудно написать алгоритм для определения стилей шрифтов со 100% точностью. Я просто надеялся, что если я смогу извлечь эти значения из самого файла, я смогу сэкономить время на обработке, так как мой конечный продукт потенциально придется применять к миллионам документов. Спасибо вам за ваш ответ.

Ответ №1:

Для DocX, возможно, было бы на 100% лучше использовать VBA для сбора подробностей.

Однако «потенциальным» альтернативным путем может быть простое удаление любых переопределений стилей путем экспорта из WordPad в базовый RTF. Затем посмотрите на переопределенные характеристики целевых блоков.

ПРИМЕЧАНИЕ:- в зависимости от конверсии это может быть не на 100% надежным для достижения вашей цели.

Хотя мы можем конвертировать DocX в PDF с помощью WordPad из командной строки, мы не можем конвертировать DocX в RTF без использования макроса VBS, но это другой вопрос.

введите описание изображения здесь
введите описание изображения здесь

Из заголовка мы видим кодовую страницу=1252 и 2057= Английский (Великобритания) Британцы 🙂

Разбивка на глаз bf0fs24lang9 Hello b0i Worlduli0 !ulnonefs22par

 b - Is the start of Bold
f0 - Calibri in the given language (BEWARE here 0 is an index NOT a stop)
fs24 - Is points x 2 so the text here is 12 point
lang9 - I forget at the moment, awaiting correction in comments :-)
 Hello - Has both a leading and trailing space (leading is to be ignored)
b0 - My BAD, boldening STOPS, AFTER the space between the words
i - Start italics (ignore the space before World)
ul - Start underlining
i0 - Stop italics (ignore the space before !)
ulnone - Stop underline (don't ask me why not ul0)
fs22 - I will let you guess the default page font height but by now you know it is not 22

par - THE END, "That's all Folks!" ™
 

P.S.

Я пересмотрел источник, чтобы внести 2 исправления, посмотрите, сможете ли вы внести оба изменения. «Моя» подсказка ко второму приведена выше, но может легко сбить вас с толку при использовании регулярного выражения.

bf0fs22lang9 Hello,i b0 Worlduli0 !ulnonepar

в то время как это должно было, наконец, быть

bf0fs22lang9 Hello,b0 i Worlduli0 !ulnonepar

Комментарии:

1. Извините за поздний ответ. Я только что понял, что забыл принять твой ответ. На самом деле я не знаком с тем, как работает RTF, поэтому я решил воспользоваться вашим первым советом и использовать сценарии vba, и я смог достичь своей цели. Спасибо за ваш ответ, я действительно ценю это.