Для одной и той же горизонтальной страницы таблицы в Word не меняйте ориентацию всей статьи.
В том же документе Word только страница таблицы должна быть в альбомной ориентации. Не меняйте всю статью на альбомную ориентацию. В этой статье сначала создаются все разделы, затем извлекается целевой раздел по индексу, задаются направление, ширина и высота страницы соответственно, сохраняются и перечитываются, а также подтверждается, что ни один из других разделов не был изменен.
Когда только определенные страницы в документе Word должны иметь альбомную ориентацию, наиболее распространенной ошибкой является непосредственное изменение всего документа на альбомную ориентацию или поворот таблицы, а затем ее содержимое обрезается. Эта статья предназначена для разработчиков и групп документов, которым необходимо использовать python-docx для автоматической обработки макета Word. В нем объясняется, как изменить только ориентацию страницы целевого раздела.
Ключом к пониманию является различие между разрывами страниц и разрывами разделов. Разрывы страниц управляют только разрывами строк и не влияют на ориентацию страницы, размер бумаги и поля; эти свойства макета привязаны к «разделам». Прочитав эту статью, вы сможете сначала создать все разделы, затем извлечь целевой раздел по индексу, установить направление, ширину и высоту соответственно и перечитать после сохранения, чтобы убедиться, что другие разделы не были изменены. Подробную информацию об API, связанную с разделом, см. на странице Официальная документация разделов python-docx.
Вывод в одном предложении: Word делает страницы таблиц только горизонтальными. Как это установить?
Создайте отдельный раздел только для контента, который должен быть горизонтальным, поменяйте местами ширину и высоту и задайте направление для этого раздела, а остальные разделы оставьте вертикальными.
| твоя ситуация | Рекомендуемые практики | причина |
|---|---|---|
| Нет разрывов разделов до и после целевой страницы. | Сначала используйте add_section() для разделения, затем установите направление. | Атрибуты макета хранятся в разделах. Вы не можете изменить только целевую страницу, не разделяя разделы. |
| Установлен только LANDSCAPE, но ширина и высота не меняются местами. | Поменяйте местами page_width и page_height одновременно. | Простое изменение ориентации приведет к неправильному размеру бумаги, а содержимое может быть обрезано при экспорте PDF. |
| Таблица по-прежнему обрезается после установки альбомной ориентации. | Проверьте левое и правое поля раздела или уменьшите ширину таблицы. | Код не может определить соответствие между формой и бумагой за вас. |
| В документе имеются постоянные разрывы разделов, а ориентация неправильная. | Перейдите к разрыву раздела следующей страницы и вручную подтвердите тип раздела. | Непрерывные разрывы разделов без разрывов страниц могут легко вызвать визуальный беспорядок. |
Разрывы разделов являются настоящим носителем атрибутов макета
В стандарте OpenXML элемент <w:sectPr> определяет макет страницы. Документ может содержать несколько разделов, каждый из которых имеет свою ширину, высоту, ориентацию и поля. Когда вызывается document.add_section(), python-docx создаст новый <w:sectPr> в конце текущего документа, и контент, добавленный после этого, будет принадлежать этому новому разделу.
Если вы попытаетесь изменить направление, изменив стиль абзаца или свойства таблицы, это обычно не сработает, поскольку у этих объектов нет полей для хранения информации о макете.
Логика работы: сначала разделить на разделы, затем взять разделы и, наконец, установить
- Расположите диапазон контента, который должен быть горизонтальным.
- Убедитесь, что этот контент выделен в отдельный раздел и при необходимости разделен с помощью
add_section(). - Сначала создайте все разделы, а затем получите целевой раздел в соответствии с индексом, чтобы не перепутать объект-заглушку, сохраненный перед добавлением раздела, в качестве исходного раздела.
- Поменяйте местами
page_widthиpage_heightдля этого раздела и установите дляorientationзначениеWD_ORIENT.LANDSCAPE. - После сохранения перечитайте файл и проверьте, остались ли неизменными направление, ширина и высота других участков.
Обратите внимание: если установить только orientation без изменения ширины и высоты, Word при открытии будет отображать неправильный размер бумаги. Этот момент неоднократно подчеркивался в данной статье.
Пример автономной композиции
Следующий код создает ввод в памяти. Все данные представляют собой синтетические образцы. Текущие записи используются только для иллюстрации логики вызова API и не являются гарантией всех реальных файлов или эффектов продукта. Зависимая библиотека — python-docx. Пожалуйста, запустите его в закрытой среде проекта. Версия должна поддерживать перечисление WD_ORIENT (0.8.11 и выше).
from docx import Document
from docx.enum.section import WD_ORIENT, WD_SECTION
from io import BytesIO
doc = Document()
doc.add_paragraph("Portrait intro")
doc.add_section(WD_SECTION.NEW_PAGE)
doc.add_paragraph("Landscape middle")
doc.add_section(WD_SECTION.NEW_PAGE)
doc.add_paragraph("Portrait end")
middle = doc.sections[1]
width, height = middle.page_width, middle.page_height
middle.orientation = WD_ORIENT.LANDSCAPE
middle.page_width, middle.page_height = max(width, height), min(width, height)
out = BytesIO()
doc.save(out)
out.seek(0)
restored = Document(out)
assert len(restored.sections) == 3
assert restored.sections[1].orientation == WD_ORIENT.LANDSCAPE
assert restored.sections[1].page_width > restored.sections[1].page_height
assert restored.sections[0].orientation == WD_ORIENT.PORTRAIT
assert restored.sections[2].orientation == WD_ORIENT.PORTRAIT
Правильный сценарий ввода: документ содержит три раздела: первый раздел представляет собой вертикальный текст, второй раздел размещается с широкими таблицами, а третий раздел возвращается в вертикальное положение. Ожидаемый результат: orientation — это LANDSCAPE во втором разделе, page_width больше, чем page_height, а оставшиеся два раздела остаются PORTRAIT.
Первый ввод границы: документ, содержащий только один раздел. Непосредственная установка горизонтального направления на sections[0] приведет к тому, что весь документ станет горизонтальным. Сначала вам следует вызвать add_section(), чтобы разделить содержимое, а затем работать с вновь созданными разделами.
Ввод второй границы: установлен ЛАНДШАФТ, но исходный размер по вертикали сохраняется. Код должен проверять page_width >= page_height как предикат.
📊 Основное сравнение: разрывы страниц и разделов
| Способ | Можно ли перенести направление страницы? | Типичное использование | На что следует обратить внимание |
|---|---|---|---|
| Разрыв страницы | не могу | Управляйте только оберткой контента | Невозможно использовать для создания альбомной ориентации только одной страницы. |
| Разрыв раздела следующей страницы | способный | Частичный ландшафт, переключение полей | Вам необходимо задать ширину, высоту и направление секции отдельно. |
| непрерывный разрыв раздела | способный | Переключение макетов на одной странице | Если вы не измените страницы, это может привести к визуальной путанице и потребует ручного принятия решения. |
🎯 Какой метод подходит вам?
если ты……
– Разрывы разделов до и после целевой страницы отсутствуют: сначала разделите разделы, а затем задайте направление целевого раздела.
- Документ состоит только из одного раздела и должен быть лишь частично горизонтальным: сначала вызовите
add_section(), не изменяйтеsections[0]напрямую. - Таблица обрезается после альбомной ориентации: проверьте левое и правое поля раздела или уменьшите ширину таблицы.
- Документ содержит последовательные разрывы разделов. Оцените, следует ли заменить его на разрыв раздела следующей страницы, и подтвердите вручную.
- Шифрование файлов, повреждение структуры XML или разделы, динамически созданные макросами: сначала исправьте или преобразуйте формат вручную; код в этой статье неприменим.
❓ Часто задаваемые вопросы (FAQ)
1. Почему направление страницы не меняется после настройки свойств абзаца или таблицы?
Объекты абзацев и таблиц не имеют полей для хранения информации о макете. Направление страницы принадлежит атрибуту раздела, поэтому его необходимо задать через раздел, соответствующий разрыву раздела.
2. Достаточно ли просто выставить ориентацию ЛАНДШАФТ?
недостаточно. Также необходимо поменять местами page_width и page_height, иначе при открытии Word размер бумаги будет отображаться некорректно, а при экспорте PDF содержимое может быть обрезано.
3. Почему нельзя напрямую задать горизонтальное направление для разделов[0]?
Если документ содержит только один раздел, его изменение повлияет на весь документ. Частичную трансверсал необходимо сначала разделить на независимые секции с помощью add_section().
4. Что делать, если верхний и нижний колонтитулы смещены по горизонтали?
Изменения атрибутов раздела не влияют на статус ссылки заголовка. Вам необходимо проверить настройки расстояния между верхним и нижним колонтитулом отдельно. Это самостоятельная проблема.
📝 Резюме
Ключ к тому, чтобы сделать страницу таблицы только горизонтальной, — это поместить целевой контент в отдельный раздел и одновременно поменять ширину, высоту и ориентацию. После сохранения перечитайте и проверьте другие разделы. После проверки кода необходимо подтвердить эффект невооруженным глазом после экспорта в Word или PDF.


