pythonで Microsoft Word 書類を grep する

docx2txtはwordファイルからテキストを抽出するライブラリです。

以下はwordファイルから特定の文字を抽出するサンプルです。

import docx2txt

strings = docx2txt.process("000497699.docx")
lines = strings.split("\n")

moji = "厚生"

for line in lines:
    if line.find(moji) >= 0:
        print(line)

対象のwordファイルは厚生労働省のサイトにある、総合研究報告書というファイルを使っています。

以下、出力結果です。

厚生労働科学研究費
 厚生労働行政推進調査事業費
 厚生労働科学研究費
 厚生労働行政推進調査事業費様式A(10)
    厚生労働大臣
 厚生労働科学研究費
 厚生労働行政推進調査事業費
 厚生労働科学研究費
 厚生労働行政推進調査事業費
   上記補助事業について、厚生労働科学研究費補助金等取扱規程(平成10年4月9日厚生省告示第130号)第16条第3項の規定に基づき下記のとおり研究成果を報告します。
  ※規程19条第2項及び第3項に従い、事業完了後5年以内に、その結果又は経過の全部若しくは一部を刊行し、又は書籍、雑誌、新聞等に掲載した場合には、その刊行物又はその別刷一部を添えて厚生労働大臣等に届け出ること。
 研究代表者 厚生 太郎
       厚生太郎
        研究代表者 厚生 太郎 ○○○○○病院長
     厚生労働行政の課題との関連性を含めて記入すること。                                   
           なお、ヒトゲノム・遺伝子解析研究に関する倫理指針(平成25年文部科学省・厚生労働省・経済産業省告示第1号)、人を対象とする医学系研究に関する倫理指針(平成26年文部科学省・厚生労働省告示第3号)、遺伝子治療等臨床研究に関する指針(平成31年厚生労働省告示第48号)、厚生労働省の所管する実施機関における動物実験等の実施に関する基本指針(平成18年6月1日付厚生労働省大臣官房厚生科学課長通知)及び申請者が所属する研究機関で定めた倫理規定等を遵守するとともに、あらかじめ当該研究機関の長等の承認、届出、確認等が必要な研究については、研究開始前に所定の手続を行うこと。

python-docxでtableを結合する

以下では書類の向きを横向きにして2行2列の表を作成し、2行目を結合してそれぞれに画像を貼り付けています。

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT

doc = Document()

section = doc.sections[-1]
new_width, new_height = section.page_height, section.page_width
section.orientation = WD_ORIENT.LANDSCAPE
section.page_width = new_width
section.page_height = new_height

tables = doc.add_table(2, 2)
tables.alignment = WD_TABLE_ALIGNMENT.CENTER

a = tables.cell(1, 0)
b = tables.cell(1, 1)
A = a.merge(b)

p = doc.tables[0].rows[0].cells[0].paragraphs[0]
p.alignment=WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_picture('1.jpg',width=Cm(8.0), height=Cm(6.0))
r.add_break()
r.add_text('風景1')

p = doc.tables[0].rows[0].cells[1].paragraphs[0]
p.alignment=WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_picture('2.jpg',width=Cm(8.0), height=Cm(6.0))
r.add_break()
r.add_text('風景2')

p = doc.tables[0].rows[1].cells[1].paragraphs[0]
p.alignment=WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_picture('3.jpg',width=Cm(8.0), height=Cm(6.0))
r.add_break()
r.add_text('風景3')

doc.add_page_break()

doc.save('test.docx')
結合された表を含むWord文章
結合された表を含むWord文章

結合したセルにアクセスするには、

p = doc.tables[0].rows[1].cells[0].paragraphs[0]

としても良いし、

p = doc.tables[0].rows[1].cells[1].paragraphs[0]

としても良いようです。

また、書類を横向きにするためには

section.orientation = WD_ORIENT.LANDSCAPE

とするだけではダメで、

section.page_width
section.page_height

を書き換えてサイズを変更する必要があります。

python-docxでWORD文章に表を作成して画像とテキストを貼り付ける

以下、サンプルです。

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT

doc = Document()

tables = doc.add_table(rows=3, cols=2)
tables.alignment = WD_TABLE_ALIGNMENT.CENTER

count = 0
for i in range(3):
	for j in range(2):
		count += 1
		fname = str(count) + '.jpg'
		s = '風景' + str(count)
		p = doc.tables[0].rows[i].cells[j].paragraphs[0]
		p.alignment=WD_ALIGN_PARAGRAPH.CENTER
		r = p.add_run()
		r.add_picture(fname,width=Cm(8.0), height=Cm(6.0))
		r.add_break()
		r.add_text(s)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_text('6つの風景')

doc.save('test.docx')
test.docx

python-docx で Microsoft Word を操作する

ワードファイルに余計なマクロを設定することなく大量に画像を貼り付けることができます。

import docx
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = docx.Document()

doc.add_picture('1.jpg', width=Cm(12.00))
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph('駿河湾と夏の富士山')
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_picture('2.jpg', width=Cm(12.00))
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph('駿河湾に沈む夕陽')
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p = doc.add_page_break()

doc.save('test.docx')

test.docx は以下のようになります。

wordドキュメント