質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6683閲覧

python-docxでWordのページ番号を取得したい

mnmnmmmn

総合スコア18

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/08 01:32

編集2021/11/09 00:38

前提・実現したいこと

MS Word文書内における、指定した文字列を検索するプログラムを作成しています。
(grep的な処理)
文字列がヒットした場合、その文字列が文書内の何ページ目にあるかを返したいです。

発生している問題

指定した文字列が存在する段落(Paragraph)を返すことはできたのですが、
ページの指定方法がわかりません。

作成中のソースコード

指定した文字列が存在する段落を返すコードです。

python

1from docx import Document 2 3file = '検索するWord文書' 4s_str= '検索する文字列' 5document = Document(file) 6count = 0 7for para in document.paragraphs: 8 if para.text.find(s_str) > -1: 9 print(count) 10 count += 1

試したこと

公式ドキュメントを見ましたが、該当の情報は見つかりませんでした。
https://python-docx.readthedocs.io/en/latest/index.html
ヘッダー/フッターにページ番号を挿入する方法はあったのですが、
既存の文書から検索する方法がどうしてもわかりません。

補足情報(FW/ツールのバージョンなど)

Windows 10 Pro 54bit
Python 3.8.10
Word for Microsoft 365 MSO 64bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

etherbeg

2021/11/08 12:49 編集

見た目のページの区切りってフォントの大きさや行間の幅、ページの余白、ページサイズ、ヘッダーやフッターのサイズ等々ですぐ変化するので、果たして「ページ番号」というのを静的な情報として持っているのか、それとも印刷や印刷ビューの時に動的に生成されているのかですよね。 実際のワードファイルがどうかはわかりませんが、python-docxのドキュメントやオブジェクトのプロパティをざっと見てみた限りでは、確かに少なくともpython-docxはページ番号の情報は持っていないような感じはします。 確信は持てないので、あくまで感想ということで、こちらにコメントさせていただきました。 ヘッダー/フッターにページ番号を挿入するのってどうやってするのですか?
mnmnmmmn

2021/11/09 00:38

やはりpython-docxでは難しそうですね。 >ヘッダー/フッターにページ番号を挿入するのってどうやってするのですか? →こちら私の勘違いで、python-docx単体ではできませんでした…申し訳ないです。 (一応質問本文も修正いたしました) http://cup.sakura.ne.jp/use_markdown/usepandoc.html#session-ex25 ↑ 代替案としては、こちらで紹介されているように、ページ番号を付加したテンプレートを別に用意してそれを読み込むという方法になろうかと思います。
guest

回答1

0

ベストアンサー

断言はできませんが、できない可能性が高いでしょう。

Wordファイルの構成から考えると、文書のある箇所のページ番号を取得するためには、セクションごとの余白、ヘッダ、フッタ、ページ脚注、文末脚注、文字ごとのフォントサイズ、フォントの種類、セクションの行間設定、個別の行の行間設定など、文書の全てを見渡さなければページ番号の取得はできません。さらに言えば、その文書を開くWORDのバージョンによってもページは異なることがあったと思いますし、使用しているフォントがインストールされていないために代替フォントを使用した場合には同じバージョンのWORDを使ってもページ番号は変わってしまいます。

そういう処理を作り込むというのはWORDを丸ごと作るのと同じだけの手間がかかりますので、python-docxがそこまでできるわけはないだろうと考えます。

ページ情報を使いたければWORDと同じ機能を呼び出して処理するwin32com(pywin32)を使うことをお勧めします。
Python(pywin32)でWordを操作する[10] - Word文書をgrepする(ページ数表示, 行数表示, ワイルドカード展開)を見ればページ番号の取得方法が書かれています。

投稿2021/11/08 12:47

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mnmnmmmn

2021/11/09 00:35

回答ありがとうございます。 大変勉強になりました。 たしかにwin32comならできそうですね! トライしてみます。 参考URLの情報もありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問