#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, и я смог достичь своей цели. Спасибо за ваш ответ, я действительно ценю это.