Word の同じ横長の表ページの場合、記事全体の向きを変更しないでください。
同じ Word 文書内では、表ページのみを横向きにする必要があります。記事全体を横向きに変更しないでください。この記事では、まずすべてのセクションを作成し、次にインデックスによってターゲット セクションを取得し、方向とページの幅と高さをそれぞれ設定し、保存して再読み込みし、他のセクションが変更されていないことを確認します。
この記事のポイント
・部分横方向はセクションの属性に属するため、対象コンテンツの前後にセクション区切りを挿入する必要があります。 ・横向きに設定する場合は、ページの幅と高さを同時に入れ替える必要があります。方向のみを変更すると、用紙サイズが不正確になり、コンテンツが切り取られます。
- 誤って間違ったセクションオブジェクトを操作することを避けるために、最初にすべてのセクションを作成してから、インデックスによって対象のセクションを取得します。
・保存後、ファイルを再度読み込み、他のセクションの方向やサイズが変更されていないことを確認してください。
- この例では python-docx 0.8.11 以降が必要ですが、すべての実ファイルに対して有効であるとは保証されません。
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
正しい入力シナリオ: 文書には 3 つのセクションが含まれています。最初のセクションは縦書きテキストで、2 番目のセクションには幅の広い表が配置され、3 番目のセクションは縦書きに戻ります。予想される結果は、2 番目のセクションでは orientation が LANDSCAPE であり、page_width が page_height よりも大きく、残りの 2 つのセクションは PORTRAIT のままです。
境界入力 1: セクションが 1 つだけあるドキュメント。水平方向を直接 sections[0] に設定すると、文書全体が水平になります。まず add_section() を呼び出してコンテンツを分割し、次に新しく生成されたセクションを操作する必要があります。
境界入力 2: LANDSCAPE が設定されますが、元の垂直サイズは保持されます。コードは述語として page_width >= page_height を検証する必要があります。
📊 主要な比較: ページ区切りとセクション区切り
| 方法 | ページ方向は載せられますか? | 代表的な用途 | 注意事項 |
|---|---|---|---|
| 改ページ | できない | コンテンツのラッピングのみを制御する | 1ページのみを横向きにする場合には使用できません |
| 次のページのセクション区切り | できる | 部分風景、切り替えマージン | セクションの幅、高さ、方向を個別に設定する必要があります。 |
| 連続セクション区切り | できる | 同じページ内でレイアウトを切り替える | ページを変更しないと視覚的に混乱が生じる可能性があり、手動での判断が必要になります。 |
🎯 どの方法があなたに適していますか?
もしあなたが……
- ターゲット ページの前後にセクション区切りはありません: まずセクションを分割してから、ターゲット セクションの方向を設定します。
- ドキュメントには 1 つのセクションしかなく、部分的に水平にする必要があるだけです: 最初に
add_section()を呼び出します。sections[0]を直接変更しないでください。 - 横向きにすると表が切り詰められる: セクションの左右の余白を確認するか、表の幅を小さくしてください。
- ドキュメントに連続したセクション区切りが含まれています: 次のページのセクション区切りに変更する必要があるかどうかを評価し、手動で確認します。
- ファイルの暗号化、XML 構造の損傷、またはマクロによって動的に生成されたセクション: 最初に形式を手動で修復または変換してください。この記事のコードは適用されません。
❓ よくある質問 (FAQ)
1. 段落または表の属性を設定した後、ページの方向が変わらないのはなぜですか?
段落オブジェクトと表オブジェクトには、レイアウト情報を保存するフィールドがありません。ページ方向はセクション属性に属するため、セクション区切りに対応するセクションを通して設定する必要があります。
2. 方向を LANDSCAPE に設定するだけで十分ですか?
足りない。 page_width と page_height も交換する必要があります。そうしないと、Word を開いたときに用紙サイズが正しく表示されず、PDF をエクスポートするときにコンテンツがトリミングされる可能性があります。
3. 水平方向をセクション[0]に直接設定できないのはなぜですか?
ドキュメントにセクションが 1 つしかない場合、それを変更するとドキュメント全体に影響します。最初に add_section() を使用して、部分横断を独立したセクションに分割する必要があります。
4. ヘッダーとフッターが水平方向にずれている場合はどうすればよいですか?
セクション属性の変更は、ヘッダー リンクのステータスには影響しません。ヘッダーとフッターの間の距離の設定を個別に確認する必要があります。これは独立した問題です。
📝 概要
表ページを横方向のみに作成する鍵は、ターゲット コンテンツを別のセクションに配置し、同時に幅、高さ、方向を入れ替えることです。保存後、他のセクションをもう一度読んで確認してください。コード検証後、WordやPDFにエクスポートして効果を目で確認する必要があります。


