python-pptx を使って PowerPoint のコアプロパティを表示する・改
先日、python-pptx を使って PowerPoint のコアプロパティを表示する というメモを書きました。 このメモのサンプルに加え、会社
や マネージャ
、ハイパーリンクの基点
という値も取得出来るようにしたものを改めてメモしておきます。
PowerPoint (.pptx) ファイルの構造
テストに利用した PowerPoint ファイルを unzip すると以下の構造になっていました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | ├── [Content_Types].xml
├── _rels
├── docProps
│ ├── app.xml
│ ├── core.xml
│ └── thumbnail.jpeg
└── ppt
├── _rels
│ └── presentation.xml.rels
├── presProps.xml
├── presentation.xml
├── slideLayouts
│ ├── _rels
│ │ ├── slideLayout1.xml.rels
│ │ ├── slideLayout10.xml.rels
│ │ ├── slideLayout11.xml.rels
│ │ ├── slideLayout2.xml.rels
│ │ ├── slideLayout3.xml.rels
│ │ ├── slideLayout4.xml.rels
│ │ ├── slideLayout5.xml.rels
│ │ ├── slideLayout6.xml.rels
│ │ ├── slideLayout7.xml.rels
│ │ ├── slideLayout8.xml.rels
│ │ └── slideLayout9.xml.rels
│ ├── slideLayout1.xml
│ ├── slideLayout10.xml
│ ├── slideLayout11.xml
│ ├── slideLayout2.xml
│ ├── slideLayout3.xml
│ ├── slideLayout4.xml
│ ├── slideLayout5.xml
│ ├── slideLayout6.xml
│ ├── slideLayout7.xml
│ ├── slideLayout8.xml
│ └── slideLayout9.xml
├── slideMasters
│ ├── _rels
│ │ └── slideMaster1.xml.rels
│ └── slideMaster1.xml
├── slides
│ ├── _rels
│ │ └── slide1.xml.rels
│ └── slide1.xml
├── tableStyles.xml
├── theme
│ └── theme1.xml
└── viewProps.xml
|
ファイル |
対象 |
docProps/app.xml |
会社 や マネージャ 、ハイパーリンクの基点 等 |
docProps/core.xml |
コアプロパティ情報 (タイトル 、件名 、作成者 等) |
app.xml の構造
以下は app.xml
のサンプルです。 Manager
、Company
、HyperlinkBase
という値が格納されていることが分かります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 | <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
<TotalTime>1</TotalTime>
<Words>1</Words>
<Application>Microsoft Macintosh PowerPoint</Application>
<PresentationFormat>ワイド画面</PresentationFormat>
<Paragraphs>1</Paragraphs>
<Slides>1</Slides>
<Notes>0</Notes>
<HiddenSlides>0</HiddenSlides>
<MMClips>0</MMClips>
<ScaleCrop>false</ScaleCrop>
<HeadingPairs>
<vt:vector size="6" baseType="variant">
<vt:variant>
<vt:lpstr>使用されているフォント</vt:lpstr>
</vt:variant>
<vt:variant>
<vt:i4>3</vt:i4>
</vt:variant>
<vt:variant>
<vt:lpstr>テーマ</vt:lpstr>
</vt:variant>
<vt:variant>
<vt:i4>1</vt:i4>
</vt:variant>
<vt:variant>
<vt:lpstr>スライド タイトル</vt:lpstr>
</vt:variant>
<vt:variant>
<vt:i4>1</vt:i4>
</vt:variant>
</vt:vector>
</HeadingPairs>
<TitlesOfParts>
<vt:vector size="5" baseType="lpstr">
<vt:lpstr>游ゴシック</vt:lpstr>
<vt:lpstr>游ゴシック Light</vt:lpstr>
<vt:lpstr>Arial</vt:lpstr>
<vt:lpstr>Office テーマ</vt:lpstr>
<vt:lpstr>test1</vt:lpstr>
</vt:vector>
</TitlesOfParts>
<Manager>test1</Manager>
<Company>test2</Company>
<LinksUpToDate>false</LinksUpToDate>
<SharedDoc>false</SharedDoc>
<HyperlinkBase>test3</HyperlinkBase>
<HyperlinksChanged>false</HyperlinksChanged>
<AppVersion>16.0000</AppVersion>
</Properties>
|
サンプルプログラム
現状の python-pptx には app.xml
の情報を直接、読み取る手段は用意されていないようです。 その為、プレゼンテーションファイルの内容を prs.part.package.iter_parts()
で取得し、その中から app.xml
ファイルを探して、それを beautifulsoup4 で XML として解析して必要な値を取り出します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | #!/usr/bin/env python3
import sys
import pptx
import bs4
prs = pptx.Presentation(sys.argv[1])
print("Title : %s" % prs.core_properties.title)
print("Last Modified By : %s" % prs.core_properties.last_modified_by)
print("Revision : %i" % prs.core_properties.revision)
print(
"Modified : %s" % prs.core_properties.modified.strftime("%Y/%m/%d %H:%M:%S")
)
print("Subject : %s" % prs.core_properties.subject)
print("Author : %s" % prs.core_properties.author)
print("Keywords : %s" % prs.core_properties.keywords)
print("Comments : %s" % prs.core_properties.comments)
print(
"Created : %s" % prs.core_properties.created.strftime("%Y/%m/%d %H:%M:%S")
)
print("Category : %s" % prs.core_properties.category)
package_parts = prs.part.package.iter_parts()
for part in package_parts:
if part.partname.endswith("app.xml"):
app_xml = part.blob.decode("utf-8")
soup = bs4.BeautifulSoup(app_xml, "xml")
print("Compnay : %s" % soup.find("Company").get_text())
print("HyperlinkBase : %s" % soup.find("HyperlinkBase").get_text())
print("Manager : %s" % soup.find("Manager").get_text())
|
実行例
実行例は以下の通りです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | # ./sample.py test1.pptx
Title : test1
Last Modified By : test2
Revision : 1
Modified : 2021/12/29 23:16:14
Subject : test3
Author : test4
Keywords : test5
Comments : test6
Created : 2021/12/29 23:15:02
Category : test7
Compnay : test8
HyperlinkBase : test9
Manager : test10
|